[英]why can't I access a protected method from a private method if the protected ones are inherited by the subclasses?
我不明白这个特殊情况或亚历山大所说的话。
class实例和class不一样?
正如 Alexander Larikov 所说,您不能从class 实例访问受保护的方法,但不仅是受保护的方法,而且您也不能从 class 实例访问私有方法。 要从子类的实例访问父 class 的受保护方法,您在子类中声明一个公共方法,然后从子类的公共方法调用父 class 的受保护方法,即
亚历山大的解决方案:
class testgiver{
protected function dbConnect($userconnecttype)
{
echo "dbConnect called with the argument ".$userconnecttype ."!";
}
}
class testprinter extends testgiver
{
// WHAAAAAT? WHYYYYY?
public function buildquestionarray() // public instead of private so you can call it from the class instance
{
$this->dbConnect('read');
}
}
$tp=new testprinter();
$tp->buildquestionarray(); // output: dbConnect called with the argument read!
如果子类继承了受保护的方法,为什么我不能从私有方法访问受保护的方法?
解决方案前的代码:
以下代码中 testprinter 的第 726 行:
private function buildquestionarray()
{
$query = "etc etc";
**$conn = $this->dbConnect('read');
$result = $conn->query($query);
...
Testprinter 扩展了 testgiver。 这是 class 的分机:
require_once('testgiver.php');
class testprinter extends testgiver
{...
以及 testgiver 中方法的声明:
protected function dbConnect($userconnecttype)
{...
他们并没有在其他答案中真正解释清楚。
属性和方法(我将统称为“名称”)的可见性由尝试访问该名称的代码的运行位置控制。 它可以在顶级代码、常规 function 或 class 方法中。 如果它在方法中,重要的是定义方法的 class。
它不是基于访问该名称的实例的 class。
private
,则只能在声明名称的 class 的方法中使用该名称。protected
,您可以在该 class 的方法中引用它,也可以在父或后代 class 的方法中引用它。public
(默认,如果属性是动态添加的,这也适用),您可以从任何地方引用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.