оценка задания в php - PullRequest
14 голосов
/ 09 мая 2011

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

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

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

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

Ответы [ 7 ]

18 голосов
/ 09 мая 2011

В 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'];
}
3 голосов
/ 09 мая 2011

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

Более понятный способ записи:

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

Но это далеко не так чисто.

2 голосов
/ 09 мая 2011

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

var_dump ($var = 'test');

результат будет "тест" будет отображаться.

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

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

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

1 голос
/ 09 мая 2011

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

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

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

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

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

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

$i=-1;
while( ($i = increment($i)) !== false ) {
    echo( $i."<br />" );
}
1 голос
/ 09 мая 2011

Эвакуируется, пока fgets не возвращается false. Назначение в скобках возвращает значение, которое было присвоено. Таким образом, ($buffer = fgets($handle, 4096)) возвращает fgets значение.

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

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

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

Возвращает

b
1 голос
/ 09 мая 2011

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

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

0 голосов
/ 09 мая 2011

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

...