我有一个关于php的'基础'问题。在fgets
的示例代码中,它将此代码段作为读取文件内容的示例:
while (($buffer = fgets($handle, 4096)) !== false) {
echo $buffer;
}
语句($buffer = fgets($handle, 4096))
如何具有值?这是$buffer
的作业+评价吗?我的意思是,它如何获得它的价值?这有名字吗?我注意到它使用了严格的比较,所以所有赋值都评估为布尔值true或false?
如果我想编写一个可以这样处理的函数,除了在某些条件下返回false之外,我是否必须做一些特殊的事情?
答案 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)
在条件的上下文中(例如while
或if
),(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