【问题标题】:How to strictly set size for a variable in PHP?如何在 PHP 中严格设置变量的大小?
【发布时间】:2018-09-01 16:53:01
【问题描述】:

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

setsize($var, 10);  #for example: size of $var is equal to 10 characters.

【问题讨论】:

  • 据我所知,您必须创建它们,您当然可以键入提示函数,但据我所知,我无法指定 10 个字符的字符串(至少在函数签名)我现在唯一能想到的声音甚至接近的是array_pad和str_pad,正如你提到的,比较像strlen

标签: php function size strlen


【解决方案1】:

其实 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 接口,但您必须在尝试为数据赋值的不同函数中尊重相同的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2018-10-02
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多