Оценка короткого замыкания через оператор AND в PHP
Я пытаюсь улучшить свои навыки кодирования ниндзя h4x, и в настоящее время я смотрю на различные фреймворки, и я нашел пример кода, который довольно трудно найти в Google.
Я смотрю на структуру FUEL, используемую в проекте.
Образец, который я не понимаю,
$data and $this->template->set_global($data);
Что делает ключевое слово and в этой строке кода? Он используется во многих местах фреймворка, и это первое, что я обнаружил, которое использует его.
5 ответов
Это тип " оценки короткого замыкания". and/&&
подразумевает, что обе стороны сравнения должны оценить TRUE
,
Элемент слева от and/&&
оценивается в TRUE/FALSE
и если TRUE
, пункт справа выполнен и оценен. Если левый элемент FALSE
, выполнение останавливается и правая сторона не оценивается.
$data = FALSE;
// $this->template->set_global($data) doesn't get evaluated!
$data and $this->template->set_global($data);
$data = TRUE;
// $this->template->set_global($data) gets evaluated
$data and $this->template->set_global($data);
Обратите внимание, что они не должны быть действительными логическими TRUE/FALSE
, но также могут быть значениями true /false в соответствии с правилами оценки PHP. См. PHP логические документы для получения дополнительной информации о правилах оценки.
Когда вы используете логические операторы, операнды (значение слева и значение справа) оцениваются как логические, поэтому в основном этот код будет делать это более коротким способом:
$o1 = (Bool)$data; // cast to bool
if($o1)
$o2 = (Bool)$this->template->set_global($data); // cast to bool
Редактировать:
Некоторая дополнительная информация:
$a = 33;
isset($a) && print($a) || print("not set");
echo "<br>";
isset($a) AND print($a) OR print("not set");
echo "<br>";
Попробуйте прокомментировать / разложить $a = 33;
, Это разница между &&
а также AND
и между ||
а также OR
(print
возвращает значение true, приведенное к "1" при преобразовании в строку).
Это правильное утверждение и работает так:
Если $data допустим (не '', 0 или NULL), тогда запустите $this->template->set_global($data)
Это быстрый способ сказать:
if ($data)
{
$this->template->set_global($data);
}
Кстати, вы также можете использовать &&
вместо and
PHP поддерживает оба &&
а также and
для логической операции И, и они обычно работают одинаково, за исключением and
имеет немного более низкий приоритет оператора, чем &&
: http://php.net/manual/en/language.operators.precedence.php
Это логический оператор, который означает, что он принимает два операнда и возвращает логическое значение-- true
или же false
, Если оба операнда оцениваются как true
(что угодно, кроме пустой строки, нуля или нуля в PHP) true
в противном случае результат будет false
,
Вот официальные документы PHP на and
оператор: http://www.php.net/manual/en/language.operators.logical.php
<?php
$a = true and false; # FALSE
$b = true and 5; # TRUE
$c = '' and 0; # FALSE
$d = null and true; # FALSE
?>