Присвоение вместо сравнения в выражении if [duplicate]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
13
задан user151841 9 May 2011 в 18:56
поделиться

7 ответов

В 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'];
}
17
ответ дан NikiC 28 August 2018 в 01:14
поделиться

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

0
ответ дан 2ndkauboy 28 August 2018 в 01:14
поделиться

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

var_dump ($var = 'test');

будет отображаться результат «test».

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

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

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

2
ответ дан GordonM 28 August 2018 в 01:14
поделиться

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

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

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

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

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

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

$i=-1;
while( ($i = increment($i)) !== false ) {
    echo( $i."<br />" );
}
1
ответ дан Kevin Nelson 28 August 2018 в 01:14
поделиться

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

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

1
ответ дан RichieHindle 28 August 2018 в 01:14
поделиться

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

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

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

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

Возвращает

b
1
ответ дан Robik 28 August 2018 в 01:14
поделиться

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

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

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

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

3
ответ дан rockerest 28 August 2018 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: