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】:

在条件上下文中(例如whileif),(x = y) 既是赋值又是表达式。它返回被分配的值。

你不需要对你的函数做任何特殊的事情就可以让它们像这样使用 - 这是语言的一个特性。

【讨论】:

以上是关于php中赋值的评估的主要内容,如果未能解决你的问题,请参考以下文章

Python中的多重赋值和评估顺序

php如何赋值

php中smarty怎么赋值变量到模板

对象赋值在PHP中到底是不是引用?

01PHP 引用赋值和传递赋值

对象赋值在PHP中到底是不是引用?