2010-11-10 3 views
5

Эй, ребята :) Нужна помощь. Я в настоящее время изучаю структуру ZEND и наткнулся на это в index.php:Этот синтаксис 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')); 
} 

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

+0

Это первый раз, когда я вижу этот синтаксис. – Shoe

ответ

5

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

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

+0

Я думаю, вы имеете в виду «в случае, если первый операнд« false ». В противном случае это будет '&&' вместо '||'. – netcoder

+0

@netcoder: Спасибо, я стою исправлено. –

+0

@Andre: Добро пожаловать в stackoverflow! Это не редкость получить много ответов быстро, так как все мы здесь конкурируем за репутацию :-) –

0

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

0

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

0

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

2

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

0

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

2

Да. Однако он основан на the way PHP implements boolean evaluation и не должен рассматриваться как идиоматическая конструкция. Это почти наверняка будет работать в будущих выпусках PHP, но я бы все же отменил этот синтаксис, поскольку ему не хватает выразительности.

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

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

left_expression BOOLEAN_OPERATOR right_expression;

где BOOLEAN_OPERATOR является logical operator, ||, например.

Поскольку выражения OR вычисляются как истинные, как только один из их операндов оценивается в 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, право не оценивается.
+0

Я не могу согласиться с тем, что в такой идиоме не хватает выразительности. Именно такие идиомы делают Perl таким гибким и выразительным языком. –

Смежные вопросы