source

PHP에서 콜백을 구현하려면 어떻게 해야 합니까?

itover 2022. 12. 11. 10:20
반응형

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. 메서드를 가진 오브젝트(익명의 함수 포함)는 "콜 가능" 카테고리에 속하며 동일한 방법으로 사용할 수 있지만, 개인적으로는 이러한 오브젝트를 레거시 "콜백" 용어와 연관짓지 않습니다.
  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를 사용하여 원샷용 익명/lambda 함수를 만드는 것입니다.다음과 같은 PHP 기능에 유용합니다.array_map(),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";
}
?>

[편집] 누락된 괄호를 추가했습니다.또, 콜백 선언을 추가했습니다.그렇게 하는 것이 좋습니다.

create_function()manager로 지정합니다.

매개 변수는 혼수상태로 구분된 문자열이고 전체 기능 본체는 문자열로...아...나는 그들이 노력했더라도 더 추하게 만들 수 없었을 것이라고 생각한다.

유감스럽게도 이름 있는 함수를 만들 필요가 없는 경우에는 이 방법밖에 없습니다.

을 깨는 것에이 없는 을 < 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"

언급URL : https://stackoverflow.com/questions/48947/how-do-i-implement-a-callback-in-php

반응형