оценка задания в php

У меня есть своего рода «базовый» вопрос о php. В примере кода для fgets он имеет этот фрагмент в качестве примера чтения содержимого файла:

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

Как получается, что оператор ($buffer = fgets($handle, 4096)) может иметь значение? Это своего рода назначение + оценка $buffer ? Я имею в виду, как он получает свою ценность? Есть ли имя для этого? Я замечаю, что он использует строгое сравнение, поэтому все присваивания оцениваются логическим значением true или false?

Если бы я хотел написать функцию, которую можно было бы обработать таким образом, должен ли я сделать что-нибудь особенное, кроме возврата false при определенных условиях?

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

Поскольку FALSE возвращается для «no more data» или «error» while цикл while будет выполняться только до тех пор, пока он не остановится.

Более четкий способ написания:

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

Но это не так просто.

Когда вы выполняете задание в PHP, присваивание возвращает значение, которое было назначено. Это позволяет вам оценить назначение в условных выражениях или циклах или других выражениях.

 var_dump ($var = 'test'); 

результатом будет «тест».

В приведенном выше примере кода выполняется назначение и тест в одной и той же операции, что довольно условно. fgets () возвращает строку из открытого файла или false, если нет строки для возврата. Вы могли бы сделать

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

но вы, конечно, должны установить буфер в значение, отличное от false, перед входом в цикл (путем выполнения fgets перед циклом или назначения значения, которое не будет отображаться, но не является ложным, например пустая строка).

В контексте условия (например, while или if ) (x = y) является как присваиванием, так и выражением. Он возвращает значение, которое назначается.

Вам не нужно делать что-то особенное для ваших функций, чтобы позволить им быть такими, как это – это особенность языка.

Он убеждает, что fgets не возвращает false . Присвоение в скобках возвращает значение, которое было назначено. Итак ($buffer = fgets($handle, 4096)) возвращает значение fgets .

Если в указателе файла больше нет данных, возвращается FALSE.

Простой пример:

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

Возвращает

 b 

В документации, а также о том, что уже сказали другие, она не возвращает логическое значение. Он возвращает только boolean, когда это делается, или есть ошибка.

Из руководства PHP:

Возвращает строку длиной до 1 байта, считанную из файла, на который указывает дескриптор.

Если возникает ошибка, возвращается FALSE.

Итак, во всяком случае, нет ничего особенного в том, как этот метод работает, вы можете написать свой собственный метод следующим образом:

 function increment($num) { if( $num < 10 ) { return ++$num; } return false; } $i=-1; while( ($i = increment($i)) !== false ) { echo( $i."<br />" ); } 

Оператор === не только проверяет, возвращает ли функция что-то, что может считаться ложным (например, 0, NULL и т. Д.). Он действительно проверяет логическое значение false как вы можете прочитать здесь: http://de.php.net /manual/en/language.operators.comparison.php