Den*_*nis 1 php inheritance access-levels
abstract class AbstractController
{
protected $repository;
}
class GraphController extends AbstractController
{
private $repository;
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
致命错误:对GraphController :: $ repository的访问级别必须受保护或较弱
为什么?这背后的理论是什么?在某种程度上,当我扩展一个类时,我对类属性(即公共)的访问级别较弱是一种错误的感觉,因为我在某种程度上暴露了父类意味着更严格的变量...
小智 5
这是继承的规则。您可以使继承的成员的可见性变弱(更可见),但不能将其隐藏得更多。因此,您可以将其设为受保护的,也可以设为公开。这样做的理由是,您不应该能够从基类中隐藏成员,或者使成员不如基类作者预期的那样可见。加,是的,远离,不。
小智 5
这是对上面评论的回应,与使成员变量更加明显有关......不一定是对原始问题的回应。
尝试运行这个片段。您会看到仍然有一个同名的私有变量潜伏在您的公共变量下面,并且根据您是通过基类方法还是派生类方法访问它,您将得到不同的结果,因为它们是两个不同的结果实例值。
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");
?><pre><?php
echo '$a->getit(); // ' . $a->getit() . "\n";
echo '$a->hideme; // ' . $a->hideme . "\n";
echo 'doobee($a); // '; doobee($a);
echo 'print_r($a);' . "\n";
print_r($a);
?></pre>
Run Code Online (Sandbox Code Playgroud)
输出:
$a->getit(); // accessor assign
$a->hideme; // direct assign
doobee($a); // accessor assign
print_r($a);
derived Object
(
[hideme] => direct assign
[hideme:baseclass:private] => accessor assign
)
Run Code Online (Sandbox Code Playgroud)
不仅仅是 PHP 具有这种行为方式;例如,C# 也是如此。
所以我想从这一切中得到的结论是,尝试更改派生类中基类实例/成员变量的可见性并不是一个好主意。
| 归档时间: |
|
| 查看次数: |
4815 次 |
| 最近记录: |