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
*/
Создание абстрактного класса не имеет значения. Около часа гугления не дало никаких решений. Основная цель состоит в том, чтобы сделать IDE осведомленными об этих функциях; наличие правильного PHPDoc на самом деле не является необходимостью.