为啥我不能在 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 中调用这个受保护的函数?的主要内容,如果未能解决你的问题,请参考以下文章

我可以/如何...在 PHP 中的类之外调用受保护的函数

为啥Java抽象类中需要受保护的构造函数

为啥不能在 PHP 中从抽象类中调用抽象函数?

为啥我不能访问派生构造函数的成员初始化列表中继承的受保护字段?

为什么派生类d的对象不能调用基类的受保护成员函数?

如何从 Derived 内部调用 Base 实例中的受保护成员函数?