[PHP] Short-circuited boolean evaluation

kruzer25

In PHP 3.0 boolean evaluation is short-circuited. This means that in an expression like (1 || test_me the function test_me would not be executed since nothing can change the result of the expression after the 1.
This is a minor compatibility issue, but may cause unexpected side-effects.
Это, конечно, всё очень хорошо, но мне интересно, будет ли работать код типа
if(!class_exist("core",false) && (!(include_once("core.class.php" || !class_exist("core",false { die("Cannot load class \"core\"") }

(то есть, в котором встречаются вызовы функций, влияющих на глобальные переменные - как include_once) так, как подразумевается - если класса нет и не удалось подключить файл или после подключения файла класса по-прежнему нет, выйти. То есть, не свернётся ли это a&&(b||a) в a? И документировано ли это, то есть, не изменится ли завтра поведение интерпретатора в таких случаях?

Andbar

require/include/require_once/include_once - это тебе не обычные функции
из мануала:
<?php
// won't work, evaluated as include'vars.php') == 'OK' i.e. include('')
if (include('vars.php') == 'OK') {
echo 'OK';
}

// works
if include 'vars.php') == 'OK') {
echo 'OK';
}
?>

artimon

Почитай внимательнее мануал про include/require.
И всё равно не делай так. Лучше распиши нормально, потом проще работать будет…

kruzer25

Просто первый пост поправить забыл.
Конечно, вопрос в том, оба ли раза будет выполнена проверка на существование класса.

Andbar

имхо, проверки именно сокращенные. Я часто делаю в одном IF'е сначала проверку на существовании ключа в массиве, а потом обращаюсь к этому ключу без @, при чем такая практика ни разу не привела к появлению каких-либо сообщений в логах (я не сторонник маскировать нотайсы).

kruzer25

То, что они сокращённые, следует из цитаты в первом посте.
Вопрос в том, не решит ли php сократить "сложное выражение" (типа a&&(b||a в b - это немного другое.
Оставить комментарий
Имя или ник:
Комментарий: