tl; dr
Как правильно аннотировать (в PHPDoc) функции, реализованные с помощью __callStatic
?Более важно: есть ли способ, который позволит NetBeans и PHPStorm понять, что это статические методы?
Мотивация
Если вы хотите получить более широкую картину, вот как я получилна этот вопрос.
Задача : В моем текущем проекте у нас есть тонна классов, которые действительно должны быть одиночными (прокси-серверы БД и тому подобное).Само собой разумеется, у нас есть по крайней мере несколько сотен require_once
и $foo = new FooProxy();
строк.
Решение : я создал класс Loader
, чтобы решить эту проблему, используя __callStatic
магический метод, поэтому мы можем просто сказать $foo = Loader::FooProxy();
.Это идеально подходит для наших целей, но:
Проблема : Таким образом, очевидно, что ни в одной из IDE, используемых в команде, нет подсказок типа.
Решение : Каждый модуль определяет подкласс Loader
, добавляя методы, которые просто перенаправляют на __callStatic
.
Проблема : Фактическое добавлениеинтерпретируемый код только для автозавершения недопустим (это можно утверждать, но давайте его пока примем).
Решение : Давайте не будем добавлять никаких реальных методов, только объявимметоды в PHPDoc как это:
<?php
/**
* @method FooProxy FooProxy()
*/
class BarLoader extends Loader {}
?>
Проблема : FooProxy
не является статическим методом.Ничто из следующего не делает его статичным:
<?php
/**
* @static
* @method FooProxy FooProxy()
*/
///////////////
/**
* @static @method A A()
* @method static A A()
* @method A static A()
* @method A A() static
*/
Создание абстрактного класса не имеет значения.Около часа работы Google не было найдено решений.Основная цель - ознакомить IDE с этими функциями;наличие правильного PHPDoc на самом деле не является необходимостью.