Как строго установить размер переменной в PHP? - PullRequest
0 голосов
/ 01 сентября 2018

В PHP есть функция с именем settype, которая используется для задания типа переменной. Я знаю, что мы можем определить условия для размера переменной, используя такие функции, как strlen. Но на самом деле, я хочу знать, есть ли такая функция, как settype для установки размера переменной в PHP? как то так:

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

1 Ответ

0 голосов
/ 01 сентября 2018

На самом деле в PHP нет встроенной функции Setsize. , чтобы ответить на ваш вопрос. На самом деле определение размера может быть неоднозначным, как используется в вашем вопросе. Размер может относиться к количеству памяти, выделенной для переменной . Если мы ссылаемся на это определение , то абсолютно невозможно установить фиксированный размер непосредственно в PHP для одной переменной . Размер также может относиться к длине переменной, когда мы говорим о строке или массиве, или к числу цифр в числе. В этом случае также есть нет собственного способа указать фиксированную длину . Однако Вы можете достичь этого, используя пользовательскую функцию или класс .

Фактически мы уже получили пример в PHP изначально, но только для массивов, класс SPLFixedArray , который, как и его название, позволяет нам обрабатывать фиксированные длины массивов.

Так что, если ваше желание примерно равно длине, вы можете создать класс или функцию для обработки присваивания и, таким образом, самостоятельно контролировать длину вашей переменной. Но любое присваивание без этого класса / функции не помешает переменной длине данных .. .: Пример:

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 интерфейс, но вы должны соблюдать ту же логику в разных функциях, которые пытаются присвоить значение данным.

...