Как кодировать/ссылаться на вызываемые функции PHP, которыми легко управлять для моей IDE

Когда мне нужно написать ссылку на вызываемую функцию, я использую стандартный синтаксис PHP, defined как:

Функция PHP передается по имени в виде строки. Можно использовать любую встроенную или определяемую пользователем функцию [... опущено...].

Метод экземпляра объекта передается в виде массива, содержащего объект с индексом 0 и имя метода (строка) с индексом 1.

Статические методы класса также можно передавать без создания экземпляра объекта этого класса путем передачи имени класса (все еще строки) вместо объекта с индексом 0.

Начиная с PHP 5.2.3, также можно передать (строку) 'ClassName::methodName'.

Помимо обычных пользовательских функций, в параметр обратного вызова также могут быть переданы анонимные функции.

Все эти способы не подходят для IDE для таких операций, как рефакторинг имени функции или найти использование.

В своем ответе я предлагаю решение, но есть ли другие подходы, которые можно применить, даже совершенно другие, которые позволяют IDE «находить» вызов методов?


person Ivan Buttinoni    schedule 03.12.2015    source источник


Ответы (2)


Вы уже рядом с самой короткой вещью, которую вы можете сделать.

Вы можете прекрасно вызывать свою анонимную функцию непосредственно в вызове функции без использования переменной.

Например, вы можете заменить:

$callable=function($param) use ($object){ 
   return $object->myMethod($param); 
}
call_user_func($callable, $param);

by:

call_user_func(function($param) use ($object){ 
   return $object->myMethod($param); 
}, $param);

Вам придется подождать появления стрелочных функций в будущих версиях PHP, и вы сможете использовать что-то нравится:

call_user_func(fn($a) => $object->myMethod($a), $param);
person Adam    schedule 14.12.2015

Я пришел к решению, всегда основанному на анонимных функциях, которые решают проблему но не оставляй меня полностью удовлетворенным:

Статический метод класса

$callable = function($param){ 
    return \my\namespace\myClass::myMethod($param); 
}

метод объекта

$callable = function($param) use ($object){ 
    return $object->myMethod($param); 
}

метод объекта $this

$callable = function($param){ 
    return self::myMethod($param); 
}

Альтернативы для старых версий php

Внутри всех классов, которые вы собираетесь вызывать (или в их родителях), определите функцию classname() следующим образом:

public static function className()
{
    return get_called_class();
}

или для очень старого PHP:

public static function className()
{
    return "MyClass";
}

Затем

call_user_func(array(MyClass::className(), 'myCallbackMethod')); 
person Ivan Buttinoni    schedule 03.12.2015