在PHP中,(unset)有什么用途?

在PHP中,(unset)有什么用途?,php,Php,不,我指的不是unset()语言构造,而是(unset)类型caster。从PHP手册: 允许的演员阵容包括: (int),(整数)-强制转换为整数 (布尔),(布尔)-强制转换为布尔 (浮动),(双重),(实际)-转换为浮动 (字符串)-转换为字符串 (阵列)-强制转换为阵列 (对象)-强制转换到对象 (未设置)-强制转换为NULL(PHP5) 网址: 是否有人对此有任何想法(甚至在实际项目中使用过)?目的是强制转换为NULL,就像您在问题中所写的那样: (unset) - cast to

不,我指的不是unset()语言构造,而是(unset)类型caster。从PHP手册:

允许的演员阵容包括:

  • (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
。所以他们很可能不得不避免意外的结果。它将评估
<代码>空值
不会。