Оценка короткого замыкания через оператор 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
?>
Другие вопросы по тегам