2009-07-23 18 views
5

Hoy me encontré con un comportamiento muy extraño en algunos de nuestros códigos PHP. Tenemos una clase para tratar con archivos. Es algo como esto:palabra reservada no listada?

class AFile { 

//usual constructor, set and get functions, etc. 
//... 

    public function save() { 
    //do some validation 
    //... 

    if($this->upload()) { //save the file to disk 
     $this->update_db(); //never reached this line 
    } 
    } 

    private function upload() { 
    //save the file to disk 
    //... 
    return ($success) ? true : false; 
    } 
} 

que parecía bastante normal para nosotros, pero la función $ this-> carga() nunca volvieron otra cosa que NULL. Verificamos que se estaba ejecutando la función correcta. Nos hicimos eco de su valor de retorno antes de que regresara. Intentamos solo devolver un valor verdadero o incluso una cadena. Todo estaba saliendo bien. Pero $ this-> upload todavía evaluado a NULL. Además, no había nada en los registros y ERROR_ALL está activado.

En exasperación hemos cambiado el nombre de la función a foo_upload. De repente todo funcionó. "cargar" no está en la lista de PHP reserved words. ¿Alguien tiene alguna idea de por qué una función de clase llamada "cargar" fallaría?

+0

¿Pusiste un eco dentro de la función de carga? –

+0

¿Podría estar siendo anulado en alguna parte? – Greg

+0

@ Chacha: Pusimos un eco dentro de la función de carga. Dio los valores esperados. @Greg: la clase AFile no tiene hijos (todavía) por lo que sus métodos no deben ser anulados. – dnagirl

Respuesta

1

Una forma de obtener nula cuando "llamando" carga sería si tuviera esto (intentar acceder a una propiedad inexisting):

if($a = $this->upload) { // => NULL 
    $this->update_db(); //never reached this line 
} 
var_dump($a); 

en lugar de esto (de OP) (tratando de llamar a un método existente):

if($a = $this->upload()) { // => true or false 
    $this->update_db(); //never reached this line 
} 
var_dump($a); 

¿Ha comprobado que no olvida la ()?

Si no esta lo es, tratar con error_reporting ajustado a E_ALL, y la visualización de los errores:

ini_set('display_errors', true); 
error_reporting(E_ALL); 

(que dijiste "ERROR_ALL está en", así que no sé que es lo que quería decir)

+0

lo siento, quise decir error_reporting (E_ALL). Los paréntesis están presentes y no hay objetos vars con el mismo nombre. Intentamos capturar el resultado de $ this-> upload() en $ var como sugieres. No hizo la diferencia. – dnagirl

+0

ok :-(realmente interesado en saber la respuesta, entonces! –

2

Asegúrese de que la declaración de devolución al final del método de carga sea la única declaración de devolución en ese método.

+0

Es. Pero ese es un muy buen punto. – dnagirl

Cuestiones relacionadas