2012-03-02 6 views
28

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

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

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

+1

'or' может использоваться для комбинирования * выражений *, а не * операторов *. И это иногда полезно из-за его более низкого приоритета оператора (по сравнению с назначением). Btw, ваши блоки if отсутствуют фигурные скобки. Не смотрите на ярлыки синтаксиса, пока не освоите это. – mario

+1

Кудрявые скобки не нужны для условностей, за которыми следует одно утверждение. – Andrew

+2

Да, да; синтаксис языка позволяет это. Он выглядит дилетантским и, как правило, неодобрительно. – mario

ответ

14

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

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

+5

Вы также должны смотреть на приоритет как '$ fp = fopen ($ filepath," w ") или die();' отличается от '$ fp = fopen ($ filepath," w ") || die(); ' –

+1

Чтобы добавить дополнительную информацию к вышесказанному: первый оператор (используя' или ') выглядит, если первое выражение' $ fp = fopen ($ filepath, "w") 'возвращает false (или что-то, что PHP считает равным false, например 'null' или' 0'). Если и только если это так, он выполняет второй оператор 'die()'. Вторая делает то же самое, но обычно должна использоваться только в контексте 'if'. – Thomas

3

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

+0

Технически он проверяет, возвращает ли первое выражение логическое значение false, а затем с булевыми выражениями shortcut оно выполнит второе выражение. Если первое выражение возвращает значение, отличное от ложного, то булевские выражения shortcut означают, что нет необходимости выполнять второе выражение –

5

or всего лишь boolean сравнение.

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

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

0

Он может быть использован как || но не имеет одинаковый приоритет: http://www.php.net/manual/en/language.operators.precedence.php

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

3

'или' в 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)); 

или умереть() трюк является очень плохим выбором по нескольким причинам:

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

    5. Это предотвращает любые попытки очистки. Это просто заканчивает сценарий внезапно.

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

[1]: http://www.phpfreaks.com/blog/or-die-must-dieenter code here

5

Это ловкий трюк, унаследованный от некоторого PHP предшественника, основанный на том, что PHP довольно бойко не будет оценивать любое выражение, продолжающей или, если первый один вернулся верно:

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

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

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

8

Давайте просто скажем, что:

$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(); 

Это просто важно старшинства.