【问题标题】:Resolve PhpStorm magic method and property warning using PHPDoc @property and @method for $this->stdout->styles使用 PHPDoc @property 和 @method for $this->stdout->styles 解决 PhpStorm 魔术方法和属性警告
【发布时间】:2016-07-19 14:39:26
【问题描述】:

我正在尝试解决

“在...中找不到字段'stdout'”

“方法...未在数组中找到”

在 PhpStorm 上使用 PHPDocumentor 符号 @property@method 发出警告

我能够使用以下方法解决标准输出警告:

* @property array stdout

但是现在您如何解决Method 'styles' not found in array 警告? (见上图)


我编写了这段代码来展示我想要实现的目标:

* @method array $stdout->styles(array $name, array $items)

这是一个使用 CakePhp 的 Command Shell 的 CakePhp 2 项目。

stdout->styles 在框架中声明。

对于更多上下文,这是我的代码的样子:

<?
class InvoiceShell extends AppShell {
    public $uses = array('Invoice', 'Request');

    public function main() {

        $this->stdout->styles('success', ['text' => 'green']);
        $this->stdout->styles('danger', ['text' => 'red']);
        $this->stdout->styles('bold', ['bold' => true]);

        .
        .
        .
    }
}

【问题讨论】:

  • 1) 什么是stdout? 2)它是如何声明的? 3) 如果它像stdout-&gt;styles 一样使用.. 那么你为什么要尝试将stdout 声明为数组(当它在这里显然是一个对象时)? 3) * @method array $stdout-&gt;styles(array $name, array $items) -- 完全错误 -- 你不能这样声明子属性/子方法 -- 只有直接元素。这意味着(使用您的示例)充其量是* @method array styles(array $name, array $items)(这对于您的情况仍然是错误的——但这只是为了说明正确的语法)。
  • @lazyone 感谢您的回复,我已在问题中添加了更多信息。 stdoutstyles 在 CakePHP 框架中定义。它不在我的控制范围内。
  • 那么 .. stdout 是什么?它是什么类型的?因为您可以轻松使用* @property MyStdoutClass $stdout,仅此而已(只需使用正确的类名而不是 MyStdoutClass)。不幸的是,我不是 CakePHP 用户,所以不能在不知道细节的情况下立即为您提供 100% 正确的解决方案。附:如果你不知道stdout 是什么类型——你可以尝试调试这样的脚本——xdebug 会告诉它是什么类型/类。
  • 感谢@LazyOne!我找到了类型,它是ConsoleOutput@property ConsoleOutput stdout 工作。如果您愿意,您可以从中创建一个答案,我很乐意接受作为答案。

标签: php cakephp-2.0 phpstorm phpdoc


【解决方案1】:

您需要通过在您的 @property 声明中将 array 替换为 ConsoleOutput 来告诉 PHPDoc/PhpStorm 正确的 stdout 类型。

/**
 * My cool class is cool.
 *
 * @property ConsoleOutput $stdout
 */

如果对象是具有自己的魔术访问器的通用容器,您可以声明一个接口,仅用于 PhpStorm 的代码完成。只需在位于您项目的 Sources 文件夹之一的文件中声明它即可。

/**
 * @method mixed styles(string, mixed)
 * @method ...
 */
interface FakeForCodeCompletion { }

然后使用@property 在您的类中引用FakeForCodeCompletion(最好是描述性名称),就好像它是一个真正的类/接口一样。

【讨论】:

    【解决方案2】:

    有类似问题的可以使用这个。

    /** @var $items \Data\Items | mixed */
    
    $items = new \Data\Items;
    
    $items->method('data');
    $items->item->method('data');
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2015-02-04
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多