2012-04-09 14 views
5

He estado pensando en usar la asignación de referencia como un atajo para tratar con variables potencialmente indefinidas.¿Es una mala práctica utilizar la asignación de referencia en PHP al manejar variables potencialmente indefinidas?

En otras palabras, en lugar de:

$foo = isset($this->blah['something']['else']) ? $this->blah['something']['else'] : null; 
if (!is_null($foo) && ...){ 
    //do something with $foo 
} 

que podía hacer esto:

$foo = &$this->blah['something']['else']; 
if (!is_null($foo) && ...){ 
    //do something with $foo 
} 

parece más sencillo, ¿verdad? Debido a la manera en que PHP maneja la asignación por referencia, no tengo que preocuparme de que $ this-> blah ['something'] ['else'] esté definido, porque si no existe, se creará automáticamente y establecerá a NULL

¿Está esta estrategia desaprobada?

+0

Yo diría que fue una mala práctica. Esperaría que el segundo formulario levantara un aviso independientemente del operador de referencia, y los avisos deberían aplastarse siempre que sea posible. – halfer

+0

Derecha, ¡excepto que el segundo formulario no generará un aviso! La asignación de PHP por referencia es así de difícil. –

+0

En la primera parte, ¿por qué no considera usar el operador '@' para suprimir deliberadamente los avisos de error? – hohner

Respuesta

0

Si lo que desea es probar si una variable está definida y no es nulo, entonces es mejor que la prueba:

if (! empty($this->blah['something']['else'])) {...} 

esta manera se evita la creación de dos referencias a un valor que ni siquiera podría existir.

En mi opinión, cada vez que crea una nueva referencia al mismo valor, su código se vuelve más difícil de entender de un vistazo.

Si necesita de cero como no-vacío, a continuación, crear una mejor función global de la siguiente manera:

function eempty(& $var) { 
    return empty($var) && $var !== 0; 
} 
+0

Haces algunos puntos buenos pero tu primer ejemplo es incorrecto ... llamar a empty() en una variable no declarada lanzará una advertencia, creo. –

+0

Como se indica en la documentación de PHP: "empty() es el opuesto de la var (booleana), excepto que no se genera ninguna advertencia cuando la variable no está configurada". Ver http://www.php.net/manual/en/function.empty.php –

+1

¡Estoy corregido! Bueno saber. –

0

Yo personalmente creo que podría ser más convencional, pero la asignación de un valor referido como ese me parece un poco redundante. Me quedaría con el operador ternario más comúnmente utilizado en su situación. A menudo es mucho más claro de entender. Por supuesto, debe seguir su semántica personal lo más cerca posible.

Cuestiones relacionadas