2013-05-06 13 views
19

ich die Notwendigkeit, den Zugang gestoßen/ändern, um eine Variable als solche:

$this->{$var} 

Der Kontext ist mit CI DataMapper Regeln bekommen. Ich kann nicht finden, was diese Syntax tatsächlich tut. Was machen die in diesem Zusammenhang? Warum nicht einfach:

$this->var 

danke!

Antwort

36

Dies ist eine variable Variable, so dass Sie am Ende mit $this->{value-of-$val} enden.

Siehe: http://php.net/manual/en/language.variables.variable.php

So zum Beispiel:

$this->a = "hello"; 
$this->b = "hi"; 
$this->val = "howdy"; 

$val = "a"; 
echo $this->{$val}; // outputs "hello" 

$val = "b"; 
echo $this->{$val}; // outputs "hi" 

echo $this->val; // outputs "howdy" 

echo $this->{"val"}; // also outputs "howdy" 

Arbeitsbeispiel: http://3v4l.org/QNds9

Das ist natürlich in einem Klassenkontext arbeiten. Sie können wie diese genauso einfach variable Variablen in einem lokalen Kontext verwenden:

$a = "hello"; 
$b = "hi"; 

$val = "a"; 
echo $$val; // outputs "hello" 

$val = "b"; 
echo $$val; // outputs "hi" 

Arbeitsbeispiel: http://3v4l.org/n16sk

+6

hmm '$ objekt-> attr' =' $ objekt -> {"attr"} ':) –

+0

@DaveChen aktualisierte meine Antwort auch mit diesem Beispiel – jszobody

+2

Ich erinnere mich, als ich anfing, versuchte ich etwas wie' $ this -> $ val' und scheiterte kläglich. Schön diese Antwort zu sehen. –

8

allererst $this->{$var} und $this->var sind zwei sehr verschiedene Dinge. Letzterer fordert die Klassenvariable var an, während der andere den Namen der in der Zeichenfolge $var enthaltenen Variablen anfordert. Wenn $var der String ist, wird es $this->foo und so weiter anfordern.

Dies ist nützlich für dynamische Programmierung (wenn Sie den Namen der Variablen nur zur Laufzeit kennen). Aber die klassische {} Notation in einem String-Kontext ist vor allem sehr mächtig, wenn Sie seltsame Variablennamen haben:

${'y - x'} = 'Ok'; 
$var = 'y - x'; 
echo ${$var}; 

druckt Ok auch wenn der Variablenname y - x wegen der Räume nicht gültig ist und der - Charakter.

+1

+1 für Sie auch hinzu! Ich wusste nie, dass Variablennamen so komplex sein können. Könnten Sie also ein Array/Objekt als Variablennamen verwenden? –

+1

@DaveChen, ihre String-Darstellung ja. Obwohl ich denke, dass es ein Längenlimit für Variablennamen gibt. Ich denke nicht, dass es eine gute Übung ist, deshalb würde ich es vermeiden. – Shoe