如何告诉PhpStorm有关实现细节的信息?(魔术方法)

11

我有一个名为“User”的对象,其属性的访问性被声明为受保护,但可以通过神奇的__set()方法直接设置。

enter image description here

现在PhpStorm在右侧显示了一个大红色列来表示这个明显的不一致。

是否有可能向PhpStorm解释正在发生什么,以便不再将此显示为错误?


编辑:

我使用PhpStorm 2.1.4

下面是一些代码示例,说明了这个问题(以及Alexey迄今为止提出的建议解决方法,但对我来说很遗憾它行不通):

c.php:

<?php
/**
 * @property mixed $a
 */
class c1
{
    protected $a;

    public function __construct() { $this->a = __CLASS__; }

    public function __get($n) { return $this->{$n}; }
}

/**
 * @property $a mixed
 */
class c2
{
    protected $a;

    public function __construct() { $this->a = __CLASS__; }

    public function __get($n) { return $this->{$n}; }
}

test.php

<?php
require "c.php";

$c1 = new c1();
var_dump($c1->a);

$c2 = new c2();
var_dump($c2->a);

并且输出:

string 'c1' (length=2)
string 'c2' (length=2)

以及在PhpStorm中的外观

输入图像描述

我的目标:

要么让PhpStorm“理解”设计,要么只是摆脱那些令人讨厌的红色标记,同时不影响除此问题之外的错误检测。

1个回答

8

现在在PHPStorm 3中可以正常工作:)

不幸的是,这是我们跟踪器中的一个开放请求,请参见 http://youtrack.jetbrains.net/issue/WI-4468

现在避免这些警告的唯一方法是,在$user的类声明中添加@property。即:

/**
 * @property $name string
 */
class User {
    protected $name; 
}
$user = new User();
$user->name = "me";

解决方法并不能改变PHPStorm将访问解释为错误的事实。 - Raffael
1
好的,我添加了完整的示例。而且我是IDE中这些检查的开发人员。如果对您不起作用,请转到我们的跟踪器并提供您的代码以进行复制。 - Alexey Gopachenko
如果它是一个重载方法而不是与其同名的受保护属性,那该怎么办呢?protected function foo($a, $b);public function __call($m, $p)。我无法在不更改所有方法名称的情况下解决这个错误。 - Keyne Viana
那么如何告诉IDE在不修改源类注释的情况下隐藏这些检查呢?即原始类具有受保护的方法/字段,但通过某些魔法转换它们变为公共的并且保证工作。如何隐藏这些检查和红色标记呢? - Alexander Pravdin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接