PHPDoc и callStatic
tl; dr
каков правильный способ аннотирования (в PHPDoc) функций, реализованных через __callStatic
? Более важно: есть ли способ, который сделает NetBeans и PHPStorm понимаете, что это статические методы?
мотивация
если вы хотите большую картину, вот как я добрался до этого вопроса.
2 ответов
Ну, PhpStorm 3.0 примет
@method static type name() description
см. соответствующий запрос функции http://youtrack.jetbrains.net/issue/WI-4051
вообще говоря, я думаю, что выбор использования магического материала приходит с оговоркой о необходимости принять компромисс потери эффективности таких вещей, как автозаполнение.
однако в моем тестировании с Eclipse PDT (Helios с PHP 5.3.2 на WinXP) я смог получить хорошие автокомплектации из одного явного статического метода и двух магических статических методов из моего класса загрузчика, который я смоделировал после вашего примера.
короче говоря, появляется использование тега @method в док-блока класса было достаточно, чтобы Эклипс все понял. Если NetBeans и PHPStorm испытывают проблемы, я не уверен, связано ли это с "статическим" аспектом или нет... может быть, разбор такого динамического кода может быть больше, чем их логика автозаполнения построена для обработки.
<?php
/**
* @method BarProxy BarProxy() returns an instance of BarProxy
* @method BazProxy BazProxy() returns an instance of BazProxy
*/
class Loader
{
public static function __callStatic($name, $arguments)
{
return new $name($arguments);
}
/**
* @return FooProxy
*/
public static function FooProxy(){
return new FooProxy();
}
}
class FooProxy
{
public function sayCheese() {}
}
class BarProxy
{
public function eatFries() {}
}
class BazProxy
{
public function sleep() {}
}
$foo = Loader::FooProxy();
$foo->sayCheese(); // did this simply to verify explicit autocompletion succeeded
$bar = Loader::BarProxy();
$bar->eatFries(); // autocompletion of just "$bar->" brought up "eatFries()"
$baz = Loader::BazProxy();
$baz->sleep(); // autocompletion of just "$baz->" brought up "sleep()"