Когда я создаю экземпляр класса в PHP, получаю ли я указатель на объект?


Или моя переменная содержит сам объект?

Когда я говорю, например:

$obj = new ClassOne();

Является ли $obj указателем на объект, созданный в памяти? Содержит ли он только адрес памяти объекта? Или он содержит сам объект?

Например, когда я говорю,

$obj = new SomeOtherClass();

Будет ли объект ClassOne собирать мусор, как в JAVA, или это вызовет утечку памяти, как в C++?

Author: PeeHaa, 2013-01-19

3 answers

Вкратце, объектные модели в C++ и Java немного отличаются:

  • C++ имеет неограниченные переменные: каждый тип объекта может встречаться как тип объекта, который является переменной. Другими словами, переменные могут быть объектами любого типа. (Но не все переменные являются объектами (например, ссылки)!) Более того, все переменные ограничены областью действия, и, следовательно, время жизни всех объектов, которые являются переменными, также определяется автоматически. Только динамически выделяемые объекты никогда не могут быть переменными, и они могут быть обработаны только с помощью указателей и ссылок.

  • В Java, если мы игнорируем примитивные типы, переменные никогда не являются объектами , а объекты никогда не могут быть переменными. Все объекты всегда "волшебным образом находятся где-то в другом месте" (например, "куча GC"), и вы можете обрабатывать их только с помощью указателей, подобных дескрипторам. В Java переменная типа T всегда является ссылкой на фактический объект типа T, который живет где-то в другом месте. Переменные также ограничены областью действия, как и в C++, но время жизни всех объектов Java неопределенно и гарантированно распространяется только на время жизни всех ссылок на данный объект.

    (Ситуация отличается для встроенных типов типа "значение", таких как int, которые могут встречаться как тип переменных, и фактически не могут выделяться динамически.)

  • Я думаю, что PHP в этом отношении похож на Java.

 0
Author: Kerrek SB, 2013-01-19 10:51:03

В PHP нет указателей . Переменная, содержащая объект, содержит идентификатор объекта или ссылку на объект . Это переменная в основном типа object со значением 42 (или каким бы ни был внутренний идентификатор объекта). Это значение, ссылающееся на объект, который хранится где-то в памяти. Однако это не указатель или адрес памяти. Присвоение переменной другого объекта присваивает переменной другой идентификатор объекта, это не измените любой адрес памяти или ранее назначенный объект.

 2
Author: deceze, 2013-01-19 10:49:58

В документации говорится:

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

Прочитайте документацию. Вот почему это было написано.

 2
Author: JB Nizet, 2013-01-19 18:36:31