PHP에서 익명 함수를 즉시 실행하려면 어떻게해야합니까?


96

JavaScript에서는 즉시 실행되는 익명 함수를 정의 할 수 있습니다.

(function () { /* do something */ })()

PHP에서 그런 식으로 할 수 있습니까?


2
시험해볼 PHP 5.3이 없지만 어떻게 call_user_func(function(){/* stuff */})해야합니까?
Jasper

답변:


121

PHP7의 경우 Yasuo Ohgaki의 답변을 참조하십시오 .(function() {echo 'Hi';})();

이전 버전의 경우 : 즉시 실행할 수있는 유일한 방법은

call_user_func(function() { echo 'executed'; });

12
함수 호출 체인 이 도입 되지 않는 한 (또는 때까지) 이것은 제 제안이기도합니다.
salathe 2010-08-25

2
@ Gordon : php 5.4 아직 아무것도 없나요?
동적

@ yes123 아니요. 여전히 사용해야합니다call_user_func
Gordon

2
@BennettMcElwee는 다음과 같이 설명합니다. 이것이 define-assign-call 대안보다 다소 느리더라도 애플리케이션에서 심각한 병목 현상을 일으킬 가능성은 매우 낮습니다. 의심스러운 경우 실제 조건에서 앱을 프로파일 링하십시오.
Gordon

감사합니다 @Gordon, 그게 내가 생각한 것입니다. salathe와 yes123이이 방법에 만족하지 않는다는 인상을 받았는데, 이유가 궁금했습니다. 나에게 완벽하게 괜찮아 보인다.
Bennett McElwee 2013-06-21

28

In PHP 7은 자바 스크립트에서 동일하게 수행하는 것입니다.

$gen = (function() {
    yield 1;
    yield 2;

    return 3;
})();

foreach ($gen as $val) {
    echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;

출력은 다음과 같습니다.

1
2
3

15

물론를 사용할 수 call_user_func있지만 여전히 다른 매우 간단한 대안이 있습니다.

<?php
// we simply need to write a simple function called run:
function run($f){
    $f();
}

// and then we can use it like this:
run(function(){
    echo "do something";
});

?>

1
내가 정의하는 함수는 정상적인 실행에서 두 번 이상 호출되지 않아야하는 함수이기 때문에 즉시 실행되는 함수를 원합니다. 명명 된 함수 인 run ()을 정의 할 때의 문제점은 코드를 보는 사람이 코드의 다른 부분에서도 run ()을 호출 할 수 있다고 생각할 수 있다는 것입니다. 즉시 실행되는 함수는이 코드가 두 번 실행되지 않아야 함을 분명히합니다.
Daniel Howard

3
run즉시 실행하는 줄 뒤에 함수에 대한 핸들이 없기 때문에 코드의 다른 부분에서 함수를 호출 할 수 없습니다 .
Pacerier 2013 년

3
@DanielHoward 요점은 run()전달 된 이름없는 함수를 즉시 실행하는 것입니다. 와 동일하며 call_user_func()매개 변수 만 전달됩니다.
Cypher

1
@JordanLev, 구현이 더 간단하고 (단 한 줄 :) $f();사용하는 엔진이 call_user_func함수 인수가 하나만 있는 특수한 경우에 최적화되지 않으면 더 빠를 수 있습니다 . 이는 call_user_func여러 매개 변수 전달을 지원하고 첫 번째 인수가 문자열을 인수 또는 함수로 지원 하기 때문 입니다. 즉, call_user_func가독성 이 높으면run 코드가 pyramind 맨 아래 어딘가에 있지 않는 한 사용 하지 않습니다 .
Pacerier 2015 년

1
@JordanLev, "간단한 구현"은 함수 내부 의 코드 runcall_user_func. 한 가지만 수행하는 반면, 수행하는 작업 외에 추가 기능을 지원 call_user_func하기 run때문에에 비해 본질적인 단점 이 있습니다. 빠른 루프 테스트 ( :)를 시도 하여 엔진에서 더 빠른 것을 확인할 수 있습니다. runcall_user_funcrun
Pacerier 2015 년

11

이것은 PHP 7.0 이상에서 가장 간단합니다.

php -r '(function() {echo 'Hi';})();'

클로저를 생성하고 "()"를 따라 함수로 호출하는 것을 의미합니다. 균일 한 변수 평가 순서 덕분에 JS처럼 작동합니다.

https://3v4l.org/06EL3


2
좋은 대답이지만 명령 줄 작업으로 형식을 지정하는 이유는 무엇입니까?
Kodos Johnson

6
(new ReflectionFunction(function() {
 // body function
}))->invoke();

6
더 자세한 정보를 제공 할 수 있습니까? 설명을 추가 하시겠습니까?
MoralCode

2

참고 허용 대답은 미세이지만 함수를 선언하는 두 라인에서 호출보다 긴 (느린 41 %)로서 1.41x 걸린다.

[정말 새로운 답은 아니지만 방문자를 위해 어딘가에 추가하는 것이 중요하다고 느꼈습니다.]

세부:

<?php
# Tags: benchmark, call_user_func, anonymous function 
require_once("Benchmark.php");
bench(array(
        'test1_anonfunc_call' => function(){
                $f = function(){
                        $x = 123;
                };
                $f();
        },
        'test2_anonfunc_call_user_func' => function(){
                call_user_func(
                        function(){
                                $x = 123;
                        }
                );
        }
), 10000);
?>

결과 :

$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)

0

이 방법으로 시도했지만 먼저 함수를 정의 할 수있는 연산자 (또는 함수)를 사용하여 상위 답변보다 더 장황합니다.

    $value = $hack == ($hack = function(){
            // just a hack way of executing an anonymous function
            return array(0, 1, 2, 3);                
    }) ? $hack() : $hack();

2
그럼 왜 간단하지 $hack = function(){...}; $hack()않습니까?

0

이것은 직접적인 대답은 아니지만 해결 방법입니다. PHP 사용> = 7. 명명 된 메서드로 익명 클래스를 정의하고 클래스를 구성하고 즉시 메서드를 호출합니다.

$var = (new class() { // Anonymous class
    function cool() { // Named method
        return 'neato';
    }
})->cool(); // Instantiate the anonymous class and call the named method
echo $var; // Echos neato to console.

-2

즉시 실행되지는 않지만;)에 가깝습니다.

<?php

$var = (function(){ echo 'do something'; });
$var();

?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.