Existe alguma maneira de corrigir esse problema com facilidade ou eu realmente preciso reescrever todo o código legado?
Erro fatal do PHP: A passagem por referência do tempo de chamada foi removida em ... on line 30
Isso acontece em todos os lugares, pois as variáveis são passadas para funções como referências em todo o código.
Respostas:
Você deve denotar a chamada por referência na definição da função, não na chamada real. Desde que o PHP começou a mostrar os erros de descontinuação na versão 5.3, eu diria que seria uma boa idéia reescrever o código.
A partir da documentação :
Por exemplo, em vez de usar:
Usar:
fonte
E_COMPILE_WARNING
erro nível, para referência: php.net/manual/en/...Para quem, como eu, lê isso porque precisa atualizar um projeto herdado gigante para a versão 5.6: como as respostas aqui apontam, não há solução rápida: você realmente precisa encontrar cada ocorrência do problema manualmente e corrigi-lo .
A maneira mais conveniente que encontrei para encontrar todas as linhas problemáticas em um projeto (além de usar um analisador de código estático completo, que é muito preciso, mas não conheço nenhum que o leve à posição correta no editor imediatamente) estava usando o Visual Studio Code, que possui um bom linter PHP embutido, e seu recurso de pesquisa que permite pesquisar pelo Regex. (Obviamente, você pode usar qualquer editor de IDE / código para isso que faça buscas em PHP e Regex em PHP).
Usando este regex:
é possível pesquisar em todo o projeto a ocorrência de
&$
apenas linhas que não são uma definição de função.Isso ainda gera muitos falsos positivos, mas facilita o trabalho.
O navegador de resultados de pesquisa do VSCode facilita a navegação e a localização das linhas incorretas: basta clicar em cada resultado e procurar as que o linter sublinha em vermelho. Aqueles que você precisa consertar.
fonte
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
PHP e referências não são intuitivas. Se usadas adequadamente, as referências nos lugares certos podem fornecer grandes melhorias de desempenho ou evitar soluções muito feias e códigos incomuns.
A seguir irá produzir um erro:
Nada disso precisa falhar, pois pode seguir as regras abaixo, mas sem dúvida foi removido ou desativado para evitar muita confusão herdada.
Se eles funcionaram, ambos envolvem uma conversão redundante em referência e o segundo também envolve uma conversão redundante em uma variável contida no escopo.
O segundo costumava ser possível, permitindo que uma referência fosse passada para um código que não se destinava a trabalhar com referências. Isso é extremamente feio para manutenção.
Isso não fará nada:
Mais especificamente, transforma a referência novamente em uma variável normal, pois você não solicitou uma referência.
Isso funcionará:
Isso mostra que você está passando uma não referência, mas quer uma referência, então a transforma em uma referência.
O que isso significa é que você não pode passar uma referência a uma função em que uma referência não é solicitada explicitamente, tornando-a uma das poucas áreas em que o PHP é rigoroso quanto à passagem de tipos ou, nesse caso, mais do tipo meta.
Se você precisar de um comportamento mais dinâmico, isso funcionará:
Aqui ele vê que você quer uma referência e já tem uma referência, então deixa em paz. Também pode encadear a referência, mas duvido disso.
fonte