2016-03-09 29 views
2

我遇到了以下結構:繼承和函數調用父和子類

// parent class 
class A 
{  
    public function myFunc1() 
    { 
     $this->myFunc2(); 
    } 

    private function myFunc2() 
    { 
     echo "called from class A"; 
    } 
} 

// sub-class 
class B extends A 
{ 
    private function myFunc2() 
    { 
     echo "called from class B"; 
    } 
} 

$foo = new B(); 
$foo->myFunc1(); 

我所料,因爲在B類沒有myFunc1(),父函數被調用。這似乎是正確的。

現在,爲了安全起見,我var_dump$此myFunc1(),它表明,這是由B型

對象從我的理解,它應該調用myfunc2所( )來自B類的,但是這沒有發生。它是從調用類A方法

從類稱爲A

,而不是

從B類稱爲

是,該功能是私人,如果我將其更改爲保護,它按預期工作。但私人暗示,當我處於特定的環境中時,我可以訪問這個功能,不是嗎?

+2

此代碼應該失敗。無法在對象上調用私有方法。只從內部。 – Erik

+0

私人功能只能從班級內部進行訪問,該班的孩子只能訪問其父母的公共或受保護功能 – andrew

+0

想想編寫代碼的人。當她寫'myFunc1'時,她用* knowledge *做了這樣的事情,即存在一個私有類的'myFunc2'和一個* expectation *,這是一個被調用的類。 – bishop

回答

0

private總是屬於同一個類,您不能繼承它。這就是爲什麼myFunc1()從類A調用myFunc2()。如果要覆蓋它,則必須將可見性更改爲protected

2

私有函數只有只有可在類中定義,而不在子類中。

這意味着你的對象有兩個完全不同的函數,它們碰巧具有相同的名稱。對象B知道有一個對象,而對象A只知道有另一個對象。他們不以任何方式互動。

由於這些函數對於它們被定義的特定類是完全私有的,因此無法重寫它們或者其他類來調用它們。

如果您需要的行爲,使您可以覆蓋類是如何工作的,你將不得不使用保護代替,這是專爲從擴展調用和多變的(並因此是一個完全不同的野獸都-一起)。