Как Сделать Объекты Из Массивов В Php С Подсказками?

Когда вы устали запоминать ключи массива и хотите воспользоваться подсказками любимого редактора кода, на помощь придет PHPDoc и немного изобретательности.

Недавно я хорошо познакомился с TypeScript и осознал красоту строгой типизации.

Как приятно, когда редактор кода сообщает, какие поля есть в объекте и что с ними можно делать!



В чем проблема?

Я работаю с CMS Битрикс и мне приходится иметь дело с массивами разной формы и содержания, запоминать все ключи или искать их в документации.

Это отнимает драгоценное время.

Решение: Первое, что приходит на ум — использовать PHPDoc, но тут возникает проблема:

  
  
   

/** * int[] * array * array<string> */

Вы не можете написать многомерный массив так, как предлагает редактор кода.

Все найденные мной варианты не работают в VSCode и PhpStorm. Погуглив, я нашел вариант, который работал только в VSCode.

/** * @var array $arr $arr * @var array $arr['fields'] * @var array $arr['fields']['fieldName'] * @var array $arr['fields']['fieldName']['name'] * @var array $arr['fields']['fieldName']['model'] * @var array $arr['fields'][fieldName]['width'] * @var array $arr['fields'][fieldName]['align'] * @var array $arr['fields'][fieldName]['format'] * @var array $arr['fields'][fieldName]['title'] * @var array $arr['fields'][fieldName]['desc'] * @var array $arr['fields'][fieldName]['readonly'] * @var array $arr['fields'][fieldName]['type'] * @var array $arr['fields'][fieldName]['options'] * @var array $arr['fields'][fieldName]['editor'] * @var array $arr['fields'][fieldName]['default'] **/ $arr = [ 'fields' => [ 'fieldName' => [] ] ];

В этом случае среда подскажет вам, какой ключ вы можете выбрать:

Как сделать объекты из массивов в PHP с подсказками?

Есть плагин для PhpStorm. глубокое-ассоциированное завершение , для него требуется описание массива в определенном формате:

/** * @var array $arr = [ * 'fields' => [ // Defines the feilds to be shown by scaffolding * $anyKey => [ * 'name' => 'sale', // Overrides the field name (default is the array key) * 'model' => string, // (optional) Overrides the model if the field is a belongsTo associated value. * 'width' => '100px', // Defines the width of the field for paginate views. Examples are "100px" or "auto" * 'align' => 'center', // Alignment types for paginate views (left, right, center) * 'format' => 'nice', // Formatting options for paginate fields. Options include ('currency','nice','niceShort','timeAgoInWords' or a valid Date() format) * 'title' => 'Sale', // Changes the field name shown in views. * 'desc' => 'A deal another person that results in money', // The description shown in edit/create views. * 'readonly' => false, // True prevents users from changing the value in edit/create forms. * 'type' => 'password', // Defines the input type used by the Form helper * 'options' => ['option1', 'option2'], // Defines a list of string options for drop down lists. * 'editor' => false, // If set to True will show a WYSIWYG editor for this field. * 'default' => '', // The default value for create forms. * ], * ], * ] */ $arr=[ 'fields' => [ '0' => [ 'model' => 2 ] ] ];

В этом случае среда предлагает следующие ключи:

Как сделать объекты из массивов в PHP с подсказками?

Остается одна проблема, если мы хотим таких подсказок, нам нужно сделать подобное описание в каждом файле, где находится наш массив.

Особенно это актуально для Битрикс.

Мое решение: Редактор кода хорошо индексирует объекты, так почему бы нам не привести массив к объекту и не описать его?! Но как описать объект без класса, ведь в этом тоже помогает PHPDoc? Мы можем создать класс, в котором описываем все нужные нам поля.

И вот теперь нам уже рассказывает наш редактор.



Как сделать объекты из массивов в PHP с подсказками?

Хорошо, что дальше? Мы можем описывать многомерные массивы так же, как описываем интерфейсы в TS. Либо выносим вложенный массив в отдельный класс:

Как сделать объекты из массивов в PHP с подсказками?

Или пишем в конструкторе текущего класса:

Как сделать объекты из массивов в PHP с подсказками?

Обратите внимание, что мы делаем конструктор приватным, чтобы он нам не мешал, и мы должны создать описание для вложенного поля.

Но PHPStorm этого не поймет.

Краткое содержание

Вариант, конечно, парный, но люди, пишущие в ТС, этим уже давно занимаются.

Если есть лучший вариант, я буду рад его рассмотреть.

И самое главное, дело не в том, что это нужно делать всегда, а в том, что если нет других вариантов (ограниченных во времени и т. д. и т. п.

), то эту технологию можно использовать.

Теги: #php #bitrix #1С-Битрикс #typescript #bitrix

Вместе с данным постом часто просматривают: