Per PHP-Dokumentation über Variable variables:
$this is a special variable that cannot be referenced dynamically
aber es scheint, dass es falsch ist, zumindest auf der PHP-Version, die ich getestet habe (5,5 .12).
class ThisIsBugged
{
public function __construct()
{
${'this'}->doSomething(); // This works, while it shouldn't
}
}
Frage # 1: Wie kann es? Laut der Dokumentation sollte es nicht.
Aber es gibt noch mehr.
class ThisIsBugged
{
public function __construct()
{
// This does not work, but it could. See below.
${'th' . 'is'}->doSomething();
}
}
Es stoppt die Ausführung, wie erwartet:
PHP Notice: Undefined variable: this
PHP Fatal error: Call to a member function doSomething() on a non-object.
Beachten Sie, dass die Aussage {'th' . 'is'}
bewertet worden: "Nicht definierte Variable: dieses".
Allerdings (dies ist das Seltsamste), indem explizit auf die spezielle Variable $this
verwiesen wird, werden alle dynamischen Referenzen korrigiert, die davor oder danach in der Methode verwendet werden.
class ThisIsBugged
{
public function __construct()
{
// Now it works while it shouldn't
${'th' . 'is'}->doSomething();
// This fixes both the previous and the subsequent calls
$unused = $this;
// Now it works while it shouldn't
${'th' . 'is'}->doSomething();
}
}
Frage # 2: Wie eine explizite Bezugnahme auf $this
alle anderen dynamischen Verweise auf $this
in der ganzen Methode beheben kann?
AFAIK die Form '$ {}' ist veraltet (obwohl ich keinen Link habe, der dies angibt) die Zustände des Docus über die Verwendung von dynamischer Verwendung des '$ this 'nicht die' $ {this} 'oder' $ {'this'} 'Der PHP-Parser versteht die eckigen Klammern als eine Form der Verwendung einer Zeichenkette als Variable. Versuchen Sie, das gleiche ohne Thrakets zu tun und sehen Sie, was passiert. –
Die '$ {}' Form ist nicht veraltet. – ircmaxell