PHP 比较运算符和 if (!foo()) 形式的语句

Posted

技术标签:

【中文标题】PHP 比较运算符和 if (!foo()) 形式的语句【英文标题】:PHP comparison operators and statements of the form if (!foo()) 【发布时间】:2012-05-30 13:17:54 【问题描述】:

这是我的小脚本,通过编写它我了解到我不知道 php 如何处理变量...

<?php 
$var = 1;

echo "Variable is set to $var <br />";

if (!foo()) echo "Goodbye";

function foo()

    echo "Function should echo value again: ";

    if ($var == 1)
    
        echo "\$var = 1 <br />";
        return true;
    

    if ($var == 2)
    
        echo "\$var = 0 <br />";
        return false;
    
     
?>

所以,这就是 我认为这个脚本的解释方式:

语句if (!foo) 将运行foo()。如果函数返回false,它也会在结尾回显“再见”。

函数foo() 将检查是$var == 1 还是2(对数据类型没有严格要求)。如果为 1,它将回显“函数应再次回显值:1”,如果为 2,它将回显相同但数字为 2。

出于某种原因both foo() 中的 if 语句被传递(我知道这一点,因为如果我将第一个 if 语句更改为 if ($var != 1),它会传递为 true,甚至如果我声明 $var = 1.

这里发生了什么?我以为我把这一切都搞砸了,现在我觉得我只是倒退了:/

【问题讨论】:

我主要看到范围问题:php.net/manual/en/language.variables.scope.php php.net/manual/en/language.variables.scope.php 很多人会建议global,就像我刚刚粘贴的那个链接一样,但是请为自己节省几个月的时间走错路,避免global 像瘟疫一样。 global 有它的位置,但不是在这里,而且它经常被错误地使用。 @Dagon 我还没有看到它在 PHP 中正确使用过:p. 【参考方案1】:

函数不知道$var 是什么。您必须将其传入,或使其全局化:

function foo() 
  global $var;
  /* ... */

或者

$var = 1;
if ( !foo( $var ) ) echo "Goodbye";

function foo ( $variable ) 
  /* Evaluate $variable */

顺便说一句,避免全局变量几乎总是更好。我鼓励你走后一条路,而是将值传递给函数体。

【讨论】:

天哪。我读过关于变量作用域的文章,但我仍然完全忘记了它。【参考方案2】:

我强烈建议您阅读Variable scope 手册页。 $varfoo() 函数是不可见的,所以它内部是未定义的。

【讨论】:

以上是关于PHP 比较运算符和 if (!foo()) 形式的语句的主要内容,如果未能解决你的问题,请参考以下文章

不等于 != 和 !== 在 PHP

PHP的<>运算符[重复]

php7新特性的理解和比较

php 中 三元运算和 IF语句 运行速度

PHP 中的动态比较运算符

PHP 中的 !== 比较运算符是啥意思?