关于这个社区的争论并不多,所以我想放弃这个问题。
我有这段代码用于验证$params['full_name']
:
$params = ["full_name"=>"John Doe"];
$full_name = $flag ? null : ( ( $tmp_name = trim(strip_tags((string)@$params['full_name']))
&& (strlen($tmp_name) > 3 && strlen($tmp_name) < 30)
) ? $tmp_name : out('The full name must be 3-30 characters', 'Invalid full name'));
尽管$params['full_name"]
的填充正确,但出现运行时错误:
<b>Notice</b>: Undefined variable: tmp_name
为什么会这样?我只是错过了在if
语句中进行范围界定的理论吗?
答案 0 :(得分:2)
是导致问题而不是范围的延迟评估的顺序。如果将&&
更改为and
,则顺序将相反,并且代码可以正常运行。
由于左边的赋值运算符,因此&&
的右侧基本上优先于左侧,因此在评估右侧时该变量不存在。使用and
将使左边首先得到评估,因为它的优先级低于赋值运算符,从而消除了问题。
顺便说一句。您的代码中的任何地方都没有if
语句。您拥有的是三元表达式。
答案 1 :(得分:1)
该代码不是很易读或难以维护。 PHP 7具有IFFY,因此我建议以这种方式重写它:
$full_name = $flag
? null
: (function($params) {
$tmp_name = trim(strip_tags((string)@$params['full_name']));
return (strlen($tmp_name) > 3 and strlen($tmp_name) < 30)
? $tmp_name
: out('The full name must be 3-30 characters', 'Invalid full name');
})($params);
可以使您的代码生效。问题是操作的优先级。 &&
运算符的优先级高于赋值运算符,因此在这种情况下,在评估逻辑&&
之前不会完成对$ tmp_name的赋值。 the operators chart中对此进行了说明。
要强制首先执行分配,您必须将分配包装在另一组括号中。
就我个人而言,我不想不必围绕这样的问题编写代码,但是由于您想要解释,所以这里是固定版本:
$full_name = $flag ? null : ((($tmp_name = trim(strip_tags((string)@$params['full_name'])))
&& (strlen($tmp_name) > 3 && strlen($tmp_name) < 30))
? $tmp_name
: out('The full name must be 3-30 characters', 'Invalid full name'));