__invoke () для вызываемого массива или строки

Как написать PHP-код для вызова всех «Callables» с__invoke()?

Желание здесь передать по ссылке, которая устарела сcall_user_func[_array](), Я видел, что там есть пакет,TRex\Reflection\CallableReflection, но это, кажется, использоватьcall_user_func() на заднем плане, и пострадает та же проблема.

<?php

function passthrough_invoke(callable $callback) {
    return $callback->__invoke();
}

function passthrough_user(callable $callback) {
    return call_user_func($callback);
}

function test_func() { return "func_string\n"; };

class test_obj {

    function test_method() {
        return "obj_method\n";
    }
}
print_r("Call User Func Works:\n");
echo passthrough_user(function() { return "func_closure\n"; });
echo passthrough_user(array(new test_obj, 'test_method'));
echo passthrough_user('test_func');

print_r("\n__invoke dies:\n");
echo passthrough_invoke(function() { return "func_closure\n"; });
echo passthrough_invoke(array(new test_obj, 'test_method'));
echo passthrough_invoke('test_func');

Этот вопрос может также прозвучать так: «Есть ли способ, который не будет осуждается, что вы можете вызвать обратный вызов с передачей по ссылке?», Но я нахожу текущий вопрос более интересным.

Заметки:

Основная цель состоит в том, чтобы обратный вызов действовал как полноценная функция и имел все тонкости этого, в первую очередь, включая Pass By Reference, который__invoke($args, ...) позволяет.

с помощьюfunc_get_args(), или же...$args (переменная функция на обертке) не будет работать, так как вы все равно останетесь с помощьюcall_user_func_array($callback, $arg_array), который не будет поддерживать Pass By Reference.

Примечания 2:

Я только что узнал, что вы можете ВЫЗВАТЬ, используя переменные параметры, а также в следующем PHP:function_name(...$args), Эта поддержка передается по ссылке?

Далее мы все еще сталкиваемся с проблемой, которая$callback_array = array($object, 'method'); вызываемый, но не$callback_array();и, конечно, не$callback_array(...$args);, Кроме того, я должен уточнить, что вопрос на самом деле о написании кода, который не сломается в более поздних выпусках, которые могут это сделать.

IE: я могу написать это сейчас, запустить его завтра.

Который выглядит все тусклее и тусклее перспективы.

Ответы на вопрос(1)

Ваш ответ на вопрос