在php中评估作业

时间:2011-05-09 17:56:35

标签: php variable-assignment evaluation

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

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

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

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

7 个答案:

答案 0 :(得分:18)

在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'];
}

答案 1 :(得分:3)

因为“没有更多数据”或“错误”返回FALSE,while循环将一直执行,直到它必须停止。

更清晰的写作方式是:

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

但是,这远远不够干净。

答案 2 :(得分:2)

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

var_dump ($var = 'test');

结果将显示“test”。

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

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

但是你当然必须在进入循环之前将缓冲区设置为非假值(通过在循环之前执行fgets,或者指定一个不会显示但不是假的值,例如空串)。

答案 3 :(得分:1)

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

您不需要对您的函数执行任何特殊操作以允许它们像这样使用 - 它是该语言的一个特性。

答案 4 :(得分:1)

fgets未返回false时,它会进行评估。括号中的Assigment返回已分配的值。因此($buffer = fgets($handle, 4096))正在返回fgets值。

  

如果文件指针中没有要读取的数据,则返回FALSE。

简单示例:

$a = 'a';
$b = 'b';
echo ($a = $b);

返回

b

答案 5 :(得分:1)

根据文档以及其他人已经说过的内容,它不会返回布尔值。它只在完成时返回布尔值或者出现错误。

来自PHP手册:

  

返回长度为1的字符串   从指向的文件读取的字节数   处理。

     

如果发生错误,则返回FALSE。

所以,无论如何,关于这样的方法是如何工作没有什么特别的,你可以用这种方式编写自己的方法:

function increment($num) {
    if( $num < 10 ) { return ++$num; }
    return false;
}

$i=-1;
while( ($i = increment($i)) !== false ) {
    echo( $i."<br />" );
}

答案 6 :(得分:0)

===运算符不仅检查函数是否返回可能被视为false的内容(如0,NULL等)。它确实检查了布尔false,如下所示: http://de.php.net/manual/en/language.operators.comparison.php