правильный синтаксис PHP? - PullRequest
       11

правильный синтаксис PHP?

5 голосов
/ 10 ноября 2010

Привет, ребята :) Нужна помощь.В настоящее время я изучаю фреймворк ZEND и наткнулся на это в index.php:

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

Это то же самое, что и?:

if(!defined('APPLICATION_PATH')){
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
}

Я никогда не сталкивался с этим типомсокращенный синтаксис перед ...

Ответы [ 7 ]

5 голосов
/ 10 ноября 2010

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

Проверьте эту статью: http://en.wikipedia.org/wiki/Short-circuit_evaluation

2 голосов
/ 10 ноября 2010

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

Вот краткое объяснение того, почему этот синтаксис работает:

Булевы выражения в PHP имеют вид:

left_expression BOOLEAN_OPERATOR right_expression;

, где BOOLEAN_OPERATOR - логический оператор , например , ||.

Поскольку выражения OR имеют значение true, как только один из их операндов оценивается в true, интерпретатор PHP может прекратить вычисление, как только он обнаружит операнд, который оценивается в true.

В этом случае, если defined('APPLICATION_PATH') имеет значение true, define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')) не будет оцениваться. Если defined('APPLICATION_PATH') оценивается как false, PHP должен оценить define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')).

Так что всякий раз,

  • левое выражение оценивается как ложное, правое вычисляется.
  • левое выражение оценивается как true, правое не оценивается.
2 голосов
/ 10 ноября 2010

Функционально, да, это то же самое. Функция defined возвращает логическое значение, поэтому она использует оценку короткого замыкания для обозначения «либо это определено, либо ИЛИ выполнить это определение».

0 голосов
/ 10 ноября 2010

Да. Помните, что оператор "или" || оценивается как "ленивый" - если первая часть оценивается как "ИСТИНА", то вторая часть не выполняется, потому что ее результат не повлияет на оператор в целом. То же самое касается && - если первая часть ЛОЖЬ, вторая не будет запущена.

0 голосов
/ 10 ноября 2010

Вы поняли идею правильно. Большинство императивных операторов в PHP возвращают логические значения, которые можно использовать для короткого замыкания. Даже те, которые возвращают void (эквивалентно null / false), могут использоваться таким же образом.

0 голосов
/ 10 ноября 2010

Да. PHP ленив и, если есть логическое или оператор, он остановится после того, как первый вернёт значение true.

0 голосов
/ 10 ноября 2010

Это называется коротким замыканием. ИЛИ (||) оценит вторую часть, только если первая часть ложна. Аналогично, AND (&&) может использоваться для оценки второй части, только если первая часть истинна.

...