为啥我不能在 PHP 中调用这个受保护的函数?
Posted
技术标签:
【中文标题】为啥我不能在 PHP 中调用这个受保护的函数?【英文标题】:Why can't i call this protected function in PHP?为什么我不能在 PHP 中调用这个受保护的函数? 【发布时间】:2013-10-17 02:09:11 【问题描述】:这可能是一个基本问题,但我正在按照本教程进行操作,有时代码看起来像这样。
<?php
class person
public $name;
public $height;
protected $social_security_no;
private $pin_number = 3242;
public function __construct($person_name)
$this->name = $person_name;
public function set_name($new_name)
$this->name = $new_name;
protected function get_name()
return $this->name;
public function get_pin_number_public()
$this->pub_pin = $this->get_pin_number();
return $this->pub_pin;
private function get_pin_number()
return $this->pin_number;
class employee extends person
public function __construct($person_name)
$this->name = $person_name;
protected function get_name()
return $this->name;
但是当我使用这个时
<?php include "class_lib.php";?>
</head>
<body id="theBody">
<div>
<?php
$maria = new person("Default");
$dave = new employee("David Knowler");
echo $dave->get_name();
?>
我收到这个错误
致命错误:调用受保护的方法employee::get_name() from C:\Users\danny\Documents\Workspace\test\index.php 中的上下文'' 第 13 行
问题似乎是当我在员工类的 get_name() 函数中添加 protected 时,但在我看来,这是本教程中覆盖的首选方法。有什么想法吗?
【问题讨论】:
受保护的方法不能在类外调用 【参考方案1】:问题不在于您无法覆盖受保护的方法,而在于您正在从类外部调用受保护的方法。
类实例化后,您可以调用一个公共方法,该方法又可以调用get_name()
,您将看到代码将按预期工作。
例如:
class employee extends person
function __construct($person_name)
$this->name = $person_name;
protected function get_name()
return $this->name;
public function name()
return $this->get_name();
$dave = new employee("David Knowler");
echo $dave->name();
在您的示例中,您最好将get_name()
公开。
【讨论】:
【参考方案2】:您可以在人员类或雇员类中访问 get_name(),而不是在这两个类之外。
检查受保护的可见性
http://php.net/manual/en/language.oop5.visibility.php
【讨论】:
【参考方案3】:“问题似乎是当我将protected
添加到员工类中的get_name()
函数时”——这就是你的答案。受保护的方法只能从相同的类或子类调用,而不是“从外部”调用。如果您想以这种方式使用,您的方法必须是公开的。
【讨论】:
我必须把它交给你,因为我的答案更多的是为什么而不是如何。不过,每个人都会获取有用的信息。谢谢以上是关于为啥我不能在 PHP 中调用这个受保护的函数?的主要内容,如果未能解决你的问题,请参考以下文章