Параметр
Внутри SomeClass
есть f2member
, принимающий два целочисленных аргумента и производящий их сумму. Тест проходит, показывая, что вызов действительно работает, и возвращает ожидаемый результат. Который вызывает $g
с двумя параметрами 1
и 1
, возвращая 2
.
Важно: это работает только для php 5.4.11 и выше проверка совместимости
class SomeClass extends PHPUnit_Framework_TestCase
{
function f2member($a,$b)
{
return $a + $b;
}
/**
* @test
*/
public function test()
{
$g = array($this,'f2member');
$this->assertEquals(2, $g(1,1)); // squiggle line under $g
}
}
Проблема
Однако это выдает предупреждение внутри phpStorm при каждом вызове метода и волнистую линию под $g
:
Имя функции должно быть вызываемым — строка, Closure или класс, реализующий __invoke, текущий массив
Происхождение предупреждения мне ясно, и теперь я ищу способы избежать этих предупреждений. Требование состоит в том, что я не хочу менять стиль вызова функции. Еще одна вещь, которую я не хочу делать, это деактивировать это предупреждение. Я бы предпочел обернуть его чем-нибудь, что предоставит необходимую информацию системе типов.
Пытаться
Я уже сталкивался с несколькими решениями для удаления предупреждений. Одним из них является определение определяемой пользователем функции, которая документирует только требуемый целевой тип.
/**
* @param array $arr
*
* @return callable
*/
function callable_for($arr)
{
return $arr;
}
Это возвращает массив, но также явно сообщает системе типов, что получается из функции callable_for
. С этой аннотацией типа phpStorm теперь перестает жаловаться на это предупреждение, хотя по-прежнему возвращает массив.
$g = callable_for(array($this,'f2member'));
Вопрос
Разве нет чего-то готового, например, моего callable_for
в php для достижения этого? Если ответ отрицательный, то я ищу самое краткое решение, которое мы можем найти.
Я уже пробовал искать на SO, php.net и в Google. Возможно, я просто искал неправильные словосочетания, вот только два примера:
- массив для вызываемого php
- создать дескриптор вызываемого метода php
Большая фотография
На случай, если возникнут подозрения, это X/Y-проблема: у меня есть другая функция, принимающая вызываемый объект в качестве параметра. С замыканиями очень естественно определить что-то, что может быть вызвано позже. Однако как мне определить вызываемый объект для члена или статического метода, не заключая его в другое закрытие делегирования? Обозначение массива позволяет использовать его для унифицированной передачи: замыканий или дескрипторов статических/членных методов в мою более позднюю функцию. Сейчас я пытаюсь найти краткое решение, близкое к этому.