Question

Je viens de passer à PHP 5.3 et j'ai commencé à prendre en charge un ancien site Web pour un nouveau client. Il semble utiliser du code PHP plutôt étrange que je n'ai pas rencontré auparavant.

Tout en essayant d'accéder aux variables $ _get ou $ _request, le développeur a utilisé ce qui suit: $ {"variable_name"}

Je reçois des avis générés en raison de variables non définies (vraisemblablement parce que PHP n'analyse pas le $ {"variable_name"} code de style).

Changer cela en $ _Request ['variable_name' Fonctionne comme prévu, mais je ne peux pas passer par tout leur code et le changer car le site est massif et utilise des méthodes de mise en page de propriété.

Est-ce que quelqu'un sait s'il est possible d'activer la prise en charge de ces balises / blocs de code? J'ai jeté un coup d'œil dans php.ini et il y a une mention de balises de style ASP et de balises courtes, mais les permettre n'a aucun effet (ils ont l'air totalement différents de toute façon, je pensais juste que cela valait le coup).

Était-ce utile?

La solution

Je ne pense pas qu'il y ait quelque chose de nouveau avec cette syntaxe:

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

Fonctionne très bien ;-)


Votre problème est probablement dû au fait qu'avant, register_globals a été activé (par défaut, si php <= 4.Something), et est maintenant désactivé - et c'est bon pour la sécurité!

Avec registre_globals réglé sur ON, toute variable dans $_REQUEST est automatiquement injecté en tant que vartiable dans votre application - eh bien, en fait, cela dépend du variables_order Option de configuration, mais celle-ci inclut presque toujours Get, Post et Cookie, au moins.

Par exemple, s'il y a une variable comme $_GET['my_var'], vous aurez également un $my_var variable ... et celui-ci est également accessible avec la syntaxe ${'my_var'}


Considérant register_globals est Off Par défaut depuis quelque chose comme PHP 4.2, et devrait disparaître dans PHP 6 (si je me souviens bien), Je vous conseillerais de le réactiver ... au moins, si vous avez le temps nécessaire pour corriger / tester le code ...

Autres conseils

La syntaxe de l'attelle bouclée pour les variables est une partie intégrée de PHP et existe depuis un certain temps. La raison pour laquelle il existe est de résoudre les ambiguïtés avec des tableaux et des syntaxes d'objets lors de l'utilisation variables variables.

Du manuel:

Afin d'utiliser des variables variables avec des tableaux, vous devez résoudre un problème d'ambiguïté. C'est-à-dire si vous écrivez $$ un1 alors l'analyseur doit savoir si vous vouliez utiliser $ a1 en tant que variable, ou si vous vouliez $$ a comme variable puis le 1 Index de cette variable. La syntaxe pour résoudre cette ambiguïté est: $ {$ a1} pour le premier cas et $ {$ a}1 pour le second.

C'est une syntaxe très pratique dans plusieurs situations, comme utiliser des variables de tableau ou d'objet tout en sorties quelque chose en utilisant Syntaxe Heredoc.

Je ne réitérerai pas les conseils des autres sur l'utilisation register_globals, Je voulais juste exposer cette syntaxe inhabituelle.

La syntaxe $ {"variable_name"} est pratiquement la même que $ variable_name, sauf que le contenu des accolades bouclés est évalué en premier. Il est soutenu par toutes les versions récentes de PHP, même les versions bêta. Ce qui n'est pas pris en charge par les versions récentes de PHP, c'est le support de l'enregistrement des variables $ _request (et autres) comme variables globales. Il y a un paramètre pour l'activer:

register_globals = on

Il n'est cependant pas recommandé pour une utilisation en production en raison de problèmes de sécurité. Il peut être plus facile d'exécuter votre source dans un outil de type «SED» et de remplacer les usages par une expression régulière.

L'ancien serveur a probablement REGISTER_GLOBALS sur. Donc, les supports étranges ne sont pas le problème.

REGISTER_GLOBALS met toutes les variables $_REQUEST En tant que variables régulières dans la portée globale, ce qui signifie que vous pouvez accéder $_REQUEST['test'] peut être accessible comme $test ou ${"test"}

La syntaxe du support est allumée par défaut, et je ne pense pas que vous puissiez l'allumer / désactiver.

register_globals a probablement été allumé. {$variable_name} La syntaxe est toujours activée, mais register_globals transforme les choses comme $_REQUEST['variable_name'] dans $variable_name.

Évitez de l'allumer si possible, cependant - il y a une raison pour laquelle il a été conseillé depuis longtemps, et il disparaît entièrement dans PHP6.

register_globals est obsolète à partir de PHP 5.3 et sera supprimé à partir de PHP 6.0. Ce que vous voulez faire, c'est utiliser la fonction de refactorisation trouvée dans la plupart des IDE PHP (Zendo Studio 6+) pour renommer la variable à quelque chose de plus approprié, c'est-à-dire $_GET['variable_name'].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top