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()"