2013-02-26 122 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总会有性格从企鹅类,即使在动物类也(因为你已经在你的企鹅类扩展动物类) 。这是面向对象编程的基本现象。