如何严格设置 PHP 中变量的大小?
How to strictly set size for a variable in PHP?
在PHP中有一个函数,叫做settype
,用来设置一个变量的类型。我知道我们可以使用 strlen
等函数定义变量大小的条件。但实际上,我想知道是否有像 settype
这样的函数来设置 PHP 中变量的大小?像这样:
setsize($var, 10); #for example: size of $var is equal to 10 characters.
实际上 PHP. 中没有 Setsize 本机函数来回答您的问题。
事实上,大小的定义可能是模棱两可的,因为在您的 question.The 中使用大小可以参考 为变量分配的内存数量 。如果我们参考这个定义 绝对没有办法直接在PHP中为单个变量设置固定大小。大小也可以指字符串或数组时变量的长度或数字number.In 这种情况下的数字也没有 指定固定长度的本机方法 。
但是,您可以使用 自定义函数或 class .
来实现此目的
事实上,我们已经在 PHP 中得到了一个原生的示例,但仅限于数组,SPLFixedArray class 顾名思义,它允许我们处理固定长度的数组。
因此,如果您的需求只是关于长度,您可以构建一个 class 或一个函数来处理赋值,从而控制变量的长度 yourself.But 任何没有此 class/function 的赋值不会阻止可变长度的数据......:
示例:
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
当然,这个示例非常基础,因为它只处理 assignation.In 数组的情况,您可以实现 ArrayAccess
接口,但您必须遵守尝试为数据赋值的不同函数中的相同逻辑。
在PHP中有一个函数,叫做settype
,用来设置一个变量的类型。我知道我们可以使用 strlen
等函数定义变量大小的条件。但实际上,我想知道是否有像 settype
这样的函数来设置 PHP 中变量的大小?像这样:
setsize($var, 10); #for example: size of $var is equal to 10 characters.
实际上 PHP. 中没有 Setsize 本机函数来回答您的问题。 事实上,大小的定义可能是模棱两可的,因为在您的 question.The 中使用大小可以参考 为变量分配的内存数量 。如果我们参考这个定义 绝对没有办法直接在PHP中为单个变量设置固定大小。大小也可以指字符串或数组时变量的长度或数字number.In 这种情况下的数字也没有 指定固定长度的本机方法 。 但是,您可以使用 自定义函数或 class .
来实现此目的事实上,我们已经在 PHP 中得到了一个原生的示例,但仅限于数组,SPLFixedArray class 顾名思义,它允许我们处理固定长度的数组。
因此,如果您的需求只是关于长度,您可以构建一个 class 或一个函数来处理赋值,从而控制变量的长度 yourself.But 任何没有此 class/function 的赋值不会阻止可变长度的数据......: 示例:
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
当然,这个示例非常基础,因为它只处理 assignation.In 数组的情况,您可以实现 ArrayAccess
接口,但您必须遵守尝试为数据赋值的不同函数中的相同逻辑。