在php中评估作业

use*_*841 14 php evaluation variable-assignment

我有一个关于php的'基础'问题.在示例代码中fgets,它将此代码段作为读取文件内容的示例:

while (($buffer = fgets($handle, 4096)) !== false) {
    echo $buffer;
}
Run Code Online (Sandbox Code Playgroud)

声明($buffer = fgets($handle, 4096))如何具有价值?这是一种作业+评价$buffer吗?我的意思是,它如何获得它的价值?这有名字吗?我注意到它使用了严格的比较,所以所有赋值都评估为布尔值true或false?

如果我想编写一个可以这样对待的函数,除了在某些条件下返回false之外,我是否必须做一些特殊的事情?

Nik*_*kiC 18

在PHP中,赋值是一个表达式,即它返回一个值.$buffer = fgets($handle, 4096)将首先分配值$buffer,然后返回指定的值.

所以,基本上,你可以写:

$buffer = fgets($handle, 4096);
while ($buffer !== false) {
    echo $buffer;

    $buffer = fgets($handle, 4096);
}
Run Code Online (Sandbox Code Playgroud)

在这里,您将在单独的一行上进行分配.因为在这种情况下您需要复制赋值,所以首选循环条件中的赋值.

PS:while循环中赋值的最常见示例可能是从mysql中获取行:

while ($row = mysql_fetch_assoc($result)) {
    echo $row['firstname'] . ' ' . $row['lastname'];
}
Run Code Online (Sandbox Code Playgroud)


Gor*_*onM 5

当您在 PHP 中进行赋值时,赋值会返回所分配的值。这允许您评估条件、循环或其他表达式中的赋值。

var_dump ($var = 'test');
Run Code Online (Sandbox Code Playgroud)

这会导致“test”被分配给 $var,并且还会显示新分配的 $var 值。

上面的代码示例在同一个操作中执行赋值和测试,这是一种很常见的程序员简写。fgets() 从打开的文件返回一行,如果没有行返回,则返回 false。你可以做

while ($buffer !== false) {
    echo $buffer;
    $buffer = fgets($handle, 4096);
}
Run Code Online (Sandbox Code Playgroud)

但是您当然必须在进入循环之前将 buffer 设置为非 false 值(通过在循环之前执行 fgets,或者分配一个不会显示但不是 false 的值,例如空字符串)。

或者你可以进一步简化:

while ($buffer = fgets($handle, 4096) !== false) {
    echo $buffer;
}
Run Code Online (Sandbox Code Playgroud)