2009-05-12 4 views
36

Comment puis-je référencer une propriété de classe en ne connaissant qu'une chaîne?

class Foo 
{ 
    public $bar; 

    public function TestFoobar() 
    { 
     $this->foobar('bar'); 
    } 

    public function foobar($string) 
    { 
     echo $this->$$string; //doesn't work 
    } 
} 

Quelle est la bonne façon d'évaluer la chaîne?

Répondre

62

Vous ne devez utiliser qu'un $ pour référencer la variable membre d'un objet à l'aide d'une variable de chaîne.

echo $this->$string; 
3

vous étiez très proche. vous venez d'ajouter 1 signe $ supplémentaire.

public function foobar($string) 
{ 
    echo $this->$string; //will work 
} 
0
echo $this->$string; //should work 

Vous avez seulement besoin $$string lorsque l'accès à une variable locale ayant seulement son nom stocké dans une chaîne. Depuis normalement dans une classe vous y accédez comme $obj->property, il vous suffit d'ajouter un $.

18

Comme les autres l'ont mentionné, $ this -> $ string devrait faire l'affaire.

Cependant, cette

$this->$$string; 

évaluera en fait la chaîne, et encore évaluer le résultat de cela.

$foo = 'bar'; 
$bar = 'foobar'; 
echo $$foo; //-> $'bar' -> 'foobar' 
0

Pour ne pas oublier la syntaxe exacte, prenez à l'esprit que vous utilisez un $ plus que vous utilisez habituellement. Lorsque vous utilisez $object->property pour accéder à une propriété d'objet, l'accès dynamique est effectué avec $object->$property_name.

27

Si vous souhaitez utiliser une valeur de propriété pour obtenir le nom d'une propriété, vous devez utiliser « { » entre parenthèses:

$this->{$this->myvar} = $value; 

Même si elles sont des objets, ils travaillent:

$this->{$this->myobjname}->somemethod(); 
+0

Cela a fait l'affaire pour moi (PHP 5.2) – doublejosh

+0

Incroyable que PHP permet ces structures! Mais peut également être assez vaguement aux autres – MDijkstra

+0

Il est également utile si vous combinez littéral avec var dynamique par exemple: '$ this -> {" my_prop _ ". $ I}' –

Questions connexes