php中赋值的评估
Posted
技术标签:
【中文标题】php中赋值的评估【英文标题】:evaluation of assignment in php 【发布时间】:2011-08-21 21:20:00 【问题描述】:我有一个关于 php 的“基础”问题。在fgets
的示例代码中,它有这个 sn-p 作为读取文件内容的示例:
while (($buffer = fgets($handle, 4096)) !== false)
echo $buffer;
($buffer = fgets($handle, 4096))
这个语句怎么能有值呢?是不是$buffer
的赋值+评价?我的意思是,它如何获得它的价值?有这个名字吗?我注意到它使用严格的比较,所以所有的赋值都评估为布尔值是真还是假?
如果我想编写一个可以这样处理的函数,除了在某些条件下返回 false 之外,我是否需要做一些特别的事情?
【问题讨论】:
【参考方案1】:当您在 PHP 中进行赋值时,赋值返回被赋值的值。这允许您在条件或循环或其他表达式中评估赋值。
var_dump ($var = 'test');
这会导致将“test”分配给 $var,并显示新分配的 $var 值。
上面的代码示例在同一个操作中进行赋值和测试,这是一种很常见的程序员简写。 fgets() 从打开的文件中返回一行,如果没有要返回的行,则返回 false。你可以这样做
while ($buffer !== false)
echo $buffer;
$buffer = fgets($handle, 4096);
但是您当然必须在进入循环之前将缓冲区设置为非假值(通过在循环之前执行 fgets 或分配一个不会显示但不是假的值,例如空字符串)。
或者您可以进一步简化:
while ($buffer = fgets($handle, 4096) !== false)
echo $buffer;
【讨论】:
偶然发现了这个答案并想补充:根据运算符优先级 (php.net/manual/en/…),!==
的绑定比 =
强,所以在最后一个示例中,$buffer
将变为 @ 987654328@ 如果fgets
成功而不是返回的字符串。因此,它应该是($buffer = fgets($handle, 4096)) !== false
,就像在 OP 中一样。【参考方案2】:
根据文档以及其他人已经说过的内容,它并不总是返回布尔值。它仅在完成或出现错误时返回布尔值。
来自 PHP 手册:
返回一个长度不超过 - 1 的字符串 从指向的文件中读取的字节数 处理。
如果发生错误,返回 FALSE。
所以,无论如何,这样的方法的工作原理并没有什么特别之处,您可以这样编写自己的方法:
function increment($num)
if( $num < 10 ) return ++$num;
return false;
$i=-1;
while( ($i = increment($i)) !== false )
echo( $i."<br />" );
【讨论】:
【参考方案3】:在 PHP 中,赋值是一个表达式,即它返回一个值。 $buffer = fgets($handle, 4096)
会先将值赋值给$buffer
,然后返回赋值的值。
所以,基本上,你可以这样写:
$buffer = fgets($handle, 4096);
while ($buffer !== false)
echo $buffer;
$buffer = fgets($handle, 4096);
在这里,您将在单独的行上分配作业。因为在那种情况下你需要重复赋值,所以循环条件中的赋值是首选。
PS:while 循环中最常见的赋值示例可能是从 mysql 中获取行:
while ($row = mysql_fetch_assoc($result))
echo $row['firstname'] . ' ' . $row['lastname'];
【讨论】:
所以在示例代码 sn-p 中,它起作用的原因是因为fgets
可以返回false
,这会将false
分配为$buffer
的值,这反过来会是评估作业的结果吗?
@user151841:是的,这正是原因;)
另请注意,您的情况下的严格比较更多地与函数结果有关,而不是与循环条件有关。在这种情况下,您可能会从 fgets
函数中得到一个结果,该函数可能被解释为 false(例如空字符串),您可能只想检查它是否返回布尔值 false。【参考方案4】:
===
运算符不仅检查函数是否返回可能被视为错误的值(如 0、NULL 等),它还真正检查布尔值 false
,您可以在此处阅读:http://de.php.net/manual/en/language.operators.comparison.php
【讨论】:
【参考方案5】:因为“没有更多数据”或“错误”返回 FALSE,所以while
循环将一直执行,直到它必须停止。
更清晰的写作方式是:
$buffer = fgets($handle, 4096);
while( $buffer !== false )
echo $buffer;
$buffer = fgets($handle, 4096);
但这远没有那么干净。
【讨论】:
【参考方案6】:它在 fgets
未返回 false
时进行评估。括号中的赋值返回已经赋值的值。所以($buffer = fgets($handle, 4096))
正在返回fgets
值。
如果文件指针中没有更多数据要读取,则返回 FALSE。
简单示例:
$a = 'a';
$b = 'b';
echo ($a = $b);
返回
b
【讨论】:
【参考方案7】:在条件上下文中(例如while
或if
),(x = y)
既是赋值又是表达式。它返回被分配的值。
你不需要对你的函数做任何特殊的事情就可以让它们像这样使用 - 这是语言的一个特性。
【讨论】:
以上是关于php中赋值的评估的主要内容,如果未能解决你的问题,请参考以下文章