Альтернатива ключевому слову 'or' в PHP - PullRequest
5 голосов
/ 02 февраля 2012

Прямо сейчас у меня есть следующий код:

stream_wrapper_register("var", "VariableStream")
    or die("Failed to register protocol");

И я хочу сделать дополнительные вещи перед смертью на случай сбоя функции. Так что возник этот вопрос:

Как работает ключевое слово 'или'?

Во многих SO вопросах или ответах я видел людей, создающих функции, например:

function doStuff() {
    header('HTTP/1.1 500 Internal Server Error');
    die("Failed to register protocol");
}

stream_wrapper_register("var", "VariableStream")
    or doStuff();

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

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

if (!stream_wrapper_register("var", "VariableStream") {
    header('HTTP/1.1 500 Internal Server Error');
    die("Failed to register protocol");
}

Ответы [ 5 ]

9 голосов
/ 02 февраля 2012

Оператор с «или» работает, потому что PHP-интерпретатор достаточно интеллектуален: поскольку соединение «или» имеет значение true, если первое из них истинно, он прекращает выполнение оператора, когда первыйправда.

Представьте себе следующий (PHP) код:

function _true()  { echo "_true";  return true;  }
function _false() { echo "_false"; return false; }

теперь вы можете связывать вызовы функций и видеть в выходных данных, что происходит:

_true() or _true() or _true();

скажет вам только«_true», поскольку цепочка заканчивается после того, как первый из них был истинным, остальные два никогда не будут выполнены.

_false() or _true() or _true();

выдаст "_false_true", потому что первая функция возвращает false, а интерпретатор продолжается.

То же самое работает с "и"

Вы также можете сделать то же самое с "и", с той разницей, что цепочка "и" законченакогда произойдет первое «ложь»:

_false() and _true() and _true();

отобразит «_false», потому что там результат уже завершен и больше не может быть изменен.

_true() and _true() and _false();

напишет "_true_true_false".

Поскольку большинство функций показывают свой успех, возвращая «1» в случае успеха и 0 при ошибке, вы можете делать такие вещи, как function() or die().Но некоторые функции (в php довольно редко) возвращают «0» в случае успеха и! = 0 для обозначения конкретной ошибки.Тогда вам, возможно, придется использовать function() and die().

5 голосов
/ 02 февраля 2012
a or b

логически эквивалентно

if (!a) {
    b
}

Так что ваше решение в порядке.

2 голосов
/ 02 февраля 2012

Два синтаксиса эквивалентны, и это просто вопрос стиля / предпочтения кодирования относительно того, какой вы используете. Лично мне не нравится <statement> or die(...), так как в большинстве случаев читать труднее.

2 голосов
/ 02 февраля 2012

Это точно так же, поскольку stream_wrapper_register() возвращает логическое значение.

0 голосов
/ 27 января 2013

Имеется оператор "ИЛИ". знак ||

следовательно, в качестве примера рассмотрим:

<?php
$count = NULL;

if ($count == 0 || $count == NULL) {
        echo "\nNo Value!\n";
        var_dump($count);
    } else {
        echo "\nSome Value";
    }
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...