在PHP中,(unset)有什么用途?
不,我指的不是unset()语言构造,而是(unset)类型caster。从PHP手册: 允许的演员阵容包括:在PHP中,(unset)有什么用途?,php,Php,不,我指的不是unset()语言构造,而是(unset)类型caster。从PHP手册: 允许的演员阵容包括: (int),(整数)-强制转换为整数 (布尔),(布尔)-强制转换为布尔 (浮动),(双重),(实际)-转换为浮动 (字符串)-转换为字符串 (阵列)-强制转换为阵列 (对象)-强制转换到对象 (未设置)-强制转换为NULL(PHP5) 网址: 是否有人对此有任何想法(甚至在实际项目中使用过)?目的是强制转换为NULL,就像您在问题中所写的那样: (unset) - cast to
- (int),(整数)-强制转换为整数
- (布尔),(布尔)-强制转换为布尔
- (浮动),(双重),(实际)-转换为浮动
- (字符串)-转换为字符串
- (阵列)-强制转换为阵列
- (对象)-强制转换到对象
- (未设置)-强制转换为NULL(PHP5)
是否有人对此有任何想法(甚至在实际项目中使用过)?目的是强制转换为NULL,就像您在问题中所写的那样:
(unset) - cast to NULL (PHP 5)
假设您有一个变量$var
,其中isset($var)
为TRUE
。然后可以将该变量强制转换为NULL
:
/**
* @param mixed $var anything
*/
function func($var)
{
if (isset($var))
{
$var = (unset) $var;
}
# the rest of the code expects $var to be NULL
...
}
当然,
$var=NULL
在这里也会这样做,但不进行强制转换。我甚至不知道这是一件事,但似乎目的只是为了实现可用php原语的完整性(NULL就是其中之一)。请注意,这将强制转换数据。。它不写东西
$x = 'foon';
$y = (unset)$x;
var_dump($x, $y) // 'foon', NULL
请注意,x
不是null
,尽管有强制转换
就我所知,没有理由使用
(unset)
而不是只写NULL
。不过,也许其他人可以想出一个更好的答案。我唯一能想到的是将来的某个用例,在这个用例中,类可以定义强制转换操作符的工作方式,例如使用per\u toString()
。类可能被标记为不可为null,因此强制转换为null将引发异常。这与赋值NULL有着本质的区别,尽管它为什么被命名为unset
是个谜。我使用(unset)
强制转换来避免在需要验证和使用许多变量的情况下创建丑陋的if
else
语句,但如果一个变量被认为不正确,并且您不想检查其余变量
例如,您有以下代码:
$variableone = "ffo";
$variabletwo = "obb";
$variablethree = "aar";
if(checkonefailed($variableone))
{
outputsomething();
}
else
{
dosomething($variableone)
if(checktwofailed($variabletwo))
{
outputsomething();
}
else
{
dosomething($variabletwo)
if(checkthreefailed($variablethree))
{
outputsomething();
}
else
{
dosomething($variablethree)
//And so own
}
}
}
您可以这样重写它:
$variableone = "ffo";
$variabletwo = "obb";
$variablethree = "aar";
if(checkonefailed($variableone))
{
outputsomething();
}
//False or check
elseif((unset)(dosomething($variableone))||(checktwofailed($variabletwo)))
{
outputsomething();
}
elseif((unset)(dosomething($variabletwo))||(checkthreefailed($variablethree)))
{
outputsomething();
}
elseif((unset)(dosomething($variablethree))/*or next variable*/)
{
//And so own
}
这个想法来自于Go编程代码
if variableone := "ffo"; checkonefailed(variableone) {
outputsomething()
} else if dosomething(variableone); variabletwo := "obb"; checktwofailed(variabletwo) {
outputsomething()
} else if dosomething(variabletwo); variablethree := "aar"; checkthreefailed(variablethree) {
outputsomething()
} else dosomething(variablethree)
根据:
示例#2使用(未设置)铸造
(unset)casting经常与unset()函数混淆。(未设置)
为完整起见,强制转换仅用作NULL类型强制转换。事实并非如此
改变它正在转换的变量
因此,我的理解是“所有类型都是可强制转换的,null
是一种类型,因此为了保持一致性,我们在null
中添加了强制转换”在PHP7.2.x中,(unset)强制转换现在已经被弃用。所以,不要再使用它了
Ref:查看这家伙的评论,这似乎是另一种解决方法():@Madmartigan:那家伙错了。让我们等待deceze的答复。他解释得有点同意@meze,(unset)$var实际上并没有取消变量的设置$var@Madmartigan:这是因为isset()从文档“确定变量是否已设置且不为null”中为等于null的变量返回true。他的代码将变量设置为null,但它仍然存在于局部范围中。这与unset($hello)不同,unset($hello)将从范围中删除变量(就好像从未定义过一样)。如果您使用了unset($hello),当您在上面使用var_dump()时,您会收到php关于$hello不存在的通知。@meze我已经在链接的bug报告中写了关于这个主题的所有我要说的内容,在这里:依我看,这只是一个相当荒谬的构造。我们都理解它。但问题是。。它是干什么用的?万一有人需要它,比如?我真的想不出任何情况,但是如果输入需要是NULL
,那么我们可以将NULL
作为一个参数传递……首先,if(isset($var))
最好写成if($var!==NULL)
,因为变量总是被设置的,因为它是一个函数参数。其次,如果变量总是假定为null
,那么为什么首先将其作为函数参数?第三,即使这有点道理,只需在函数顶部初始化$var=null
,它也具有完全相同的效果。为什么unset
?我认为他们希望对每种类型进行强制转换,即使是null。但是(null)
有问题,因为这只不过是括号中的null
。所以他们很可能不得不避免意外的结果。它将评估
<代码>空值
不会。