В чем разница между `$ this-> name` и` $ this -> $ name`? - PullRequest
13 голосов
/ 05 февраля 2010

Мне интересно, в чем разница между $this->name и $this->$name? Также $this должно быть строго названо это или это может быть что-нибудь?

Ответы [ 3 ]

20 голосов
/ 05 февраля 2010

$this является зарезервированным именем переменной и не может использоваться ни для чего другого. Он конкретно указывает на объект, над которым вы сейчас работаете. Вы должны использовать $this, потому что вы не знаете, какому объекту переменной будет назначен.

$this->name относится к переменной текущего класса name

$this->$name относится к переменной класса независимо от значения $name. Таким образом

$name = "name";
echo $this->$name; // echos the value of $this->name.

$name = "test";
echo $this->$name;  // echos the value of $this->test
6 голосов
/ 05 февраля 2010

$ - это зарезервированное имя, используемое в PHP для указания на текущий экземпляр класса, который вы используете в ( цитирование ) :

Доступна псевдопеременная $this когда метод вызывается из контекст объекта.
$this является ссылкой к вызывающему объекту (обычно объект, которому принадлежит метод, но, возможно, другой объект, если метод вызывается статически из контекст вторичного объекта).


При использовании $this->name вы получаете доступ к свойству с именем name текущего объекта.


При использовании $this->$name, $ name определяется до доступа к свойству - это означает, что вы получите доступ к свойству, имя которого содержится в локальной переменной $name.

Например, с этой частью кода:

$name = 'abc';
echo $this->$name;

Вы фактически отобразите содержимое свойства abc, как если бы вы написали:

echo $this->abc;

При этом вы используете переменные переменные (цитирование) :

Свойства класса также могут быть доступны используя имена переменных свойств.
The имя переменной будет решен в рамках, из которого звонок сделан.
Например, если вы иметь выражение, такое как $foo->$bar, тогда будет рассмотрен местный охват для $bar и его значение будет использоваться как Наименование имущества $foo.
Это также верно, если $ bar является массивом доступ.

2 голосов
/ 22 августа 2011

Этот вопрос только что всплыл после обновления. Мне понравился вопрос, поэтому я решил добавить свой собственный пример различия.

class Test
{
    public $bar = 'bar';
    public $foo = 'foo';

    public function __construct()
    {
        $bar = 'foo';

        $this->bar; // bar
        $this->$bar; // foo
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...