如何在PHP中严格设置变量的大小?

问题描述 投票:0回答:1

在PHP中,有一个名为settype的函数,用于设置变量的类型。我知道我们可以使用像strlen这样的函数来定义变量大小的条件。但实际上,我想知道是否有像settype这样的函数来设置PHP中变量的大小?这样的事情:

setsize($var, 10);  #for example: size of $var is equal to 10 characters.
php function size strlen
1个回答
0
投票

实际上PHP中没有Setsize本机函数。回答你的问题。实际上,在你的问题中使用的大小的定义可能是模糊的。大小可以指为变量分配的内存量。如果我们参考这个定义,绝对没有办法直接在PHP中为单个设置固定大小变量。当我们谈论字符串或数组或数字中的数字时,大小也可以指变量的长度。在这种情况下,也没有本地方式来指定固定长度。但是,您可以使用自定义函数或类来实现此目的。

事实上,我们已经在PHP本身获得了一个示例,但仅用于数组,与其名称相似的SPLFixedArray class允许我们处理固定长度的数组。

因此,如果您的需求只是长度,您可以构建一个类或函数来处理赋值,从而自己控制变量的长度。但是没有此类/函数的任何赋值都不会阻止可变长度的数据...:示例:

class fixedLength{
    protected $data,$length;
    public function __construct($data,$length){
        if(!is_int($length)) 
            throw new InvalidArgumentException('the length must be an integer ,'.gettype($length).' given');
        $this->length=$length;
        if(is_array($data))
        {
            while(count($data)>$length)
            {
                array_pop($data); 
            }
             $this->data=$data;
        }
        elseif(is_string($data))
        {
            $this->data=substr($data,0,$length);
        }
        elseif(is_int($data))
        {
            $this->data=(int)substr(strval($data),0,$length);
        }
        elseif(is_float($data))
        {
            $this->data=(float)substr(strval($data),0,$length);
        }
        else
        {
            throw new InvalidArgumentException('Can\'t handle '.gettype($data).' type');

        }

    }

    public function __get($name)
    {
        return strtolower($name)==='data'?$this->data:false;    
    }

    public function __set($name,$value)
    {
        if(strtolower($name)!=='data')
            return false;   
        if(is_array($value))
        {
            while(count($value)>$this->length)
            {
                array_pop($value); 
            }
            $this->data=$value;
        }
        elseif(is_string($value))
        {
            $this->data=substr($value,0,$this->length);
        }
        elseif(is_int($value))
        {
            $this->data=(int)substr(strval($value),0,$this->length);
        }
        elseif(is_float($value))
        {
            $this->data=(float)substr(strval($value),0,$this->length);
        }
        else
        {
            throw new InvalidArgumentException('Can\'t handle '.gettype($value).' type');       
        }

    }

}

然后在您的代码中,您可以:

$int=new fixedLength(98565,3);//will keep 985
$int->data=189999;// will keep 189
var_dump($int->data);//output 189

当然这个例子非常基本,因为它只处理赋值。在数组的情况下,你可以实现ArrayAccess接口,但你必须在尝试为数据赋值的不同函数中遵循相同的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.