[英]Why do I get an “Access Level must be protected or weaker” after extending a protected class variable and marking it private?
abstract class AbstractController
{
protected $repository;
}
class GraphController extends AbstractController
{
private $repository;
}
我收到此错误:
致命错误:对GraphController :: $ repository的访问级别必须受保护或较弱
为什么? 这背后的理论是什么? 在某种程度上,当我扩展一个类时,我对类属性(即公共)的访问级别较弱是一种错误的感觉,因为我在某种程度上暴露了父类意味着更严格的变量...
这是继承的规则。 您可以使继承成员的可见性变弱(更明显),但不能将其隐藏得更多。 因此,您可以将其设为受保护的,也可以设为公开。 这样做的理由是,您不应该能够从基类中隐藏成员,或者使成员不如基类作者预期的那样可见。 加,是的,远离,不。
这是对上面评论的一种回应,它与使成员var更加可见有关……不一定是对原始问题的回应。
尝试运行此片段。 您会看到在您的公共变量下仍然有一个同名的私有变量,并且取决于您是通过基类方法还是派生类方法访问它,您将得到不同的结果,因为它们是两个不同的实例值。
class baseclass {
private $hideme;
public function getit() { return $this->hideme; }
public function setit($value) { $this->hideme = $value; }
}
class derived extends baseclass {
public $hideme;
}
function doobee(baseclass $obj) {
echo $obj->getit() . "\n";
}
$a = new derived();
$a->hideme = "direct assign";
$a->setit("accessor assign");
echo $a->getit() . "\n";
echo $a->hideme . "\n";
doobee($a);
print_r($a);
行为不只是PHP。 例如,C#也是如此。
因此,我想从这一切中得出的结论是,尝试更改派生类中基类实例/成员var的可见性不是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.