콜백은 PHP로 어떻게 작성됩니까?
답변
매뉴얼에서는 “콜백”과 “호출 가능”이라는 용어를 서로 바꿔서 사용할 수 있지만 “콜백”은 일반적으로 함수 호출 처럼 작동하는 문자열 또는 배열 값을 나타내며 , 나중에 호출하기 위해 함수 또는 클래스 메서드를 참조합니다. 이것은 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()
이므로 익명 함수를 대신 사용해야합니다.
답변
PHP 5.3을 사용하면 다음과 같이 할 수 있습니다.
function doIt($callback) { $callback(); }
doIt(function() {
// this will be done
});
마지막으로 좋은 방법입니다. 콜백이 훌륭하기 때문에 PHP에 추가되었습니다.
답변
콜백 구현은 다음과 같이 수행됩니다
// 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');
표시 : 데이터는 : 이것은 내 데이터입니다
답변
내가 최근에 찾은 멋진 트릭은 PHP create_function()
를 사용하여 원샷 용 익명 / 람다 함수를 만드는 것입니다. array_map()
, 같은 PHP 함수 preg_replace_callback()
또는 usort()
사용자 정의 처리에 콜백을 사용하는 경우에 유용합니다 . 그것은 eval()
덮개 아래에서 하는 것처럼 거의 보이지만 여전히 PHP를 사용하는 좋은 기능 스타일의 방법입니다.
답변
답변
당신은 당신의 전화가 유효한 것을 확인하고 싶을 것입니다. 예를 들어, 특정 기능의 경우 기능이 존재하는지 확인하고 확인하려고합니다.
function doIt($callback) {
if(function_exists($callback)) {
$callback();
} else {
// some error handling
}
}
답변
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";
}
?>
[편집] 누락 된 괄호가 추가되었습니다. 또한 콜백 선언을 추가하여 그렇게 선호합니다.
