답변:
매뉴얼에서는 "콜백"과 "호출 가능"이라는 용어를 서로 바꿔서 사용할 수 있지만 "콜백"은 일반적으로 함수 호출 처럼 작동하는 문자열 또는 배열 값을 나타내며 , 나중에 호출하기 위해 함수 또는 클래스 메서드를 참조합니다. 이것은 PHP 4부터 기능 프로그래밍의 일부 요소를 허용했습니다.
$cb1 = 'someGlobalFunction';
$cb2 = ['ClassName', 'someStaticMethod'];
$cb3 = [$object, 'somePublicMethod'];
// this syntax is callable since PHP 5.2.3 but a string containing it
// cannot be called directly
$cb2 = 'ClassName::someStaticMethod';
$cb2(); // fatal error
// legacy syntax for PHP 4
$cb3 = array(&$object, 'somePublicMethod');
이것은 일반적으로 호출 가능한 값을 사용하는 안전한 방법입니다.
if (is_callable($cb2)) {
// Autoloading will be invoked to load the class "ClassName" if it's not
// yet defined, and PHP will check that the class has a method
// "someStaticMethod". Note that is_callable() will NOT verify that the
// method can safely be executed in static context.
$returnValue = call_user_func($cb2, $arg1, $arg2);
}
최신 PHP 버전에서는 위의 처음 세 가지 형식을로 직접 호출 할 수 있습니다 $cb()
. call_user_func
그리고 call_user_func_array
위의 모든을 지원합니다.
참조 : http://php.net/manual/en/language.types.callable.php
메모 /주의 사항 :
['Vendor\Package\Foo', 'method']
call_user_func
비 객체를 참조로 전달하는 것을 지원하지 않으므로 call_user_func_array
나중에 PHP 버전에서 콜백을 var에 저장하고 직접 구문을 사용할 수 있습니다 $cb()
.__invoke()
메소드 (익명 함수 포함)가 있는 객체는 "호출 가능"범주에 속하며 같은 방식으로 사용할 수 있지만 개인적으로 기존 "콜백"용어와 연관시키지 않습니다.create_function()
는 전역 함수를 작성하고 이름을 리턴합니다. 래퍼 eval()
이므로 익명 함수를 대신 사용해야합니다.'someGlobalFunction'
실제로 정의 된 함수 라는 답을 지적하는 것이 도움이 될 것 입니다.
콜백 구현은 다음과 같이 수행됩니다
// This function uses a callback function.
function doIt($callback)
{
$data = "this is my data";
$callback($data);
}
// This is a sample callback function for doIt().
function myCallback($data)
{
print 'Data is: ' . $data . "\n";
}
// Call doIt() and pass our sample callback function's name.
doIt('myCallback');
표시 : 데이터는 : 이것은 내 데이터입니다
call_user_func()
동적으로 함수를 호출하고 콜백을 할 수있는 구문이있을 때 사람들이 왜 사용하고 싶어하는지 이해조차하지 못합니다 . 동의합니다!
내가 최근에 찾은 멋진 트릭은 PHP create_function()
를 사용하여 원샷 용 익명 / 람다 함수를 만드는 것입니다. array_map()
, 같은 PHP 함수 preg_replace_callback()
또는 usort()
사용자 정의 처리에 콜백을 사용하는 경우에 유용합니다 . 그것은 eval()
덮개 아래에서 하는 것처럼 거의 보이지만 여전히 PHP를 사용하는 좋은 기능 스타일의 방법입니다.
create_function()
하시겠습니까?
글쎄 ... 수평선에 5.3이 있으면 더 좋을 것입니다 .5.3을 사용하면 클로저가 생겨 익명 함수가 생길 것입니다.
당신은 당신의 전화가 유효한 것을 확인하고 싶을 것입니다. 예를 들어, 특정 기능의 경우 기능이 존재하는지 확인하고 확인하려고합니다.
function doIt($callback) {
if(function_exists($callback)) {
$callback();
} else {
// some error handling
}
}
is_callable( $callback )
create_function
수업 내에서 나를 위해 일하지 않았다. 나는을 사용해야했다 call_user_func
.
<?php
class Dispatcher {
//Added explicit callback declaration.
var $callback;
public function Dispatcher( $callback ){
$this->callback = $callback;
}
public function asynchronous_method(){
//do asynch stuff, like fwrite...then, fire callback.
if ( isset( $this->callback ) ) {
if (function_exists( $this->callback )) call_user_func( $this->callback, "File done!" );
}
}
}
그런 다음 사용하십시오.
<?php
include_once('Dispatcher.php');
$d = new Dispatcher( 'do_callback' );
$d->asynchronous_method();
function do_callback( $data ){
print 'Data is: ' . $data . "\n";
}
?>
[편집] 누락 된 괄호가 추가되었습니다. 또한 콜백 선언을 추가하여 그렇게 선호합니다.
PHP와의 호환성을 깨뜨리는 것에 신경 쓰지 않는 사람들을 위해 < 5.4
유형 힌트를 사용하여보다 깔끔하게 구현하는 것이 좋습니다.
function call_with_hello_and_append_world( callable $callback )
{
// No need to check $closure because of the type hint
return $callback( "hello" )."world";
}
function append_space( $string )
{
return $string." ";
}
$output1 = call_with_hello_and_append_world( function( $string ) { return $string." "; } );
var_dump( $output1 ); // string(11) "hello world"
$output2 = call_with_hello_and_append_world( "append_space" );
var_dump( $output2 ); // string(11) "hello world"
$old_lambda = create_function( '$string', 'return $string." ";' );
$output3 = call_with_hello_and_append_world( $old_lambda );
var_dump( $output3 ); // string(11) "hello world"
create_function()
PHP 7.2.0부터 경고 가 더 이상 사용되지 않습니다. 이 기능에 의존하지 않는 것이 좋습니다.