2011-05-11 11 views
5

especificaciones rápidos:devuelto nulo por referencia a través de __get()

PHP 5.3 
error_reporting(-1) // the highest 

estoy usando el truco __get() por referencia al acceso mágicamente elementos de la matriz arbitraria de profundidad en un objeto.

Ejemplo rápido:

public function &__get($key){ 
    return isset($this->_data[$key]) 
     ? $this->_data[$key] 
     : null; 
} 

Esto no funciona como cuando el $key no está definida, se trata de volver null por referencia, que por supuesto lanza Only variable references should be returned by reference ... He intentado modificar de la siguiente manera:

public function &__get($key){ 
    $null = null; 
    return isset($this->_data[$key]) 
     ? $this->_data[$key] 
     : $null; 
} 

aún así no funciona, sin embargo, estoy suponiendo que la fijación de $null a null esencialmente unset() s es.

¿Qué puedo hacer? ¡Gracias!


Sólo pensé que podría promover esta cuestión, ya que es poco relevante (magia PHP y referencias); __callStatic(), call_user_func_array(), references, and PHP 5.3.1. Todavía tengo que encontrar una respuesta ... además de modificar el núcleo de PHP.

Respuesta

19

Esto no tiene nada que ver con null, sino más bien el operador ternario:

reescribirlo con un if/else no va a lanzar el aviso:

public function &__get($key) 
{ 
    $null = null; 
    if (isset($this->_data[$key])) { 
     return $this->_data[$key]; 
    } else { 
     return $null; 
    } 
} 

operadores ternarios no pueden dar lugar a referencias . Solo pueden devolver los valores .

+1

Interesante. Gracias ** webbiedave **; ¿Por qué el operador ternario causa el error? – Dan

+2

Información impresionante en la edición allí ** webbiedave **; no sabía eso sobre los operadores ternarios. Ciertamente lo comprometeré con la memoria. Ojalá pudiera ** + 2 **. – Dan

+3

+1 Para una solución al problema específico y la educación. –

3

Tuve este problema, pero terminé dándome cuenta de que no debería devolver nulo cuando no se encontró la clave, pero arrojó una excepción (porque estaba accediendo a un atributo desconocido después de todo).

Pero tal vez eso no es lo que quieres hacer, solo quería compartir eso.

+0

Gracias ** Matthieu **; Lo consideré, sin embargo, creo que devolver 'null' será mi mejor apuesta en estas circunstancias. – Dan

4

¿Por qué devolver null explícitamente? Si $key no existe en $this->_data, ¿devolverá NULL?

Recomiendo usar lo siguiente y ajustar su lógica en el otro extremo. Probablemente ya estés buscando null ahora. Puede cambiarlo a empty() o alguna otra variante. O use excepciones como sugiere Matthieu.

public function &__get($key){ 
    return $this->_data[$key]; 
} 
+0

Por golly! La respuesta más simple queda oscurecida por el uso excesivo de 'isset' según las" mejores prácticas ". Gracias ** Jason McCreary **! – Dan

+0

No defiendo el desuso de 'isset()'. Pero teniendo en cuenta su lógica y la naturaleza dinámica de PHP, esto logra lo mismo. Sin embargo, puede informar un "Aviso" para las claves que no existen. Deberías echar un vistazo a la ** respuesta de ** webbiedave ** si esto te molesta. –

+0

No recibí ningún aviso.¿'Error_reporting (-1)' excluye algo? Leí que cubre todos los niveles de informes, incluso futuros seguros. – Dan

Cuestiones relacionadas