2009-07-22 19 views
9

¿Alguien sabe por qué mi require_once() o die(); no está trabajando. Siempre se muestra el error Fatal en lugar del mensaje de error que ingresé en el dado(). Véase más abajo para mi código: pantalla de mensajesrequire_once() o die() no funciona

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

error de la siguiente manera

"Fatal error: controller::require_once() [function.require]: Failed opening required '1' (include_path='....."

en lugar del mensaje ("vaya") Tecla I en

Respuesta

28

o tiene un mayor. precedencia que require/require_once. Por lo tanto php evalúa

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

antes de pasar el resultado a require_once. O toma dos operandos booleanos. ('Abc.php') evalúa a cierto, por tanto, toda la expresión es cierto y

require_once true; 

se invoca. require_once toma una cadena, bool (verdadero) - > cadena = > 1 = >

Failed opening required ' 1'
No es necesario ni muere (...) allí. Si el archivo no se puede leer, require_once detendrá la instancia de php de todos modos.

+4

brillante respuesta. Es necesario destacar que require_once no es una función. Es un operador unario (o constructo de lenguaje, si lo prefiere), por lo que es echo, nuevo, include, etc. –

+0

¡gracias! Aunque es un poco asqueroso que al agregar 'die()' de una manera aparentemente aceptable, arroja un error que PARECE una falla al encontrar el archivo y/o requerirlo -o bien- un error en el archivo incluido ... cuando realmente es un código incorrecto en 'require() o die()' – aequalsb

12

Como include es una construcción del lenguaje especial y no una función, no es necesario un paréntesis para la lista Paremeter:

Because include() is a special language construct, parentheses are not needed around its argument. Take care when comparing return value.

De hecho, tiene un solo parámetro y envolviéndolo en paréntesis adicional no hace cambiar nada:

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

Así que su declaración es idéntica a ésta (la paremter se acaba de terminar):

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

así que tenemos una expresión booleana como parámetro que es bien cierto o falsa. Y que los valores tienen la cadena equivalente de "1" y "" respectivamente:

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

Esa es la razón por la cual obtener este apertura Error requiere '1' mensaje de error.

Pero el uso de paréntesis en el lugar correcto como esto hace que funcione como usted lo desea:

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

Aquí 'abc.php' es claramente el parámetro y la disyunción con die("oops") se realiza en el valor de retorno de include_once. El @ operator es solo para ignorar el mensaje de error includ_once se lanzará si el archivo no existe.

PS: print es también una construcción de lenguaje especial y funciona de la misma manera.

4

Al evaluar:

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

PHP evalúa 'o morir ("vaya")' primero por alguna razón. para forzar a PHP a evaluar el "require_once ('abc.php')" enciérralo entre corchetes.

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

Sin embargo, si "requerir" falla, PHP deja de procesar a fin de utilizar "incluir" en lugar (ver https://stackoverflow.com/a/2418514/1704651). Además, el símbolo @ antes de include_once suprime el mensaje de error de MySQL, por lo que solo se emite el "oops".

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

Funciona como esperaba.

Fuente: Mi propia frustración y https://bugs.php.net/bug.php?id=22342

+0

include o die es lo que yo usé también. Es útil cuando necesita aclarar por qué falta un archivo (por ejemplo, un archivo de configuración que necesita definir) – jocull

+0

Poner @ antes de incluir es probablemente una mala idea. @include hace que se eliminen TODOS los errores en el archivo incluido, y cualquier archivo incluido por ese archivo, lo que hace que la resolución de problemas y el manejo de errores sean una pesadilla. –

Cuestiones relacionadas