2010-06-25 3 views
2

Я искал какой-то код, и мне трудно найти объявление переменной в php-классах. В частности, кажется, что код, который я просматриваю, не объявляет переменные класса, прежде чем он их использует. Теперь это можно ожидать, но я не могу найти информацию о том, что это возможно. Так вы бы ожидали этого:неявное объявление переменной класса в php?

class Example 
{ 

    public function __construct() 
    { 
     $this->data = array(); 
     $this->var = 'something'; 

    } 

} 

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

ответ

3

Это работает так же, как обычный декларации переменной будет работать:

$foo = 'bar'; // Created a new variable 

class Foo { 
    function __construct() { 
     $this->foo = 'bar'; // Created a new variable 
    } 
} 

PHP классы не совсем так же, как и в других языках, где должны быть указаны как часть объявления класса переменных-членов. Члены класса PHP могут быть созданы в любое время.

Сказав это, вы должны объявить переменную как public $foo = null; в объявлении класса, если он должен быть постоянным членом класса, чтобы четко выразить намерение.

2

Так вы ожидали бы этого: (образец кода) для работы?
Да. Это довольно плохая практика (по крайней мере, это делает сканирование на C++), но это нисколько не удивит меня. См. Пример 2 на следующей странице для примера использования другого класса, не объявляя его заранее. http://www.php.net/manual/en/language.oop5.basic.php Он выдает ошибку, если включен E_STRICT.

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

Да. Разве это не PHP Fun? Исходя из фона C++/C#, PHP занял некоторое время, чтобы вырасти на мне с его очень свободным набором текста, но он имеет свои преимущества.

+0

Это второй пример о вызове метода, который использует '$ this' статически, а не о переменных членов. – deceze

+0

Посмотрите на класс B во втором примере. – Caladain

+0

Да, да. Он вызывает 'A :: foo()'. Здесь нет никаких переменных-членов. – deceze

1

Это полностью функционально, хотя мнения будут отличаться. Поскольку создание переменных-членов класса в конструкторе, они будут существовать в каждом экземпляре объекта, если не будут удалены.

Это обычное для объявления переменных-членов класса с информативными комментариями:

class Example 
{ 
    private $data; // array of example data 

    private $var; // main state variable 

    public function __construct() 
    { 
     $this->data = array(); 
     $this->var = 'something'; 
    } 
} 
+0

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