variable valor removed referencia por pass paso pasar parametros has been php

valor - PHP 5.4 Tiempo de llamada paso por referencia: ¿Solución fácil disponible?



paso de parametros por valor y por referencia php (3)

Debe denotar la llamada por referencia en la definición de la función, no en la llamada real. Desde que PHP comenzó a mostrar los errores de desaprobación en la versión 5.3, yo diría que sería una buena idea volver a escribir el código.

De la documentación :

No hay ningún signo de referencia en una llamada de función, solo en las definiciones de función. Las definiciones de funciones solas son suficientes para pasar correctamente el argumento por referencia. A partir de PHP 5.3.0, recibirá una advertencia que dice que el "paso por referencia del tiempo de llamada" está en desuso cuando usa & in foo(&$a); .

Por ejemplo, en lugar de usar:

// Wrong way! myFunc(&$arg); # Deprecated pass-by-reference argument function myFunc($arg) { }

Utilizar:

// Right way! myFunc($var); # pass-by-value argument function myFunc(&$arg) { }

¿Hay alguna manera de solucionar fácilmente este problema o realmente necesito volver a escribir todo el código heredado?

Error fatal de PHP: Se ha eliminado el paso por referencia del tiempo de llamada en ... en la línea 30

Esto sucede en todas partes a medida que las variables pasan a funciones como referencias en todo el código.


PHP y las referencias son un tanto intuitivas. Si se usa adecuadamente, las referencias en los lugares correctos pueden proporcionar grandes mejoras de rendimiento o evitar soluciones muy feas y códigos inusuales.

Lo siguiente producirá un error:

function f(&$v){$v = true;} f(&$v); function f($v){$v = true;} f(&$v);

Ninguno de estos tiene que fallar, ya que podrían seguir las reglas a continuación, pero sin duda se han eliminado o desactivado para evitar una gran cantidad de confusión heredada.

Si funcionaron, ambos implican una conversión redundante a referencia y el segundo también implica una conversión redundante a una variable contenida en el ámbito.

El segundo solía ser posible permitiendo que una referencia se pasara a un código que no estaba destinado a trabajar con referencias. Esto es extremadamente feo para el mantenimiento.

Esto no hará nada:

function f($v){$v = true;} $r = &$v; f($r);

Más específicamente, convierte la referencia nuevamente en una variable normal ya que no ha solicitado una referencia.

Esto funcionará:

function f(&$v){$v = true;} f($v);

Esto ve que está pasando una no referencia pero desea una referencia, por lo que la convierte en una referencia.

Lo que esto significa es que no se puede pasar una referencia a una función donde no se solicita explícitamente una referencia para que sea una de las pocas áreas donde PHP es estricto en el paso de tipos o, en este caso, más de un tipo meta.

Si necesitas un comportamiento más dinámico esto funcionará:

function f(&$v){$v = true;} $v = array(false,false,false); $r = &$v[1]; f($r);

Aquí ve que desea una referencia y ya tiene una referencia, así que no la ingrese. También puede encadenar la referencia pero lo dudo.


Para cualquiera que, como yo, lea esto porque necesita actualizar un proyecto heredado gigante a 5.6: como indican las respuestas aquí, no hay una solución rápida: realmente necesita encontrar cada aparición del problema manualmente y solucionarlo .

La forma más conveniente que encontré para encontrar todas las líneas problemáticas en un proyecto (aparte de usar un analizador de código estático en toda regla, que es muy preciso pero no conozco ninguna que lo lleve a la posición correcta en el editor de inmediato) estaba utilizando Visual Studio Code, que tiene una bonita interfaz PHP incorporada, y su función de búsqueda que permite la búsqueda por Regex. (Por supuesto, puede usar cualquier editor de IDE / Código para esto que realice búsquedas de PHP y Regex).

Utilizando este regex:

^(?!.*function).*(/&/$)

es posible buscar en todo el proyecto la aparición de &$ solo en líneas que no son una definición de función.

Esto todavía muestra muchos falsos positivos, pero facilita el trabajo.

El buscador de resultados de búsqueda de VSCode hace que recorrer y encontrar las líneas ofensivas sea muy fácil: simplemente haga clic en cada resultado y busque aquellos que la linter subraye en rojo. Aquellos que necesitas arreglar.