PHP - 子类没有从父类继承[重复]

Posted

技术标签:

【中文标题】PHP - 子类没有从父类继承[重复]【英文标题】:PHP - child class is not inheriting from parent class [duplicate] 【发布时间】:2020-02-09 23:51:18 【问题描述】:

这是 PacktPub 的《开始 php》第 3 课中的活动。据我了解,它应该创建 Employee 类的实例 $markus 。 Employee 类是 BaseEmployee 的子类,因此继承了 BaseEmployee 的所有内容。但是,如果我尝试使用方法 calculateMonthlyPay(),则会出现通知并且程序无法正确运行。我正在使用 PHP7+ 和 PHPStorm IDE。这是通知消息和代码:

通知消息:

注意:未定义的属性:第 40 行 C:\Users\ed.PhpStorm2019.2\config\scratches.\scratch_3.php 中的 Employee::$salary PHP 通知:未定义属性:C:\Users\ed.PhpStorm2019.2\config\scratches\scratch_3.php 中的 Employee::$salary 第 40 行 月薪为0 进程以退出代码 0 结束

代码:

<?php
class BaseEmployee 
  private $name;
  private $title;
  private $salary;

  function __construct($name, $title, $salary)
    $this->name = $name;
    $this->title = $title;
    $this->salary = $salary;
  

  public function setName($name)
    $this->name = $name;
  

  public function setTitle($title)
    $this->title = $title;
  

  public function setSalary($salary)
    $this->salary = $salary;
  

  public function getName()
    return $this->name;
  

  public function getTitle()
    return $this->title;
  

  public function getSalary()
    return $this->salary;
  


class Employee extends BaseEmployee
  public function calculateMonthlyPay()
    return $this->salary / 12;
  


$markus = new Employee("Markus Gray", "CEO", 100000);
echo "Monthly Pay is" . $markus->calculateMonthlyPay();

【问题讨论】:

【参考方案1】:

通知不是错误。通知旨在指出您可能想或不想调查的事情。

在这种情况下,您声明了一个具有私有变量的基类。私有变量和方法只对该类的对象可见。

当您从基类派生时,您希望将变量声明为私有或受保护,以及将方法声明为受保护或公有,但是您的错误是尝试直接在派生类中访问私有变量。您应该在子方法中使用 $obj->getSalary()。

【讨论】:

供您参考,大部分通知将很快升级为PHP中的警告或错误。不要忽视通知! 我没有说忽略它们,我说它们是信息性的。实际学习一门语言的工作原理是无可替代的。 感谢您对通知和范围修饰符的解释。这段代码来自教科书,他们还没有解释“受保护”。非常感谢!【参考方案2】:

不继承私有属性。在您的情况下,您的 $salary 属性被定义为私有,这意味着它只能在基类中访问。如果您希望它在子类中使用,而不是在外部使用,则可以使用protected

<?php
class BaseEmployee 
    private $salary; // <-- defined as private


class Employee extends BaseEmployee 
    public function calculateMonthlyPay() 
        return $this->salary / 12; // This will trigger notice
    


// ---------------------

class BaseEmployee 
    protected $salary; // <-- defined as protected


class Employee extends BaseEmployee 
    public function calculateMonthlyPay() 
        return $this->salary / 12; // This will work
    

【讨论】:

不用打开,有getter getSalary 我保留了private $salary;,因为它在 BaseEmployee 类中,并在 calculateMonthlyPay 方法中将 return $this-&gt;salary / 12; 更改为 return $this-&gt;getSalary() / 12;,它起作用了!谢谢!!!【参考方案3】:

您将$salary 定义为private

这意味着继承类将无权访问它。如果Employee 应该访问它,您需要将$salary 定义为protected 或使用getSalary()

【讨论】:

非常感谢您的解释!我将其更改为私有,并且有效!

以上是关于PHP - 子类没有从父类继承[重复]的主要内容,如果未能解决你的问题,请参考以下文章

子类从父类继承过来的方法可以操作子类自己定义的成员变量吗

从子类中删除从父类继承的特定方法

Java 继承

简述在类的继承关系中,子类可以继承父类的都有哪些成员

继承和多态

无法查看从父类继承的属性 [重复]