首页 > 解决方案 > 停止“成员具有受保护的访问权限”消息

问题描述

我不确定这是一个错误还是我做错了什么,但请考虑以下代码:

父类.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";
    }
}

ParentClass.php然而,PhpStorm在网上显示错误return $obj->a();

成员具有受保护的访问权限

手册说

声明为 protected 的成员只能在类本身内以及通过继承类和父类访问。

这是一个 PhpStorm 错误吗?如果是这样,有没有办法禁用此错误(理想情况下,对于受影响的文件,但全局也可以在紧要关头这样做)。

旁注:我不是在讨论这是否是应该遵循的编码实践,但实际问题深藏在遗留代码中(这不是实际错误)。

标签: phpphpstorm

解决方案


我可以用 phpStorm 2018.1 重现这一点。

这要么是 phpStorm 中的错误,要么只是 phpStorm 的警告,因为即使 PHP 可以通过这种方式访问​​受保护的成员,也应该警告它,因为这是你应该避免的事情。

因为它令人困惑,所以访问范围之外的受保护/私有成员。

解释在这里http://php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-other-objects

相同类型的对象可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为在这些对象内部时,特定于实现的细节是已知的。

您的两个类都是 instanceof ParentClass,因此两者都可以访问彼此的受保护成员和私有成员。

正如 LazyOne 指出的那样,phpStorm 中实际上存在与此和类似效果有关的错误:https ://youtrack.jetbrains.com/issue/WI-11263


推荐阅读