require_once () или die () не работают - PullRequest
13 голосов
/ 22 июля 2009

Кто-нибудь знает, почему мои require_once () или die (); не работает. Всегда отображается фатальная ошибка вместо сообщения об ошибке, которое я ввожу в die (). Смотрите мой код ниже:

require_once ('abc.php') or die("oops");

Отображение сообщения об ошибке, как показано ниже

"Неустранимая ошибка: controller :: require_once () [function.require]: сбой открытия необходим '1' (include_path = '....."

вместо сообщения ( "упс" ) Я ввожу.

Ответы [ 3 ]

30 голосов
/ 22 июля 2009

или имеет более высокий приоритет, чем require / require_once. Поэтому php оценивает

('abc.php') or die("oops")

перед передачей результата в require_once. Или принимает два логических операнда. ('abc.php') оценивается как true , поэтому все выражение равно true и

require_once true;

вызывается. require_once принимает строку, bool (true) -> string => 1 =>

Требуется сбой при открытии ' 1 '
Вам не нужен там или умрите (...). Если файл не может быть прочитан require_once все равно остановит экземпляр php.
13 голосов
/ 22 июля 2009

Поскольку include - это специальная языковая конструкция, а не функция, ей не требуется повторение для списка параметров:

Поскольку include() - это специальная языковая конструкция, скобки вокруг ее аргумента не нужны. Будьте внимательны при сравнении возвращаемого значения.

На самом деле, он имеет только один параметр, и перенос его в дополнительные скобки ничего не меняет:

1 ≡ (1) ≡ ((1)) ≡ (((1))) ≡…

Итак, ваше утверждение идентично этому (паремтер только что завернут):

require_once (('abc.php') or die("oops"));

Итак, в качестве параметра у нас есть логическое выражение: true или false . И эти значения имеют строковый эквивалент "1" и "" соответственно:

var_dump((string) true === "1");
var_dump((string) false === "");

По этой причине Не удалось открыть, требуется сообщение об ошибке '1' .

Но использование круглых скобок в нужном месте делает это так, как вы хотите:

(@include_once 'abc.php') or die("oops");

Здесь 'abc.php' явно является параметром, и дизъюнкция с die("oops") выполняется для возвращаемого значения include_once. Оператор @ просто игнорирует сообщение об ошибке, которое выдает includ_once, если файл не существует.

PS: print также является специальной языковой конструкцией и работает аналогично.

7 голосов
/ 30 сентября 2012

При оценке:

require_once ('abc.php') or die("oops");

PHP почему-то сначала вычисляет 'OR die ("упс") ". заставить PHP вычислить «require_once ('abc.php')» и заключить его в скобки.

(require_once ('abc.php')) OR die("oops");

Однако, если «require» завершается неудачно, PHP останавливает обработку, поэтому вместо этого используйте «include» (см. https://stackoverflow.com/a/2418514/1704651).). Кроме того, символ @ перед include_once подавляет сообщение об ошибке из MySQL, поэтому выводится только «oops».

(@include_once ('abc.php')) OR die("oops");

Работает как положено.

Источник: Мое собственное разочарование и https://bugs.php.net/bug.php?id=22342

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...