2017-01-28 91 views
2

就像標題說我有這個代碼的問題:PHP抽象類和保護的方法

abstract class AClass { 
    abstract protected function a1(); 
    abstract protected function a2(); 

    public function show() { 
     return $this->a1() . "<br>" . $this->a2(); 
    } 
} 


class A1 extends AClass { 

    protected function a1() { 
     return 'A1a1'; 
    } 

    protected function a2() { 
     return 'A1a2'; 
    } 
} 

class A2 extends AClass { 

    protected function a1() { 
     return 'A2a1'; 
    } 

    protected function a2() { 
     return 'A2a2'; 
    } 
} 

class AA { 

    public function __construct() { 
     $a11 = new A1(); 

     $a22 = new A2(); 

     $this->inter($a11); 
     $this->inter($a22); 
    } 

    private function inter(AClass $class) { 
     echo $class->show(); 
    } 
} 

$aa = new AA(); 

它拋出:38

Fatal error: Call to protected A1::a1() from context 'AA' in C:\xampp\htdocs\Learning\index.php on line 38

線路是這樣的:

$a11 = new A1(); 

我不明白爲什麼它會拋出該錯誤,如果我不在該行調用a1()。

感謝和問候

哈維爾

+0

您是否正在使用少數支持從該類中命名的構造函數的php版本? http://php.net/manual/en/language.oop5.dep.php –

+0

我使用的PHP版本5.6.20看起來它支持他們,是嗎? –

+0

從你的代碼看起來如此。你想要什麼樣的構造器行爲? –

回答

1

在第38行,你讓A1級的一個實例,因此調用構造函數:它是15行由於類的名稱是區分大小寫的function a1(),所以也是構造函數名稱。

由於您的構造函數是受保護的,因此無法從類外調用它。也許你可以創建一個公共靜態函數,在沒有實例化的情況下調用它,並且可以調用構造函數。它對於Singleton類設計模式可能很好。

如果只想用普通方法測試抽象,只需重命名你的函數,這樣它們就不會是構造函數。

+0

謝謝你,那是這個問題,我不知道大小寫不敏感的構造函數。 –

+0

@GezaBoehm爲此回答。 +1。 – CKing