O que o PHP7 vai quebrar #2 | Grupo de desenvolvedores de PHP do estado de São Paulo
Funções que recebem como parâmetros variáveis por referência oriundas do retorno de funções podem ser "ludibriadas" usando a técnica de converter o parâmetro retornado (quando não uma referência mas um valor) para uma expressão. Complicado? Bastante. Em código fica um pouco mais fácil de entender:
function byRef ( & $param ) // $param é um parâmetro de referência { //faz alguma coisa } function returnValue () { //faz alguma coisa return 'foo'; // Retorno é um valor } byRef( returnValue() ); // Strict Standards: Only variables should be passed by reference //No PHP 5.x, a forma de burlar esse erro era transformar //"returnValue()" em uma expressão, desta forma: byRef( (returnValue()) ); // byRef era chamada normalmente
function byRef ( & $param ) // $param é um parâmetro de referência
function returnValue ()
return 'foo'; // Retorno é um valor
byRef( returnValue() );
//No PHP 5.x, a forma de burlar esse erro era transformar
//"returnValue()" em uma expressão, desta forma:
byRef( (returnValue()) ); // byRef era chamada normalmente
2.2. Como é?
No PHP5.x era possível enganar a engine ao transformar o retorno não referencial em expressão com o uso dos parênteses. Já não era uma boa prática e levava muito a confusões. Essa brecha foi agora fechada, esse tipo de chamada agora irá sempre retornar o erro "Strict Standards: Only variables should be passed by reference".
2.3. Como vai ser?
Mais uma vez, um caso de aplicação das boas práticas direto no core. A partir da versão 7.x não será mais possível burlar a engine utilizando os parênteses. Funções que tem referências como parâmetros devem receber sempre referências e não valores.
2.4. Como se preparar para a mudança?
Infelizmente nesse caso não há uma maneira simples e rápida de adequação de código para que funcione instantaneamente nas duas versões, a regra é mesmo seguir as boas práticas e não tentar (já na versão 5.x) burlar a engine. Passe referências ou altere a função para receber valores.
2.5. Implicações?
Por ser um comportamento até certo ponto errôneo e que se quer deveria ser suportado, as implicações são basicamente a melhoria da qualidade do código já que a coesão e consistência das assinaturas de função e seu uso é sempre bem vinda.