0

我对 PHP 中的 OOP 继承有一些问题。我有 2 个班级,动物和企鹅。企鹅扩展了动物。我的源代码是这样的:

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::$type 的访问级别必须是公共的。但我没有。哪一个是正确的!

在 Animal 类中 $type 是公共的,但 Penguin 类是私有的;

你能帮助我吗!

4

4 回答 4

3

不能从outside类中访问私有变量。例如

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

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

这就是拥有私有变量的全部意义——防止“外部”代码弄乱对象的内部。

于 2013-02-26T05:44:19.640 回答
1

每当您在子类中扩展或继承任何调用时,您的父方法或属性将从子类中覆盖。所以在你的情况下,你的public $type = "animal";from animal.php 被你的孩子覆盖了 private $type = "penguin";

因此,您$this->type将始终具有企鹅班的角色,即使在动物班中也是如此(因为您在企鹅班中扩展了动物班)。这是面向对象编程的非常基本的现象。

于 2013-03-30T14:59:07.973 回答
0

您的私有变量在Penguinclass 内。所以你不能在这个类的范围之外使用它。此外,当您扩展一个类时。您也不必在主页上包含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();

这将使用私有变量来完成。

于 2013-02-26T05:56:14.287 回答
0

我想如果你可以通过PHP中的可见性。您现在正在做的只是不允许访问私有变量。你可以做的是

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
于 2013-02-26T05:47:13.013 回答