【问题标题】:PhpStorm dynamic class method warningPhpStorm 动态类方法警告
【发布时间】:2017-01-30 06:07:52
【问题描述】:

我试图让 PhpStorm 停止警告我动态初始化类的方法。

这是我的方法的代码:

function create_or_update_objects ($object_name, $method_callbacks = []) {
    // grab duplicate field names used to check for existing objects
    $field = new Field();
    $duplicate_field_names = $field->fetch_duplicate_names();

    foreach ($_SESSION['objects'] as $session_object) {
        $object = new $object_name();

        // set object properties
        foreach ($session_object as $key => $value) {
            if (property_exists($object, $this->data[$key]['name'])) {
                $object->{$this->data[$key]['name']} = $value;
            }
            else {
                $object->fields[$this->data[$key]['name']] = $value;
            }
        }

        // perform object method callbacks
        foreach ($method_callbacks as $method_callback) {
            $object->$method_callback();
        }

        if ($object->exists_by_duplicate_fields($duplicate_field_names)) {
            // object already exists, update by data field names
            $object->set_id_by_duplicate_fields($duplicate_field_names);
            $object->update_by_data_names($this->data);
        }
        else {
            // object does not exist, create it
            $object->create();
        }
    }
}

PhpStorm 就以下未找到的方法向我发出警告:

  • exists_by_duplicate_fields
  • set_id_by_duplicate_fields
  • update_by_data_names
  • 创建

我知道我可以在每一行上方使用/** @noinspection PhpUndefinedMethodInspection */ - 但我想知道是否有更好的方法来做到这一点?

【问题讨论】:

    标签: php phpstorm


    【解决方案1】:

    我会做什么:

    1. 创建一个抽象类。

    2. 在抽象类中添加缺失的方法。它们应该是抽象的或以正确的回报投入实际实现。

    3. $object = new $object_name(); 上面添加这个 PHPDoc 指令: /** @var PARENT_CLASS $object */ - 只需将 PARENT_CLASS 替换为真正的类

    例子:

    abstract class MyParent {
       public $fields;
    
       abstract public function exists_by_duplicate_fields($duplicate_field_names);
       abstract public function set_id_by_duplicate_fields($duplicate_field_names);
       abstract public function update_by_data_names($data);
       abstract public function create();
    }
    

    然后在你的代码中的某个地方:

    /** @var MyParent $object */
    $object = new $object_name();
    

    注意事项:

    1. 您也可以在public $fields;上方添加/** @var Field[] */,这应该有助于PhpStorm了解每次使用时如何对待$fields成员。

    2. 如果所有名称为 $object_name 的类实际上都可以从 PARENT_CLASS 继承,那就太好了。

    3. 如果需要,您可以用实现替换抽象方法。

    【讨论】:

    • 是的,这就是我要做的。拥有这个抽象类非常有帮助,因为它让我清楚地表明了这个辅助方法使用的任何对象都需要哪些方法和属性。
    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多