Или моя переменная удерживает объект сам?
Когда я говорю, например:
$obj = new ClassOne();
– $ obj указатель на объект, созданный в памяти? Поддерживает ли он только адрес памяти для объекта? Или он сам удерживает объект?
Например, когда я говорю,
$obj = new SomeOtherClass();
Будет ли объект ClassOne собирать мусор, как в JAVA, или это вызовет утечку памяти, как на C ++?
Вкратце, объектные модели в C ++ и Java немного отличаются:
C ++ имеет неограниченные переменные: каждый тип объекта может возникать как тип объекта, который является переменной. Другими словами, переменные могут быть объектами любого типа. (Но не все переменные являются объектами (например, ссылками)!) Кроме того, все переменные обламываются, и, следовательно, время жизни всех объектов-тех-переменных также автоматически изменяется. Только объекты с динамическим распределением никогда не могут быть переменными, и их можно обрабатывать только с помощью указателей и ссылок.
В Java, если мы игнорируем примитивные типы, переменные никогда не являются объектами, а объекты никогда не могут быть переменными. Все объекты всегда «магически где-то в другом месте» (например, «куча GC»), и вы можете обрабатывать их только с помощью указательных ручек. В Java переменная типа T
всегда является ссылкой на фактический объект типа T
, который живет где-то в другом месте. Переменные также ограничены, как и в C ++, но время жизни всех объектов Java неопределенно и гарантируется только за пределами жизни всех ссылок на данный объект.
(Ситуация различна для встроенных типов значений типа «значение» типа int
, которые могут возникать как тип переменных и фактически не могут быть распределены динамически.)
Я думаю, что PHP похож на Java в этом отношении.
В PHP нет указателей . Переменная, содержащая объект, содержит идентификатор объекта или ссылку на объект . Это переменная, в основном, типа object
со значением 42
(или независимо от внутреннего идентификатора объекта). Это значение, которое ссылается на объект, который хранится где-то в памяти. Однако это не указатель или адрес памяти. Присвоение другому объекту переменной присваивает переменную другой идентификатор объекта, он не изменяет никакого адреса памяти или ранее назначенного объекта.
В документации говорится:
PHP обрабатывает объекты так же, как ссылки или дескрипторы, что означает, что каждая переменная содержит ссылку на объект, а не копию всего объекта. См. «Объекты и ссылки».
Прочтите документацию. Вот почему это было написано.