Warum ist ${0x0} richtig?

Lesezeit: 3 Minuten

Benutzer-Avatar
Vlad Preda

Der folgende Code funktioniert einwandfrei:

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

Aber ich kann nicht herausfinden, warum. 0x0 (oder 0, wie Nicht-Hex-Leute es nennen) ist ein zufälliger Container, es hätte eine beliebige Zahl sein können, aber PHP-Variablen können nicht mit einer Zahl beginnen. Was ist so besonders an der { } hier verwendet, und was sind ihre Grenzen?

  • Wir können {} verwenden, um einen Variablennamen zu erstellen PHP.

    – Yogesh Suthar

    7. März 2013 um 11:57 Uhr

  • 0x0 ist eine ASCII-NULL, wenn sie in eine Zeichenfolge umgewandelt wird; und wird tatsächlich verwendet, um Klasseneigenschaftsnamen intern voranzustellen (etwas, dessen sich Ihre Skripte nicht wirklich bewusst sind); so technisch undokumentiert gültig, weil es für einen speziellen Zweck verwendet wird

    – Markus Bäcker

    7. März 2013 um 12:03 Uhr


  • @ MarkBaker – Ich denke, es gibt keine chr() hier, nur regelmäßig (string).

    – Alvaro González

    7. März 2013 um 12:26 Uhr

Benutzer-Avatar
Alvaro González

Zuerst, 0x0 ist nur ein Stammgast 0 in hexadezimaler Darstellung, die in eine Zeichenfolge umgewandelt wird '0' bei Verwendung mit der Variablenvariablensyntax:

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"

Sie haben Recht, wenn Sie sagen, dass es keine ist gültiger Variablenname:

Variablennamen folgen den gleichen Regeln wie andere Labels in PHP. Ein gültiger Variablenname beginnt mit einem Buchstaben oder Unterstrich, gefolgt von einer beliebigen Anzahl von Buchstaben, Ziffern oder Unterstrichen. Als regulärer Ausdruck würde es so ausgedrückt werden: ‘[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*’

Dies ist der Grund, warum $0foo = 'Test'; löst einen Analysefehler aus.

Einige schnelle Tests mit dem Variable Variablen-Syntax zeigt, dass sich PHP tatsächlich nicht wirklich um Variablennamen zu kümmern scheint, sofern es sich um Strings handelt:

${'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"

Meine Vermutung ist, dass die oben erwähnte Namensbeschränkung eher vom Quellcode-Parser als vom Sprachkern auferlegt wird. Es braucht solche Regeln, um Variablen bei der Analyse von PHP-Code voneinander zu unterscheiden. Intern die Zend-Engine, die PHP antreibt behandelt Variablen als Hashmap:

PHP-Variablen bestehen im Allgemeinen aus zwei Dingen: Dem Label, das beispielsweise ein Eintrag in einer Symboltabelle sein kann, und dem eigentlichen Variablencontainer.

Solange es also einen gültigen String für das Label erhält, ist es zufrieden.

Von dem Dokumentation:

Es können auch geschweifte Klammern verwendet werden, um den Eigenschaftsnamen klar abzugrenzen. Sie sind am nützlichsten, wenn auf Werte innerhalb einer Eigenschaft zugegriffen wird, die ein Array enthält, wenn der Eigenschaftsname aus mehreren Teilen besteht, oder wenn der Eigenschaftsname Zeichen enthält, die ansonsten nicht gültig sind (zB von json_decode() oder SimpleXML).

Für mich bedeutet dies, dass, wenn Sie verwenden ${...}, gibt es keine Einschränkungen hinsichtlich der Zeichen, die in einem Variablennamen verwendet werden dürfen. Ob Sie jedoch …

  • Genau. Variablennamen müssen keine gültigen Bezeichner sein. Nur die $identifier-Syntax erfordert dies.

    – Alex

    7. März 2013 um 12:02 Uhr

Der PHP-Parser bietet eine spezielle Syntax zum Erstellen eines Variablennamens aus einem beliebigen Ausdruck, der eine Zeichenfolge zurückgibt (oder in eine Zeichenfolge umgewandelt werden kann), z.

<?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

Diese Syntax ist auch für Objekteigenschaften verfügbar:

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

0x0 ist nur eine Hex-Darstellung von 0 wörtlich.

Benutzer-Avatar
wegus

Mit anderen Worten, alles innerhalb der geschweiften Klammern ist in solchen Fällen ein String!

Also s0x0 ist in der Tat die Hex-Version von 0 aber hier sind beide Saiten! Deswegen ${0x0} oder ${0} Arbeit, wo $0 oder $0x0 Gewohnheit!

Zusätzlich zu dem, was @Michael Robinson gesagt hat, gilt dies in Ihrem Beispiel auch:

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

1228940cookie-checkWarum ist ${0x0} richtig?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy