2011-05-05 3 views
0

Почему это не работает?php array в классе

class Test{ 

    private $vars = array('ALL' => 0, 
         'ONE' => 1); 

    private $var = $vars['ALL']; // this does not work 

    function __construct(){ 
    $this->var = $vars['ALL']; // this does work 
    } 
} 

пример кода здесь: http://codepad.org/QSjHMDij

почему массив не доступен в заявлении

private $var = $vars['ALL']; // this does not work 

ответ

3

Вероятно потому, что вы не можете получить доступ к $this во время инициализации класса до начала конструктора (что подразумевается, когда вы пытались сделать это в определении для $ var.) Некоторые языки (например, C#) позволят вам это сделать, но я думаю, что PHP - это тот, который не будет.

+0

, но я не использую $ this на линии 8. (это строка 8 в примере кодека btw. Здесь это будет строка 6.) – superbly

+0

Вам не обязательно: это подразумевается. Если вы не можете получить доступ к '$ this', вы также не можете получить доступ к какой-либо из переменных-членов. edit: На самом деле это может даже не подразумеваться: я забываю, если это правда, но PHP может не иметь того же разрешения области, что и C++ и C#. PHP часто делает необычное разрешение области, чтобы избежать двусмысленности, поэтому я остался бы не удивленным. –

+0

Хорошо. Можно ли предположить, что переменные инициализируются только при инициализации объекта? – superbly

0

Ни то, ни другое не работает так, как вы планируете. Вы не можете использовать переменные при объявлении экземпляров экземпляров (следовательно, ошибка unexpected T_VARIABLE). В конструкторе вы ссылаетесь на локальную переменную с именем $vars, которая не существует, что означает, что вы устанавливаете $this->var в NULL.

Доступ к члену экземпляра осуществляется $this->vars. Вы можете сделать это только в конструкторе.

0

При объявлении членов (переменных) вы не можете назначать значения ключей ключей другим членам, это вызывает ошибку синтаксического анализа.

Например, вы думаете (не так), что $vars['ALL'] ссылается на ваш private $var - что это не так - это также вызывает ошибку синтаксического анализа. Там нет никакого способа для PHP, чтобы знать, что, когда вы говорите:

private $var = $vars['ALL']; 

, что вы на самом деле говорят: «Я хочу значение $ this-> вары [„ALL“] для назначения $ this-> вар» , по крайней мере, не так, как вы его написали. Вот почему вы делаете это изнутри функции, где вы можете легко манипулировать членами, например, вы сделали из конструктора.

Вы должны объявить участников, их видимость и установить некоторые значения по умолчанию (например, вы сделали для $var), но вы не должны указывать их на значения других членов, это просто - неправильно и к счастью - это не работает:)

0

Вы пытаетесь присвоить значение переменной, которая предназначена для части объекта, а не класса. Вы хотите переменные static.