Кто-нибудь знает, почему мой require_once () или die (); не работает. Это всегда отображается Fatal error вместо сообщения об ошибке, которое я вставляю в die (). См. Ниже мой код:
require_once ('abc.php') or die("oops");
Отобразится сообщение об ошибке:
«Неустранимая ошибка: контроллер :: require_once () [function.require]: Не удалось открыть окно« 1 »(include_path = '….."
вместо сообщения ( «oops» ) я вхожу.
или имеет более высокий приоритет, чем require / require_once. Поэтому php оценивает
('abc.php') or die("oops")
перед передачей результата require_once. Или принимает два булевых операнда. ('abc.php') оценивается как true, поэтому все выражение истинно и
require_once true;
вызывается. require_once принимает строку, bool (true) -> string => 1 =>
Неверное открытие необходимо « 1 »
Вам не нужно или умереть (…). Если файл не может быть прочитан, require_once все равно остановит экземпляр php.
Поскольку include
– это специальная языковая конструкция, а не функция, ей не требуется paranthesis для списка пареметров:
Потому что
include()
– специальная языковая конструкция, круглые скобки не нужны вокруг аргумента. Будьте внимательны при сравнении возвращаемого значения.
На самом деле он имеет только один параметр и обертывание его в дополнительные круглые скобки ничего не меняет:
1 ≡ (1) ≡ ((1)) ≡ (((1))) ≡ …
Таким образом, ваше утверждение идентично этому (паремер только что завернут):
require_once (('abc.php') or die("oops"));
Таким образом, мы имеем логическое выражение как параметр, который является либо истинным, либо ложным . И эти значения имеют строковый эквивалент "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
будет includ_once
, если файл не существует.
PS: print
также является специальной конструкцией языка и работает одинаково.
При оценке:
require_once ('abc.php') or die("oops");
По какой-то причине PHP сначала оценивает «ИЛИ умереть» («oops»). чтобы заставить 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