【问题标题】:How to tell PhpStorm about implementation details? (magic methods)如何告诉 PhpStorm 实现细节? (魔术方法)
【发布时间】:2011-11-30 12:33:01
【问题描述】:

我有一个对象“用户”,它的可访问性被声明为受保护的属性,但可以通过魔术 __set 方法直接设置。

现在 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 “理解”设计,要么只是在不影响除此问题之外的错误检测的情况下摆脱那些到处都是恼人的红色标记。

【问题讨论】:

    标签: phpstorm


    【解决方案1】:

    这现在在 PHPStorm 3 中运行 :)

    很遗憾,这是我们跟踪器中的一个公开请求,请参阅 http://youtrack.jetbrains.net/issue/WI-4468

    现在避免此警告的唯一方法是将@property 添加到 $user 的类声明中。即

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

    【讨论】:

    • 解决方法不会改变 PHPStorm 将访问解释为错误。
    • 好吧,我添加了完整的示例。我是 IDE 中这些检查的开发者。如果它不适合您 - 转到我们的跟踪器并提供您的代码以进行重现。
    • 如果它是一个重载的方法而不是定义为受保护的属性(同名)怎么办? protected function foo($a, $b);public function __call($m, $p) 如果不更改所有方法的名称,我将无法绕过此错误。
    • 那么如何告诉 IDE 在不修改源类注释的情况下隐藏这些检查? IE。原始类具有受保护的方法/字段,但通过一些神奇的转换,它们变得公开并保证工作。如何隐藏这些检查和红色标记?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2018-01-16
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多