Pergunta

Acabei de atualizar para o PHP 5.3 e comecei a oferecer suporte a um site antigo para um novo cliente.Parece usar um código PHP bastante estranho que eu nunca encontrei antes.

Ao tentar acessar as variáveis ​​$_GET ou $_REQUEST, o desenvolvedor usou o seguinte: ${"nome_variável"}

Recebo avisos gerados devido a variáveis ​​indefinidas (presumivelmente porque o PHP não está analisando o ${"nome_variável"} código de estilo).

Mudando isso para $_REQUEST['nome_variável'] funciona conforme o esperado, mas não consigo analisar todo o código e alterá-lo, pois o site é enorme e usa métodos de layout proprietários.

Alguém sabe se é possível ativar o suporte para essas tags/codeblocks?Dei uma olhada no PHP.ini e há uma menção a tags de estilo ASP e tags curtas, mas habilitá-las não tem efeito (elas parecem totalmente diferentes de qualquer maneira, apenas pensei que valia a pena tentar).

Foi útil?

Solução

Não acho que haja nada de novo nessa sintaxe:

$a = 10;
var_dump(${"a"});

Funciona muito bem ;-)


Seu problema provavelmente se deve ao fato de que, antes, register_globals foi ativado (por padrão, se PHP <= 4.alguma coisa), e agora está desabilitado -- e isso é bom para a segurança !

Com register_globals definido como On, qualquer variável em $_REQUEST é injetado automaticamente como uma variável em seu aplicativo - bem, na verdade, isso depende do variables_order opção de configuração, mas esta quase sempre inclui Get, Post e Cookie, pelo menos.

Por exemplo, se houver uma variável como $_GET['my_var'], você também terá um $my_var variável...E este também pode ser acessado com a sintaxe ${'my_var'}


Considerando register_globals é Off por padrão desde algo como PHP 4.2, e deve desaparecer no PHP 6 (se eu me lembro bem), desaconselho a sua reativação...pelo menos, se você tiver o tempo necessário para corrigir/testar o código...

Outras dicas

A sintaxe de chaves para variáveis ​​é uma parte incorporada do PHP e já existe há algum tempo.A razão pela qual existe é para resolver ambigüidades com matrizes e sintaxes de objetos ao usar variáveis ​​variáveis.

Do manual:

Para usar variáveis ​​variáveis ​​com matrizes, você deve resolver um problema de ambiguidade.Ou seja, se você escrever $$a1 então o analisador precisa Saiba se você pretendia usar $a1 como um ou se você quisesse $$a como o e, em seguida, o 1 índice de essa variável.A sintaxe para Resolver essa ambiguidade é:${$a1} para o primeiro caso e ${$a}1 durante o segundo.

É uma sintaxe muito útil em diversas situações, como usar variáveis ​​de array ou objeto ao gerar algo usando sintaxe heredoc.

Não vou reiterar o conselho de outras pessoas sobre o uso register_globals, eu só queria expor essa sintaxe incomum.

A sintaxe ${"variable_name"} é praticamente a mesma de $variable_name, exceto que o conteúdo das chaves é avaliado primeiro.É suportado por todas as versões recentes do PHP, até mesmo pelas versões beta.O que não é suportado pelas versões recentes do PHP é o suporte ao registro de variáveis ​​$_REQUEST (e outras) como variáveis ​​globais.Há uma configuração para habilitá-lo:

register_globals = on

Porém, NÃO é recomendado para uso em produção devido a questões de segurança.Pode ser mais fácil executar seu código-fonte por meio de alguma ferramenta do tipo 'sed' e substituir os usos por expressões regulares.

O servidor antigo provavelmente tem REGISTER_GLOBALS sobre.Portanto, os colchetes estranhos não são o problema.

REGISTER_GLOBALS coloca todas as variáveis ​​em $_REQUEST como variáveis ​​regulares no escopo global, o que significa que você pode acessar $_REQUEST['test'] pode ser acessado como $test ou ${"test"}

A sintaxe do colchete está ativada por padrão e não acredito que você possa ativá-la/desativá-la.

register_globals provavelmente estava ligado. {$variable_name} a sintaxe está sempre ativada, mas register_globals transforma coisas como $_REQUEST['variable_name'] em $variable_name.

Evite ativá-lo, se possível - há uma razão pela qual ele tem sido desaconselhado há muito tempo, e ele está desaparecendo totalmente no PHP6.

register_globals está obsoleto a partir do php 5.3 e será removido a partir do php 6.0.O que você quer fazer é usar o recurso Refactoring encontrado na maioria dos IDEs PHP (zendo studio 6+) para renomear a variável para algo mais apropriado, ou seja $_GET['variable_name'].

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top