首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用parents方法填充子类的数组

使用parents方法填充子类的数组
EN

Stack Overflow用户
提问于 2020-10-19 22:44:06
回答 1查看 107关注 0票数 0

我已经创建了一个具有两个方法的程序员类:

公共方法getLanguage() -它以数组的形式返回程序员知道的所有语言。

公共方法addLanguage() -将一种新语言添加到语言列表中。

代码语言:javascript
复制
class Programmer 
{
    private $languages = [];

    public function getLanguages()
    {
        return $this->languages;
    }

    public function addLanguage($language)
    {
        $this->languages[] = $language;
    }
}

我还创建了另一个ProgrammerTeacher类,它扩展了Programmer,并有一个额外的公共方法:

public method teach(Programmer $programmer,$language) -如果ProgrammerTeacher知道所需的语言,它会教程序员一种语言。

代码语言:javascript
复制
class ProgrammerTeacher extends Programmer
{
    private $languages = [];

    public function teach(Programmer $programmer, $language)
    {
        if(in_array($language, $this->languages)) {
            $programmer->addLanguage($language);

            return true;
        }

        return false;
    }
}

例如,下面的代码显示了ProgrammerTeacher如何教程序员新语言('PHP'):

代码语言:javascript
复制
$teacher = new ProgrammerTeacher();
$teacher->addLanguage('PHP');
$programmer = new Programmer();
$teacher->teach($programmer, 'PHP');
print_r($programmer->getLanguages());

// result print is: Array ()

该数组为空,因为此条件解析为false:

代码语言:javascript
复制
in_array($language, $this->languages)

这很奇怪,因为当我调用:

代码语言:javascript
复制
$teacher->getLanguages()
// result is Array ( [0] => PHP )

我想我没有正确地理解简单的继承。有人能花点时间解释一下这里发生了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2020-10-19 23:00:11

您可以使用公共函数getLanguages()访问您的公共属性,因为关键字$languages意味着每个人都可以访问它。

但是您不能直接访问属性语言,因为它是父类的私有属性。因此,您不应该在子类中重新声明$languages属性,并在"protected“中更改private关键字,以便类ProgrammerTeacher可以访问它。

或者,您可以简单地使用getLanguages()方法,它是公共的。

如果将条件in_array($language,$ this ->languages)替换为以下条件: in_array($language,$this->getLanguages()),就会得到预期的结果。

请原谅我的英语,那不是我的母语!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64429714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档