鍍金池/ 問答/PHP  C  C++/ PHP 中 B 子類繼承 A 父類,A 父類何時(shí)會被銷毀?

PHP 中 B 子類繼承 A 父類,A 父類何時(shí)會被銷毀?

問題說明

這里有一個(gè) A 父類

class A
{
    public function __construct()
    {
    }

    public function __destruct()
    {
        echo "Destroy";
    }
}

子類 B,并且讓 B 繼承 A


use A;
class B extend A
{
    public function __construct()
    {
    }

    public function index()
    {
        echo "Method: index";
    }
}

$a = new A;

$a->index();

能說一下PHP執(zhí)行的流程嗎,父類 A 的析構(gòu)函數(shù)何時(shí)會被執(zhí)行?

回答
編輯回答
壞脾滊

子類B如果自己沒有定義析構(gòu)函數(shù)則會繼承父類A的析構(gòu)函數(shù),析構(gòu)函數(shù)會在當(dāng)PHP決定你的腳本不再與對象相關(guān)時(shí),PHP析構(gòu)函數(shù)將被調(diào)用. 在一個(gè)函數(shù)的命名空間內(nèi),這會發(fā)生在函數(shù)return的時(shí)候. 對于全局變量,這發(fā)生于腳本結(jié)束的時(shí)候. 如果你想明確地銷毀一個(gè)對象,你可以給指向該對象的變量分配任何其它值. 通常將變量賦值為NULL或者調(diào)用unset,或者在使用exit的時(shí)候,都會執(zhí)行A類的析構(gòu)函數(shù)。

2017年6月27日 06:44
編輯回答
尋仙

我覺得你可能沒有理解繼承這個(gè)概念。繼承本質(zhì)上還是新定義了一個(gè)類,只是擁有了父類非私有的方法和屬性的定義。并不是說,一個(gè)類繼承了另外一個(gè)類,它們就有先后順序,這是不對的。在什么樣的情況下會有父類和子類之分呢?就是在 staticself 的調(diào)用上會有區(qū)別。

你的這個(gè)例子,實(shí)際上是實(shí)例化了 B,實(shí)際上和 A 沒有什么關(guān)系。你可以理解為 B 中擁有了 A 中定義的方法。如果子類中沒有重新實(shí)現(xiàn)這個(gè)方法,那么子類就會認(rèn)為父類中的析構(gòu)方法是自己定義的。對于其它方法或者屬性的繼承,也是一樣的。

2018年6月20日 03:35
編輯回答
涼心人

析構(gòu)函數(shù)順序與入棧順序相反, "先進(jìn)后出","后進(jìn)先出" 后實(shí)例化,先從棧中彈出,執(zhí)行析構(gòu)函數(shù)

$a = new A;

$a->index();
與 B 類沒啥關(guān)系吧?

這個(gè)問題與這個(gè)完全一致,可以參考這個(gè)答案PHP繼承類時(shí)的執(zhí)行順序

2017年1月5日 15:24
編輯回答
情殺

由于A 是先被實(shí)例化的,所以 A 是最后被從棧內(nèi)彈出,所有 A 的析構(gòu)函數(shù)會最后執(zhí)行

2017年2月6日 02:21