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 手册页。 $var
对 foo()
函数是不可见的,所以它内部是未定义的。
【讨论】:
以上是关于PHP 比较运算符和 if (!foo()) 形式的语句的主要内容,如果未能解决你的问题,请参考以下文章