if条件范围内的变量

时间:2020-05-03 03:46:35

标签: php validation if-statement block scoping

关于这个社区的争论并不多,所以我想放弃这个问题。

我有这段代码用于验证$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语句中进行范围界定的理论吗?

2 个答案:

答案 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'));