[英]When I instantiate a class in PHP, do I get a pointer to the object?
或者,我的變量是否保留了對象本身?
當我說例如:
$obj = new ClassOne();
是$ obj指向內存中創建的對象的指針? 它只保存對象的內存地址嗎? 或者它是否持有物體本身?
例如,當我說,
$obj = new SomeOtherClass();
ClassOne對象會像JAVA一樣被垃圾收集,還是會像C ++一樣導致內存泄漏?
PHP中沒有指針 。 保存對象的變量包含對象標識符或對象引用 。 這是一個基本上是類型object
的變量,其值為42
(或者內部對象標識符是什么)。 它是一個引用對象的值,它存儲在內存中的某個位置。 它不是指針或內存地址。 將另一個對象分配給變量會為變量分配另一個對象標識符,它不會更改任何內存地址或先前分配的對象。
簡而言之,C ++和Java中的對象模型有點不同:
C ++有無約束變量:每個對象類型都可以作為變量對象的類型出現。 換句話說,變量可以是任何類型的對象。 (但並非所有變量都是對象(例如引用)!)此外,所有變量都是作用域的,因此所有對象的生命周期 - 這些變量也是自動限定范圍的。 只有動態分配的對象永遠不能是變量,它們只能通過指針和引用來處理。
在Java中,如果我們忽略原始類型,變量永遠不是對象,對象永遠不能是變量。 所有對象總是“神奇地在其他地方”(例如“GC堆”),並且您只能通過類似指針的句柄來處理它們。 在Java中,類型為T
的變量始終是對T
類型的實際對象的引用,它居住在其他地方。 變量也是作用域的,就像在C ++中一樣,但是所有Java 對象的生命周期都是不確定的,並且只能保證超出給定對象的所有引用的生命周期。
(對於內置的“值”類型類型,例如int
,情況不同,它可以作為變量的類型出現,實際上不能動態分配。)
我認為PHP在這方面類似於Java。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.