¿Hay alguna forma de solucionar fácilmente este problema o realmente necesito reescribir todo el código heredado?
Error fatal de PHP: se ha eliminado la referencia de tiempo de llamada en ... en la línea 30
Esto sucede en todas partes cuando las variables se pasan a funciones como referencias en todo el código.
Respuestas:
Debería denotar la llamada por referencia en la definición de la función, no la llamada real. Desde que PHP comenzó a mostrar los errores de desaprobación en la versión 5.3, diría que sería una buena idea reescribir el código.
De la documentación :
Por ejemplo, en lugar de usar:
Utilizar:
fuente
E_COMPILE_WARNING
error de nivel, para referencia: php.net/manual/en/…Para cualquiera que, como yo, lea esto porque necesita actualizar un proyecto heredado gigante a 5.6: como las respuestas aquí señalan, no hay una solución rápida: realmente necesita encontrar cada ocurrencia del problema manualmente y solucionarlo .
La forma más conveniente que encontré para encontrar todas las líneas problemáticas en un proyecto (salvo el uso de un analizador de código estático completo, que es muy preciso, pero no sé nada que lo lleve a la posición correcta en el editor de inmediato) estaba usando Visual Studio Code, que tiene una bonita interfaz PHP integrada, y su función de búsqueda que permite buscar por Regex. (Por supuesto, puede usar cualquier editor IDE / Code para esto que haga búsquedas de PHP linge y Regex).
Usando esta expresión regular:
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 genera muchos falsos positivos, pero facilita el trabajo.
El navegador de resultados de búsqueda de VSCode hace que caminar y encontrar las líneas ofensivas sea muy fácil: simplemente haga clic en cada resultado y busque los que la linter subraya en rojo. Los que necesitas arreglar.
fuente
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
PHP y las referencias son algo poco intuitivas. Si se usan 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:
Ninguno de estos tiene que fallar, ya que podrían seguir las reglas a continuación, pero sin duda se han eliminado o deshabilitado para evitar mucha 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 se pasara una referencia al código que no estaba destinado a funcionar con referencias. Esto es extremadamente feo para la mantenibilidad.
Esto no hará nada:
Más específicamente, convierte la referencia nuevamente en una variable normal, ya que no ha solicitado una referencia.
Esto funcionará:
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 puede pasar una referencia a una función en la que no se solicita explícitamente una referencia para convertirla en una de las pocas áreas donde PHP es estricto al pasar tipos o, en este caso, más de un metatipo.
Si necesita un comportamiento más dinámico, esto funcionará:
Aquí ve que desea una referencia y ya tiene una referencia, así que la deja sola. También puede encadenar la referencia, pero lo dudo.
fuente