1

这可能是一个基本问题,但我正在按照本教程进行操作,有时代码看起来像这样。

<?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();
?>

我得到这个错误

致命错误:从第 13 行 C:\Users\danny\Documents\Workspace\test\index.php 中的上下文 '' 调用受保护的方法 employee::get_name()

问题似乎是当我将 protected 添加到员工类中的 get_name() 函数时,但在我看来,这是本教程中覆盖的首选方法。有任何想法吗?

4

3 回答 3

3

问题不在于您不能覆盖受保护的方法,而在于您正在从类外部调用受保护的方法。

类实例化后,您可以调用一个公共方法,该方法又可以调用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()公开。

于 2013-10-09T15:56:44.710 回答
2

“问题似乎是当我添加protectedget_name()员工类中的函数时”——这就是你的答案。受保护的方法只能从相同的类或子类调用,而不是“从外部”调用。如果您想以这种方式使用它,您的方法必须是公开的。

于 2013-10-09T15:52:45.930 回答
2

您可以在人员类或雇员类中访问 get_name(),而不是在这两个类之外。

检查受保护的能见度

http://php.net/manual/en/language.oop5.visibility.php

于 2013-10-09T15:56:54.953 回答