【问题标题】:PhpStorm Field accessed via magic method通过魔术方法访问的 PhpStorm 字段
【发布时间】:2014-10-24 01:51:58
【问题描述】:

我已经在我的 CodeIgniter 库文件夹中点燃了数据表库。

库中的一些代码

class Datatables
{
    /**
     * Global container variables for chained argument results
     *
     */
    protected $ci;
    protected $table;
    protected $distinct;
    protected $group_by;
    protected $select         = array();
    protected $joins          = array();
    protected $columns        = array();
    protected $where          = array();
    protected $filter         = array();
    protected $add_columns    = array();
    protected $edit_columns   = array();
    protected $unset_columns  = array();

    /**
     * Copies an instance of CI
     */
    public function __construct()
    {
        $this->ci =& get_instance();
    }

然后我调用了model中的库

class Common_Model extends MY_Model{

    function __construct(){
        parent::__construct();
        $this->load->library('Datatables.php');
    }

然后我尝试调用库函数

function select_fields_joined_DT($data, $PTable, $joins = '', $where = '', $addColumn = '',$unsetColumn='')
{
    /**
     *
     */
    $this->datatables->select($data);
    if ($unsetColumn != '') {
        unset_column($unsetColumn);
    }
        $this->datatables->from($PTable);
    if ($joins != '') {
        foreach ($joins as $k => $v) {
            //$this->datatables->join($v['table'], $v['condition'], $v['type']);
        }
    }

    if ($addColumn != '') {
        $this->datatables->add_column("Actions", $addColumn);
    }

    $result = $this->datatables->generate();
    return $result;
}

一切正常,除了 phpstorm 向我显示此错误:

Field Accessed via magic method

我尝试使用文档 cmets 删除此错误,但不知道该怎么做。 任何帮助将不胜感激。

【问题讨论】:

  • 您必须在属于该类的 PHPDoc 注释中通过 @property 声明它们。
  • 有没有办法做到这一点,而无需触及声明类的文件?例如,如果该类是第三方库的一部分,并且我不想为该代码制作自定义补丁只是为了添加这些 @property cmets?
  • @Enno 您找到问题的答案了吗?我也遇到和你一样的问题。我能想到的唯一方法是创建一个扩展第三方类的类,然后添加@property?但不确定它是否会起作用。
  • @markandrewkato 我认为是否可以扩展课程很大程度上取决于您的情况。就我而言,这是不可能的,老实说,我不再记得我做了什么。
  • @Enno 没问题。由于我无法向第三方添加文档并且我也不想扩展,所以我只是按照下面的答案。谢谢!

标签: php codeigniter phpstorm


【解决方案1】:

编辑:仅仅因为我一直对此表示赞同,所以我想在这个答案前加上一个警告。我继承了一个旧项目,我不会长期从事该项目,也不会为正确输入所有内容而获得报酬。我认为以下是核选项,并且只会在类似条件下这样做。如果这是您拥有的项目或至少将长期工作,尤其是在现代 PHP 7/8 及以后的时代,请不要这样做,而是使用实际类型或至少一个 docblock 来整理您的代码: ) 原始答案如下。

如果您想在没有文档 cmets 的情况下删除它,您可以取消选中 Notify about access to a property via magic method,该方法位于

项目设置 > 检查 > PHP > 未定义 > 未定义属性

PhpStorm preferences screenshot

【讨论】:

  • 不知道该笑还是该哭。我最近从 Idea 切换到独立的 phpstorm 并且再次遇到这个问题我用谷歌搜索了这个通知以找到这个 SO 问题。我不喜欢赞成的答案,并发现@LazyOne 的评论正是我想要的。然后意识到这个答案是我的......
  • 我将 LazyOne 的评论设为社区回答。随意添加或更正信息。
  • 干得好。我现在正面临这个问题。当然,我有点习惯 PyCharm 与 Python 的关系。我是 PhpStorm 的新手。很容易找到这条路线并取消选中未定义的属性。这很好,因为当我与 Laravel 一起工作时......一直在发生!非常感谢!
  • @Bitart check out github.com/barryvdh/laravel-ide-helper 我不会再遇到未定义的问题了
  • 看到 chrisan 的评论忍不住笑了。
【解决方案2】:

As mentioned by LazyOne在问题cmets:

您必须在 PHPDoc 注释中通过 @property 声明它们 属于那个类。

/**
 * @property string $bar
 */
class Foo {

    public function __get($name) {
        if ($name == 'bar') {
            return 'bar';
        }
        return NULL;
    }
}

摘自 Dmitry Dulepov 的文章 "Quick tip: magic methods and PhpStorm"

【讨论】:

  • 文章链接失效。
  • @CraigLondon 不需要该文章,因为所有内容都在答案中,并且该链接仅作为来源提供。尽管如此,我还是用wayback machine 快照链接更新了它。
  • 老实说,我比选择的答案更喜欢这个。它提供了一种明确说明我们可以从类中获得什么的方法,而不是仅仅将其全部交给魔术和可能的输入错误
【解决方案3】:

如果您不想禁用整个项目的检查,并且无法修改类文件以添加@property标签,这是在使用它的位置抑制警告的方法:

/** @noinspection PhpUndefinedFieldInspection */

只需将它添加到使用魔法字段的行之前的新行中。

【讨论】:

【解决方案4】:

@christian answer 仍然有效,但禁用检查的路径最近发生了变化。

这是新的:

首选项 > 编辑器 > 检查 > PHP > 未定义符号 > 未定义属性

然后禁用“通过魔术方法访问属性的通知”。

【讨论】:

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