繁体   English   中英

扩展受保护的类变量并将其标记为私有后,为什么会得到“必须保护或弱于访问级别”的提示?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM