Свойство динамического класса $$value в php

Как я могу сослаться на свойство класса, зная только строку?

class Foo
{
    public $bar;

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

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

каков правильный способ оценки строки?


person Cameron A. Ellis    schedule 12.05.2009    source источник


Ответы (6)


Вам нужно использовать только один $ при ссылке на переменную-член объекта с использованием строковой переменной.

echo $this->$string;
person Antonio Haley    schedule 12.05.2009
comment
Этот синтаксис может иметь проблемы в php7 (.1?) +, следуйте приведенному ниже ответу Рика, чтобы он работал там правильно. - person jvenema; 30.12.2019

Если вы хотите использовать значение свойства для получения имени свойства, вам нужно использовать скобки "{":

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

Даже если это объекты, они работают:

$this->{$this->myobjname}->somemethod();
person Rick    schedule 13.04.2010
comment
Удивительно, что PHP допускает такие структуры! Но также может быть весьма неопределенным для других - person melledijkstra; 10.02.2017
comment
Это также удобно, если вы комбинируете литерал с динамической переменной, например: $this->{"my_prop_".$i} - person jave.web; 21.08.2017

Как уже упоминалось, $this->$string должен помочь.

Однако это

$this->$$string;

фактически оценит строку и снова оценит результат этого.

$foo = 'bar';
$bar = 'foobar';
echo $$foo; //-> $'bar' -> 'foobar'
person Matthew H.    schedule 12.05.2009

ты был очень близок. вы только что добавили 1 лишний знак $.

public function foobar($string)
{
     echo $this->$string; //will work
}
person Mike Stanford    schedule 12.05.2009

echo $this->$string; //should work

Вам нужно только $$string при доступе к локальной переменной, только имя которой хранится в строке. Поскольку обычно в классе вы обращаетесь к нему как $obj->property, вам нужно добавить только один $.

person Marc W    schedule 12.05.2009

Чтобы запомнить точный синтаксис, имейте в виду, что вы используете $ чаще, чем обычно. Поскольку вы используете $object->property для доступа к свойству объекта, динамический доступ осуществляется с помощью $object->$property_name.

person Community    schedule 03.08.2009