2011-01-12 10 views
72

Me estoy haciendo la advertencia: Call-time pass-by-reference has been deprecated para las siguientes líneas de código:advertencia PHP: Llamada a tiempo el paso por referencia ha quedado en desuso

function XML() { 
    $this->parser = &xml_parser_create(); 
    xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false); 
    xml_set_object(&$this->parser, &$this); 
    xml_set_element_handler(&$this->parser, 'open','close'); 
    xml_set_character_data_handler(&$this->parser, 'data'); 
} 
function destruct() { 
    xml_parser_free(&$this->parser); 
} 
function & parse(&$data) { 
    $this->document = array(); 
    $this->stack = array(); 
    $this->parent = &$this->document; 
    return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL; 
} 

¿Qué causa y cómo solucionarlo?

+0

Ref: [Referencia - ¿Qué significa este error en PHP?] (Http://stackoverflow.com/q/12769982/367456) – hakre

+0

relacionados página del manual: [por Referencia ] (http://php.net/manual/en/language.references.pass.php) – Palec

Respuesta

142

Eliminar & de &$this en todas partes, no es necesario. De hecho, creo que puede eliminar & en todas partes en este código, no es necesario en absoluto.

larga explicación

PHP permite pasar variables de dos maneras: "por valor" y "referencia". Primera forma ("por valor"), no se puede modificarlas, otra segunda forma ("referencia") se puede:

 function not_modified($x) { $x = $x+1; } 
    function modified(&$x) { $x = $x+1; } 

Nota el signo &. Si llamo al modified en una variable, se modificará, si llamo al not_modified, después de que regrese, el valor del argumento será el mismo.

La versión anterior de PHP permite simular el comportamiento de modified con not_modified haciendo esto: not_modified(&$x). Esto es "pase de tiempo de llamada por referencia". Está en desuso y nunca se debe usar.

Además, en versiones PHP muy antiguas (leer: PHP 4 y anteriores), si modifica objetos, debe pasarlo por referencia, por lo tanto, el uso de &$this. Esto es necesario ni recomendable ya, como objeto siempre se modifican cuando se pasa a funcionar, es decir, este funciona:

function obj_modified($obj) { $obj->x = $obj->x+1; } 

Esto modificaría $obj->x a pesar de que formalmente se pasa "por valor", pero lo que pasa es objeto manejar (como en Java, etc.) y no la copia del objeto, como en PHP 4.

Esto significa que, a menos que estés haciendo algo extraño, casi nunca necesitarás pasar el objeto (y por lo tanto $this por referencia, ya sea tiempo de llamada o de otro modo). En particular, su código no lo necesita.

+0

También puedo señalar que se mostrará el error mencionado anteriormente si intentas invocar una función usando 'call_user_func ('myfunc' , & $ param) 'pero no si usa' call_user_func_array ('myfunc', array (& $ param)) '. No sé ** por qué ** sin embargo, si alguien quiere arrojar algo de luz :) –

+1

@MattFletcher Porque la primera es la sintaxis de referencia de tiempo de llamada, que ha quedado obsoleta durante mucho tiempo.Este último solo está pasando argumentos a una función (que es call_user_func_array) por lo que no tiene nada de malo. Así que sí, puede usar esta última sintaxis para hacer una referencia bajo el radar de la referencia de tiempo de llamada, o puede usarla para fines legítimos, como hacer envoltorios para funciones de variables variables variables (los enlaces parametrizados en PDO pueden ser un ejemplo). La diferencia anterior no siempre es legítima ni necesaria, esta última puede ser legal o no legítima dependiendo del uso. – StasM

+2

'Primero, puede modificarlos, de otra manera no puede hacerlo al revés :) –

20

En caso de que se lo pregunte, un pase de tiempo de referencia es una característica de PHP obsoleto que promueve la escritura suelta de PHP. Básicamente, le permite pasar una referencia (algo así como un puntero C) a una función que no ha pedido específicamente una. Es la solución de PHP para la clavija cuadrada en un problema de agujeros redondos.
En su caso, nunca referencia $this. Fuera de una clase, una referencia a su $this no le permitirá acceder a sus métodos y campos privados.

Ejemplo:

<?php 
function test1($test) {} //This function doesn't want a reference 
function test2(&$test) {} //This function implicitly asks for a reference 

$foo = 'bar'; 
test2($foo); //This function is actually given a reference 
test1(&$foo); //But we can't force a reference on test1 anymore, ERROR 
?> 
+3

" Básicamente, le permite pasar una referencia (algo así como un puntero C) a una función que no se ha preguntado específicamente para uno." <- Eso es lo bueno. Gracias. – RobW

+0

Para que quede claro, las referencias PHP no son como punteros C en absoluto. Son más parecidos a los enlaces duros UNIX, si necesita una analogía. – StasM

Cuestiones relacionadas