Оценка задания в php
У меня есть своего рода "основы" вопроса о php. В примере кода fgets
он имеет этот фрагмент в качестве примера чтения содержимого файла:
while (($buffer = fgets($handle, 4096)) !== false) {
echo $buffer;
}
Как получается, что оператор ($buffer = fgets($handle, 4096))
может иметь значение? Это своего рода назначение + оценка $buffer
? Я имею в виду, как он получает свою ценность? Есть ли имя для этого? Я замечаю, что он использует строгое сравнение, поэтому все присваивания оцениваются логическим значением true или false?
Если бы я хотел написать функцию, которую можно было бы обработать таким образом, должен ли я сделать что-нибудь особенное, кроме возврата false при определенных условиях?
Ответы
Ответ 1
В 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'];
}
Ответ 2
Поскольку FALSE возвращается для "no more data" или "error", цикл while
будет выполняться только до тех пор, пока он не остановится.
Более понятный способ записи:
$buffer = fgets($handle, 4096);
while( $buffer !== false )
{
echo $buffer;
$buffer = fgets($handle, 4096);
}
Но это не так чисто.
Ответ 3
Когда вы выполняете задание в PHP, присваивание возвращает значение, которое было назначено. Это позволяет вам оценить назначение в условных выражениях или циклах или других выражениях.
var_dump ($var = 'test');
будет отображаться результат "test".
В приведенном выше примере кода выполняется назначение и тест в одной и той же операции, что довольно широко распространено в сокращении программиста. fgets() возвращает строку из открытого файла или false, если нет строки для возврата. Вы могли бы сделать
while ($buffer !== false) {
echo $buffer;
$buffer = fgets($handle, 4096);
}
но вам, разумеется, необходимо установить буфер в значение, отличное от false, перед входом в цикл (путем выполнения fgets перед циклом или назначения значения, которое не будет отображаться, но не является ложным, например, пустым строка).
Ответ 4
В контексте условия (например, while
или if
) (x = y)
является одновременно назначением и выражением. Он возвращает значение, которое назначается.
Вам не нужно делать что-либо особенное для ваших функций, чтобы они могли использоваться так: это особенность языка.
Ответ 5
Он убегает, пока fgets
не возвращает false
. Присвоение в скобках возвращает значение, которое было назначено. Поэтому ($buffer = fgets($handle, 4096))
возвращает значение fgets
.
Если в указателе файла больше нет данных, возвращается FALSE.
Простой пример:
$a = 'a';
$b = 'b';
echo ($a = $b);
Возвращает
b
Ответ 6
В документации, а также о том, что уже сказали другие, она не возвращает логическое значение. Он возвращает только логическое значение, когда оно было сделано, или есть ошибка.
Из руководства PHP:
Возвращает строку длиной до 1 байты, считанные из файла, на который указывает ручка.
Если возникает ошибка, возвращается FALSE.
Итак, в любом случае нет ничего особенного в том, как работает такой метод, вы можете написать свой собственный метод следующим образом:
function increment($num) {
if( $num < 10 ) { return ++$num; }
return false;
}
$i=-1;
while( ($i = increment($i)) !== false ) {
echo( $i."<br />" );
}
Ответ 7
Оператор ===
не только проверяет, возвращает ли функция что-то, что может считаться ложным (например, 0, NULL и т.д.). Он действительно проверяет логическое false
, как вы можете прочитать здесь: http://de.php.net/manual/en/language.operators.comparison.php