2017-01-29 7 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. Добавить отсутствующие методы в вашем абстрактном классе. Они должны быть абстрактными или выполнять реальную реализацию с правильным возвратом.

  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. Вы также можете добавить /** @var Field[] */ выше public $fields; Это должно помочь PhpStorm понять, как лечить $fields член каждый раз, когда вы используете его.

  2. Было бы хорошо, если бы все эти классы с именами $object_name действительно могли быть унаследованы от PARENT_CLASS.

  3. Вы можете заменить абстрактные методы с реализацией, если это необходимо.

+1

Да, это то, с чем я иду. Очень полезно иметь этот абстрактный класс, потому что он дает мне четкое представление о том, какие методы и свойства необходимы для любого объекта, используемого этим вспомогательным методом. – kjdion84