【问题标题】:OOP inheritance in PHPPHP中的OOP继承
【发布时间】:2013-02-11 11:51:10
【问题描述】:

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是public,而Penguin类是private;

你能帮帮我吗!

【问题讨论】:

    标签: inheritance visibility php


    【解决方案1】:

    只要您在子类中扩展或继承任何调用,那么您的父方法或属性将从子类中覆盖。因此,在您的情况下,您来自 animal.php 的 public $type = "animal"; 被您的孩子 private $type = "penguin";

    覆盖

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

    【讨论】:

      【解决方案2】:

      您的私有变量在 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();
      

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

      【讨论】:

        【解决方案3】:

        我想如果你可以通过 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
        

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

          • 但是代码没有任何错误。这是什么原因?!
          • 是的,有。您正在执行$tux->type 分配,它试图从对象外部设置私有类属性。因此错误。
          猜你喜欢
          • 1970-01-01
          • 2014-09-12
          • 1970-01-01
          • 1970-01-01
          • 2013-02-19
          • 2010-12-26
          • 2016-06-25
          • 2018-05-21
          • 1970-01-01
          相关资源
          最近更新 更多