PHP: может ли анонимная функция вернуть себя? - PullRequest
0 голосов
/ 29 октября 2018

В некоторых викторинах PHP я получил следующую задачу - мне нужно return true по следующему:

function foo($x)
{
    return $x === $x();
}

foo(__________ALLOWED_INPUT____________);

Теперь моя идея состояла в том, чтобы передать анонимную функцию, которая возвращает себя:

foo(function() { return $this_function; })

Однако я еще не нашел способ сделать это. Возможно ли это как-то?

PS: Хорошая игра (https://returntrue.win/?level=6).

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Насколько я знаю, анонимная функция не может возвращать ссылку на себя, и нет встроенной функции PHP, которая, насколько я знаю, возвращает ссылку на себя, так что оставлял бы вызываемый класс. Это может сработать:

new class{function __invoke(){return $this;}}

ответы к returntrue.win-с объяснениями

0 голосов
/ 19 февраля 2019

[Пробелы предназначены только для чтения; все они должны работать в одной строке, если требуется.]

В качестве варианта ответа Ислама Эльшобокши вы можете использовать (супер) глобальную переменную вместо оператора use, чтобы предоставить функции доступ к себе:

foo(
    $GLOBALS['x'] = function() { 
        return $GLOBALS['x']; 
    }
);

Или вы можете позволить функции найти себя в стеке вызовов, используя debug_backtrace :

foo(
    function() { 
        $backtrace = debug_backtrace();
        return $backtrace[1]['args'][0];
    }
)

Вдохновленный комментарием от Spudley о возвращении имени функции, вы можете объявить функцию в допустимой области, обернув ее в IIFE :

foo(
    (function(){
       function f(){ return 'f'; }
       return 'f';
    })()
);
0 голосов
/ 29 октября 2018

Вы можете создать анонимную функцию, которая возвращает ссылку на себя:

foo($x=function()use(&$x){return$x;})

http://sandbox.onlinephpfunctions.com/code/743f72c298e81e70f13dc0892894911adfb1b072

...