2017-01-29 17 views
1

私は動的に初期化されたクラスのメソッドに関する警告を停止するように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(); 
     } 
    } 
} 

PhpStormは私に次のメソッドに関する警告を与えている:ここで

は私のメソッドのコードです

  • exists_by_duplicate_fields
  • set_id_by_duplicate_fields
  • update_by_data_names
  • 作成

私は、すべての行の上に/** @noinspection PhpUndefinedMethodInspection */を使用できることを知っていますが、これを行うより良い方法があるのでしょうか?

答えて

4

私はどうなるのか:

  1. 抽象クラスを作成します。

  2. 抽象クラスに欠けているメソッドを追加します。彼らは、抽象的であるか、または正しいリターンで実際に実装する必要があります。あなたのコード内のどこかで、その後

    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(); 
    } 
    

    そして:

    - 本物のクラス

例でPARENT_CLASSを置き換える /** @var PARENT_CLASS $object */:ライン$object = new $object_name();上記

  • このたPHPDoc命令を追加

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

    注:

    1. また、あなたはそれを使用するときには、PhpStormが$fieldsメンバー毎回の処理方法を理解するのに役立つはずですpublic $fields;/** @var Field[] */を追加することができます。

    2. 名前が$object_nameのすべてのクラスが実際にPARENT_CLASSから継承されていればいいと思います。

    3. 必要に応じて抽象メソッドを実装に置き換えることができます。

  • +1

    これは私がやっていることです。この抽象クラスを持つことは非常に役に立ちます。なぜなら、このヘルパーメソッドによって利用されるオブジェクトにどのメソッドとプロパティが必要なのかを明確に示すからです。 – kjdion84

    関連する問題