2013-02-26 106 views
0

PHP中的OOP繼承有一些問題。我有2班,動物和企鵝。企鵝擴展動物。我的源代碼是這樣的:PHP中的OOP繼承

class Animal{ 
    public $type = "animal"; 

    function dance(){ 
    echo $this->type." dances!\n"; 
    } 
} 

,並

class Penguin extends Animal { 
    private $type = "penguin"; 
} 

而且,我的主要代碼是這樣的;

include('animal.php'); 
include('private_penguin.php'); 

$tux = new Penguin(); 
$tux->type = "linux penguin"; 
$tux->dance(); 

這是我所有的代碼。我在一些教程中閱讀了OOP。但有這樣的代碼,有一個致命錯誤:訪問級別Penguin :: $類型必須公開。但我沒有。哪一個是正確的!

動物類$類型是公共的,但企鵝類是私有的;

你能幫助我嗎!

回答

3

私有變量不能從outside這個類中訪問。例如

class Penguin { 
    function setType() { 
     $this->type = 'penguin'; // works 
    } 
} 

$tux->type = 'penguin'; // does not work 

這就是擁有私有變量的全部目的 - 防止「外部」代碼與對象的內部混淆。

+0

但代碼中沒有任何錯誤。這是什麼原因?! – moogod 2013-02-26 05:46:56

+0

是的,有。你正在做'$ tux-> type'賦值,它試圖從對象的外部設置一個私有類屬性。因此錯誤。 – 2013-02-26 05:47:30

0

我想如果你可以通過PHP中的Visibility。只是私人變量不允許被訪問,你現在正在做。你可以做的是

class Penguin extends Animal { 
    public $type = "penguin"; // else keep it as public without changing as in the Animal class 
} 

否則

你可以寫一個方法如下圖所示訪問private $type變量。

從文檔中提取爲便於參考

class MyClass 
{ 
    public $public = 'Public'; 
    protected $protected = 'Protected'; 
    private $private = 'Private'; 

    function printHello() 
    { 
     echo $this->public; 
     echo $this->protected; 
     echo $this->private; 
    } 
} 

$obj = new MyClass(); 
echo $obj->public; // Works 
echo $obj->protected; // Fatal Error 
echo $obj->private; // Fatal Error 
$obj->printHello(); // Shows Public, Protected and Private 
0

你的私有變量是內Penguin類。所以你不能在這堂課的範圍之外使用它。此外,當你正在擴大課程。你不必在你的主頁上也包含animal.php。你只能在private_penguin.php中使用它來擴展。

所以對於企鵝類的代碼應該是這樣的:

include('animal.php'); 
class Penguin extends Animal { 
     private $type = "penguin"; 
     function getPrivateData() 
     { 
      echo $this->type; 
     } 
    } 

,那麼你可以調用它在你主頁。

include('private_penguin.php'); 

$tux = new Penguin(); 
$tux->type = "linux penguin"; 
$tux->getPrivateData(); 

這將使用私有變量。

1

無論何時您將繼承或繼承您的子類中的任何調用,那麼您的父方法或屬性將從子級被覆蓋。所以你的情況你public $type = "animal";從animal.php是得到你的孩子overrided private $type = "penguin";

所以你$this->type總會有性格從企鵝類,即使在動物類也(因爲你已經在你的企鵝類擴展動物類) 。這是面向對象編程的基本現象。