неявное объявление переменной класса в php?

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

class Example
{

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

    }

}

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


person radman    schedule 25.06.2010    source источник


Ответы (3)


Это работает так же, как обычное объявление переменной:

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

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

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

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

person deceze♦    schedule 25.06.2010

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

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

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

person Caladain    schedule 25.06.2010
comment
Второй пример касается вызова метода, который использует $this статически, а не переменных-членов. - person deceze♦; 25.06.2010
comment
Посмотрите на класс B во втором примере. - person Caladain; 25.06.2010
comment
Да, я сделал. Звонит A::foo(). Там вообще нет переменных-членов. - person deceze♦; 25.06.2010
comment
Класс, переменная-член... все то же самое для PHP. Это то, что я пытался показать. --- - person Caladain; 25.06.2010
comment
Я думаю, вы неправильно понимаете пример. Класс автоматически доступен в любой области видимости, никаких сюрпризов. И класс объявлен заранее, иначе вы не смогли бы его использовать. В примере просто статически вызывается метод класса. Для этого ничего не нужно объявлять, это похоже на вызов любого другого метода. Смысл в том, чтобы продемонстрировать, как специальная переменная $this ведет себя в методе при статическом вызове, как часть объекта и статически из другого объекта. E_STRICT генерируется с использованием $this в A::foo(), а не потому, что использовался класс. - person deceze♦; 25.06.2010
comment
~facepalm~ Да, это то, что пытается сказать пример 2 (в контексте примера). Демонстрация переменной $this. Я пытался сказать, что это также демонстрирует, что вам не нужно выделять приватную переменную в классе B класса A, как в C++. Я угнал пример, чтобы показать функцию в контексте этого вопроса. Наверное, стоило прокатить собственный пример. - person Caladain; 25.06.2010
comment
Да, без контекста того, как это нужно сделать на C++, это плохой пример. :P Я не слишком много знаю о C++, но нельзя ли статически вызывать методы класса другого класса/объекта в C++? - person deceze♦; 25.06.2010
comment
Вам нужно будет объявить в классе B частный экземпляр класса A. Затем вам нужно будет сделать одну из трех вещей: 1.) Получить существующий экземпляр класса A в конструкторе. 2.) Иметь сеттер, который устанавливает класс A. Это будет вызвано кем-то другим. 3.) Создайте свою собственную копию класса A в конструкторе. - person Caladain; 25.06.2010
comment
Уверены ли вы? Вы говорите о создании экземпляра объекта... Вызов его статически, похоже, работает так же, как и в PHP (и как в примере): cppreference.com/wiki/keywords/static - person deceze♦; 25.06.2010
comment
Переменная numFoos объявлена ​​закрытой в классе. Вы можете объявлять члены/переменные класса в любом порядке. Обычно в С++ рекомендуется помещать все ваши объявления переменных вверху после конструктора/деструктора, но перед чем-либо еще. Если вы ищете что-то конкретное, было бы неплохо немного больше подробностей о конкретных разделах :-) - person Caladain; 25.06.2010
comment
Я думаю, мы говорим о разных вещах... Достаточно сказать, что приведенный вами пример не имеет отношения к этому вопросу. =П - person deceze♦; 25.06.2010

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

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

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

    private $var;   // main state variable

    public function __construct()
    {
        $this->data = array();
        $this->var = 'something';
    }
}
person wallyk    schedule 25.06.2010
comment
Следует отметить, что исходный пример приведет к общедоступным членам, в то время как в вашем примере есть частные члены. - person Ken Wayne VanderLinde; 08.11.2016