JavaScript에서는 즉시 실행되는 익명 함수를 정의 할 수 있습니다.
(function () { /* do something */ })()
PHP에서 그런 식으로 할 수 있습니까?
JavaScript에서는 즉시 실행되는 익명 함수를 정의 할 수 있습니다.
(function () { /* do something */ })()
PHP에서 그런 식으로 할 수 있습니까?
답변:
PHP7의 경우 Yasuo Ohgaki의 답변을 참조하십시오 .(function() {echo 'Hi';})();
이전 버전의 경우 : 즉시 실행할 수있는 유일한 방법은
call_user_func(function() { echo 'executed'; });
call_user_func
물론를 사용할 수 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";
});
?>
run
즉시 실행하는 줄 뒤에 함수에 대한 핸들이 없기 때문에 코드의 다른 부분에서 함수를 호출 할 수 없습니다 .
run()
전달 된 이름없는 함수를 즉시 실행하는 것입니다. 와 동일하며 call_user_func()
매개 변수 만 전달됩니다.
$f();
사용하는 엔진이 call_user_func
함수 인수가 하나만 있는 특수한 경우에 최적화되지 않으면 더 빠를 수 있습니다 . 이는 call_user_func
여러 매개 변수 전달을 지원하고 첫 번째 인수가 문자열을 인수 또는 함수로 지원 하기 때문 입니다. 즉, call_user_func
가독성 이 높으면run
코드가 pyramind 맨 아래 어딘가에 있지 않는 한 사용 하지 않습니다 .
run
와 call_user_func
. 한 가지만 수행하는 반면, 수행하는 작업 외에 추가 기능을 지원 call_user_func
하기 run
때문에에 비해 본질적인 단점 이 있습니다. 빠른 루프 테스트 ( 예 :)를 시도 하여 엔진에서 더 빠른 것을 확인할 수 있습니다. run
call_user_func
run
이것은 PHP 7.0 이상에서 가장 간단합니다.
php -r '(function() {echo 'Hi';})();'
클로저를 생성하고 "()"를 따라 함수로 호출하는 것을 의미합니다. 균일 한 변수 평가 순서 덕분에 JS처럼 작동합니다.
참고 허용 대답은 미세이지만 함수를 선언하는 두 라인에서 호출보다 긴 (느린 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)
이 방법으로 시도했지만 먼저 함수를 정의 할 수있는 연산자 (또는 함수)를 사용하여 상위 답변보다 더 장황합니다.
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
이것은 직접적인 대답은 아니지만 해결 방법입니다. 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.
call_user_func(function(){/* stuff */})
해야합니까?