Есть ли функция для вызова массива?

настройка

В 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:

предупреждение о потоке строк в phpStorm

Имя функции должно быть вызываемым - строка, Закрытие или класс, реализующий __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

Другие вопросы по тегам