PhpStorm动态类方法警告

kjd*_*n84 1 php phpstorm

我试图让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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PhpStorm正在向我发出有关未找到的以下方法的警告:

  • exists_by_duplicate_fields
  • set_id_by_duplicate_fields
  • update_by_data_names
  • 创建

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

Axa*_*lix 6

我会怎么做:

  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();
}
Run Code Online (Sandbox Code Playgroud)

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

/** @var MyParent $object */
$object = new $object_name();
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 你也可以在/** @var Field[] */上面添加public $fields;它应该帮助PhpStorm了解$fields每次使用它时如何对待成员.

  2. 如果所有具有名称的类$object_name实际上都可以从a继承,那将是很好的PARENT_CLASS.

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