TL;DR
Каков правильный способ аннотировать (в PHPDoc) функции, реализованные через __callStatic
? Более важно: есть ли способ, который сделает NetBeans и PHPStorm понятными, что это статические методы?
Мотивация
Если вы хотите увеличить картинку, вот как я добрался до этого вопроса.
Проблема. В моем текущем проекте у нас есть тонна классов, которые должны быть действительно одиночными (DB-прокси и тому подобное). Излишне говорить, что у нас есть как минимум несколько сотен строк 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 на самом деле не является необходимостью.