我已经创建了一个具有两个方法的程序员类:
公共方法getLanguage() -它以数组的形式返回程序员知道的所有语言。
公共方法addLanguage() -将一种新语言添加到语言列表中。
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知道所需的语言,它会教程序员一种语言。
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'):
$teacher = new ProgrammerTeacher();
$teacher->addLanguage('PHP');
$programmer = new Programmer();
$teacher->teach($programmer, 'PHP');
print_r($programmer->getLanguages());
// result print is: Array ()该数组为空,因为此条件解析为false:
in_array($language, $this->languages)这很奇怪,因为当我调用:
$teacher->getLanguages()
// result is Array ( [0] => PHP )我想我没有正确地理解简单的继承。有人能花点时间解释一下这里发生了什么吗?
发布于 2020-10-19 23:00:11
您可以使用公共函数getLanguages()访问您的公共属性,因为关键字$languages意味着每个人都可以访问它。
但是您不能直接访问属性语言,因为它是父类的私有属性。因此,您不应该在子类中重新声明$languages属性,并在"protected“中更改private关键字,以便类ProgrammerTeacher可以访问它。
或者,您可以简单地使用getLanguages()方法,它是公共的。
如果将条件in_array($language,$ this ->languages)替换为以下条件: in_array($language,$this->getLanguages()),就会得到预期的结果。
请原谅我的英语,那不是我的母语!
https://stackoverflow.com/questions/64429714
复制相似问题