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
【讨论】:
不用打开,有gettergetSalary
。
我保留了private $salary;
,因为它在 BaseEmployee 类中,并在 calculateMonthlyPay 方法中将 return $this->salary / 12;
更改为 return $this->getSalary() / 12;
,它起作用了!谢谢!!!【参考方案3】:
您将$salary
定义为private
这意味着继承类将无权访问它。如果Employee
应该访问它,您需要将$salary
定义为protected
或使用getSalary()
【讨论】:
非常感谢您的解释!我将其更改为私有,并且有效!以上是关于PHP - 子类没有从父类继承[重复]的主要内容,如果未能解决你的问题,请参考以下文章