PHP "или" Синтаксис - PullRequest
       32

PHP "или" Синтаксис

35 голосов
/ 02 марта 2012

Я много видел это: $fp = fopen($filepath, "w") or die(); Но я не могу найти никакой реальной документации по этому "или" синтаксису. Понятно, что он делает, но могу ли я его использовать где угодно? И должно ли это сопровождаться die()? Есть ли какие-то предостережения относительно использования or, когда вы могли бы использовать что-то вроде

if (file_exists($filepath))
   $fp = fopen($filepath,"r");
else
   myErrMessage();

Я знаю, что это кажется глупым вопросом, но я не могу найти какие-либо жесткие и быстрые правила для этого. Спасибо.

Ответы [ 8 ]

15 голосов
/ 02 марта 2012

Это логический оператор и может использоваться в любом логическом выражении.

http://php.net/manual/en/language.operators.logical.php

12 голосов
/ 15 июля 2014

Скажем так:

$result = first() || second();

будет оценивать:

if (first()) {
    $result = true;
} elseif (second()) {
    $result = true;
} else {
    $result = false;
} 

в то время как:

$result = first() or second();

будет оценивать до:

if ($result = first()) {
    // nothing
} else {
    second();
}

Другими словами, вы можете рассмотреть:

$result = first() || second();

$result = (first() || second());

и

$result = first() or second();

быть:

($result = first()) || second();

Это просто вопрос приоритета.

6 голосов
/ 02 марта 2012

Это хитрый трюк, унаследованный от некоторого предшественника PHP, основанный на том факте, что PHP довольно умно не будет оценивать любое выражение после ИЛИ, если первое вернуло значение true:

function a($ret){
    echo "FOO";
    return $ret;
}
function b($ret){
    echo "BAR";
    return $ret;
}

$result = (a(true) OR b(true));

будет распечатывать толькоFOO, означает, что b () даже не были выполнены.

5 голосов
/ 02 марта 2012

or просто делает логическое сравнение.

То, что возвращает fopen(), может рассматриваться как такое логическое значение, потому что оно возвращает FALSE, если оно терпит неудачу (и другое значение, если нет).

Если произойдет сбой, оператор вычисляется справа, и поэтому вызывается функция die().

3 голосов
/ 02 марта 2012

«ИЛИ» в PHP похоже на C-подобный синтаксис (||)

<?php 
if( ($a==1 || $a==2) && ($b==3 || $b==4) && ($c==5 || $c==6) ) { 
     //do that something here. 
} 
?>

«ИЛИ», о котором вы говорите, - это просто трюк в следующих состояниях:Пример:

$result = mysql_query('SELECT foo FROM bar', $db) or die('Query failed: ' . mysql_error($db));

Трюк or die () очень плохой выбор по нескольким причинам:

  1. Это не очень хороший способ представить пользователю сообщение об ошибке.
  2. Вы не можете поймать ошибку любым способом.
  3. Вы не можете зарегистрировать ошибку.
  4. Вы не можете контролировать, должна ли она выводиться на экран или нет.Это нормально делать в среде разработки, но, конечно, не в рабочей среде.

    5.Это мешает вам делать какие-либо очистки.Он просто внезапно завершает работу сценария.

Ссылка: [введите описание ссылки здесь] [1]

[1]: http://www.phpfreaks.com/blog/or-die-must-dieenter кодздесь

3 голосов
/ 02 марта 2012

По сути, это означает, что «если первая команда не выполнена, выполните вторую команду».В вашем примере, если PHP не может открыть файл, он завершит работу сценария (die()).

1 голос
/ 02 марта 2012

Его можно использовать так же, как вы бы использовали ||как логическое ИЛИ http://php.net/manual/en/language.operators.logical.php

0 голосов
/ 02 марта 2012

Может использоваться как ||, но не имеет того же приоритета: http://www.php.net/manual/en/language.operators.precedence.php

Приоритет оператора указывает, насколько «тесно» он связывает два выражения вместе. Например, в выражении 1 + 5 * 3 ответ 16, а не 18, потому что оператор умножения ("*") имеет более высокий приоритет, чем оператор сложения ("+"). Скобки могут быть использован для принудительного приоритета, если это необходимо. Например: (1 + 5) * 3 оценивает до 18.

...