我不确定这是否是错误或做错了什么,但请考虑以下代码:
ParentClass.php
<?php
class ParentClass {
public static function getA() {
$obj = new ChildClass();
return $obj->a();
}
}
ChildClass.php
<?php
class ChildClass extends ParentClass {
protected function a() {
return "a";
}
}
但是PhpStorm在ParentClass.php
行的return $obj->a();
中显示了一个错误:
成员具有受保护的访问权限
被声明为受保护的成员只能在该类本身内并通过继承和父类类来访问。
这是PhpStorm错误吗?如果是这样,则有一种方法可以禁用此错误(理想情况下,对于受影响的文件,但在全局范围内也会出现这种情况)。
旁注:我不是在讨论这是否应该遵循的编码实践,但是实际问题是遗留代码中的深层问题,我非常不愿意修改,并且导致我的项目导航栏到处都是波浪状的红线。指示错误(不是实际错误)。
答案 0 :(得分:1)
我可以使用phpStorm 2018.1。复制它。
这是phpStorm中的错误,还是phpStorm的警告,因为即使PHP可能以这种方式访问受保护的成员,也应警告您,因为这是您应该避免的事情。
由于令人困惑,因此无法访问范围之外的受保护/私有成员。
解释在这里http://php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-other-objects
相同类型的对象将可以彼此私有访问, 受保护的成员即使它们不是同一实例。这是 因为具体的实现细节在什么时候是已知的 在这些对象内部。
您的两个类都是ParentClass
的instanceof,因此两者都可以互相访问受保护的成员和私有成员。
正如LazyOne所指出的那样,phpStorm中实际上存在有关此效果和类似效果的错误:https://youtrack.jetbrains.com/issue/WI-11263
答案 1 :(得分:0)
ParentClass无法访问孩子的a()方法,因为它的父类没有该函数,它没有继承该函数,并且受到保护,因此您不能从其类外部或从其派生的类中调用它ChildClass。
如果在ParentClass中定义了a(),则可以在ChildClass中创建函数getA(),然后它将可以访问a()