В 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
:
Имя функции должно быть вызываемым — строка, Закрытие или класс, реализующий __invoke, в настоящее время массив
Происхождение предупреждения мне ясно, и теперь я ищу способы избежать этих предупреждений.
Требование состоит в том, что я не хочу менять стиль вызова функции. Еще одна вещь, которую я не хочу делать, — отключить это предупреждение.
Я предпочел бы обернуть что-то вокруг этого, которое предоставляет необходимую информацию система типов.
Я уже столкнулся с несколькими решениями для удаления предупреждений. Одним из них является определение пользовательской функции, которая документирует только требуемый тип цели.
/**
* @param array $arr
*
* @return callable
*/
function callable_for($arr)
{
return $arr;
}
Это возвращает массив, но также явно сообщает системе типов, что выходит из callable_for
функция. При наличии аннотации этого типа phpStorm теперь перестает жаловаться на это предупреждение, хотя все равно возвращает массив.
$g = callable_for(array($this,'f2member'));
Нет ли чего-нибудь из коробки, как мой callable_for
в php этого добиться? Если ответ нет, то
Я ищу самое краткое решение, которое мы можем найти.
Я уже пытался смотреть на ТАК, php.net и гугл. Возможно, я просто искал неправильные словосочетания, вот только два примера:
На случай, если возникнут подозреваемые, это X / Y проблема: У меня есть другая функция, принимающая вызываемое в качестве параметра. С замыканиями очень естественно определить что-то, что может быть вызвано позже. Однако как определить вызываемый элемент или статический метод, не заключая его в другое делегирование Closure? Нотация массива позволяет использовать его для равномерной передачи: замыканий или дескрипторов статических методов / методов-членов в мою более позднюю функцию. Я сейчас пытаюсь найти краткое решение этого, которое приближается к этот.
Таким образом, еще одно улучшение может быть, чтобы изменить callable_for
принять два аргумента и обернуть обе обязанности; создать массив и задокументировать целевой тип возвращаемого значения.
/**
* @param mixed $context
* @param string $method
*
* @return callable
*/
function callable_for($context, $method)
{
return array($context, $method);
}
Использование этой реализации повышает лаконичность $g
декларация на приемлемом уровне.
$g = callable_for($this,'f2member');
Эта функция по-прежнему возвращает массив, но система типов может использовать данную информацию, чтобы правильно обработать этот массив для динамического вызова метода.
Других решений пока нет …