[php] PHP에서 콜백을 어떻게 구현합니까?

콜백은 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

메모 /주의 사항 :

  1. 함수 / 클래스가 네임 스페이스 인 경우 문자열에는 정규화 된 이름이 포함되어야합니다. 예 :['Vendor\Package\Foo', 'method']
  2. call_user_func비 객체를 참조로 전달하는 것을 지원하지 않으므로 call_user_func_array나중에 PHP 버전에서 콜백을 var에 저장하고 직접 구문을 사용할 수 있습니다 $cb().
  3. __invoke()메소드 (익명 함수 포함)가 있는 객체는 “호출 가능”범주에 속하며 같은 방식으로 사용할 수 있지만 개인적으로 기존 “콜백”용어와 연관시키지 않습니다.
  4. 레거시 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를 사용하는 좋은 기능 스타일의 방법입니다.


답변

글쎄 … 수평선에 5.3이 있으면 더 좋을 것입니다 .5.3을 사용하면 클로저가 생겨 익명 함수가 생길 것입니다.

http://wiki.php.net/rfc/closures


답변

당신은 당신의 전화가 유효한 것을 확인하고 싶을 것입니다. 예를 들어, 특정 기능의 경우 기능이 존재하는지 확인하고 확인하려고합니다.

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";
}
?>

[편집] 누락 된 괄호가 추가되었습니다. 또한 콜백 선언을 추가하여 그렇게 선호합니다.