Есть ли функция для вызова массива?
настройка
В 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 этого добиться? Если ответ отрицательный, то я ищу самое краткое решение, которое мы можем найти.
Я уже пробовал смотреть на SO, php.net и Google. Возможно, я просто искал неправильные словосочетания, вот только два примера:
- массив для вызова php
- создать вызываемый метод дескриптор php
Большая фотография
На всякий случай, если возникают подозрения, это проблема X/Y: у меня есть другая функция, принимающая в качестве параметра вызываемый объект. С замыканиями очень естественно определить что-то, что может быть вызвано позже. Однако как определить вызываемый элемент или статический метод, не заключая его в другое делегирование Closure? Нотация массива позволяет использовать его для равномерной передачи: замыканий или дескрипторов статических методов / методов-членов в мою более позднюю функцию. Сейчас я пытаюсь найти краткое решение этого, которое близко к этому.
1 ответ
Таким образом, еще одно улучшение может быть, чтобы изменить 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');
Эта функция по-прежнему возвращает массив, но система типов может использовать данную информацию, чтобы правильно обработать этот массив для динамического вызова метода.
Вопрос был задан четыре года назад, но после некоторого исследования я нашел метод Closure::fromCallable: https://www.php.net/manual/de/closure.fromcallable.php