37 votes

Pourquoi $ {0x0} est-il correct?

Le code suivant fonctionne parfaitement:

 ${0x0} = 'test';
echo ${0x0}; // prints "test"
 

Mais je ne peux pas comprendre pourquoi. 0x0 (ou 0 , comme l'appellent les personnes non hexadécimales) est un conteneur aléatoire, il aurait pu être n'importe quel nombre, mais les variables php ne peuvent pas commencer par un nombre. Quelle est la particularité des { } utilisés ici et quelles sont leurs limites?

31voto

Álvaro G. Vicario Points 57607

Tout d'abord, 0x0 est juste un 0 en représentation hexadécimale qui est rejeté à la chaîne '0"quand il est utilisé avec la variable variable syntaxe:

var_dump(0x0===0); // prints "bool(true)"

${0x0} = 'test';
echo ${0x0}; // prints "test"
echo ${'0'}; // prints "test" as well
var_dump(get_defined_vars()); // contains ["0"] => string(4) "test"

Vous avez raison de lactosérum vous dire que ce n'est pas un nom de variable valide:

Les noms de variables suivent les mêmes règles que les autres labels en PHP. Valide nom de la variable commence par une lettre ou un trait de soulignement, suivie par tous les nombre de lettres, de chiffres, ou des traits de soulignement. Comme une expression régulière, il serait exprimé ainsi: '([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

C'est la raison pour laquelle $0foo = 'Test'; déclenche une erreur d'analyse.

Certains des tests rapides avec les variables syntaxe révèle que, en fait, PHP ne semble pas vraiment se soucier des noms de variables comme ils sont des chaînes de caractères:

${'123 abc xyz    '} = 'Test';
echo ${'123 abc xyz    '}; // Test
echo ${'123 abc xyz   '}; // PHP Notice:  Undefined variable: 123 abc xyz    in ...
var_dump(get_defined_vars()); // ["123 abc xyz    "] => string(4) "Test"

Ma conjecture est que la nomination susmentionnée restriction est imposée par le code source de l'analyseur plutôt que de la langue de base. Elle a besoin de ces règles à dire des variables à part lors de l'analyse de code PHP. En interne, le moteur Zend, que les pouvoirs PHP traite des variables d'un algorithme de hachage de la carte:

Les variables PHP, en général, se composent de deux choses: L'étiquette, qui pourrait, par exemple, être une entrée dans la table des symboles, et de la variable contenant.

Donc autant que l'on reçoit une chaîne valide pour l'étiquette, il est heureux.

25voto

Michael Robinson Points 14791

À partir de la documentation:

Les accolades peuvent également être utilisés, afin de délimiter clairement le nom de la propriété. Ils sont très utiles lors de l'accès à des valeurs d'une propriété qui contient un tableau, lorsque le nom de la propriété est composé de plusieurs parties, ou lorsque le nom de la propriété contient des caractères non valides (par exemple, de la fonction json_decode() ou SimpleXML).

Pour moi, cela signifie que si vous utilisez ${...}, il n'y a pas de limitations concernant les caractères qui peuvent être utilisés dans un nom de variable. Si vous devez toutefois...

4voto

wegus Points 252

En d'autres termes, tout ce qui se trouve entre les accolades est une chaîne!

Donc, s 0x0 est bien la version hexadécimale de 0 mais ici, ce sont des chaînes! C’est pourquoi ${0x0} ou ${0} travaillent, où $0 ou $0x0 ne le feront pas!

4voto

Crozin Points 22346

L'analyseur PHP fournit une syntaxe spéciale pour créer un nom de variable à partir de toute expression renvoyant une chaîne (ou pouvant être convertie en chaîne), par exemple:

 <?php

define('A', 'aaa');

${'    _   '} = 'blah';
${'test' . A . (2 + 6)} = 'var';

echo ${'    _   '}; // blah
echo ${'testaaa8'}; // var

${'123'} = 'blah';
echo ${100 + 23}; // blah

function returnVarName() {
    return 'myVar';
}

$myVar = 12;
echo ${returnVarName()}; // 12
 

Cette syntaxe est également disponible pour les propriétés d'objet:

 $object->{' some property    ... with strage name'};
 

0x0 n'est qu'une représentation hexadécimale de 0 littéral.

3voto

Marko D Points 3926

En plus de ce que @Michael Robinson a dit, dans votre exemple, cela sera également valable:

 ${0x0} = 'test';
$var = "0";
echo $$var; // prints "test"
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X