programing

PHP에서 함수를 매개 변수로 수락

sourcetip 2023. 1. 10. 21:43
반응형

PHP에서 함수를 매개 변수로 수락

PHP에서 함수를 매개 변수로 전달할 수 있는지 궁금했습니다. JS에서 프로그래밍할 때 다음과 같은 것이 필요합니다.

object.exampleMethod(function(){
    // some stuff to execute
});

제가 원하는 것은 그 함수를 exampleMethod 어딘가에서 실행하는 것입니다.그게 PHP로 가능한가요?

PHP 5.3.0 이상을 사용하고 있다면 가능합니다.

매뉴얼의 익명 기능을 참조하십시오.

당신의 경우, 다음과 같이 정의할 수 있습니다.exampleMethod다음과 같습니다.

function exampleMethod($anonFunc) {
    //execute anonymous function
    $anonFunc();
}

다른 함수에 추가하기 위해 함수 이름을 전달할 수 있습니다.

function someFunc($a)
{
    echo $a;
}

function callFunc($name)
{
    $name('funky!');
}

callFunc('someFunc');

이것은 PHP4에서 동작합니다.

유효: (PHP 4 >= 4.0.1, PHP 5, PHP 7)

create_function을 사용하여 함수를 변수로 생성하여 전달할 수도 있습니다.하지만 저는 익명의 기능이 더 좋아요.좀비로 가.


업데이트 09 - 2022년 1월

경고

이 함수는 PHP 7.2.0에서 폐지되었으며 PHP 8.0.0에서 제거되었습니다.이 기능에 의존하는 것은 매우 권장되지 않습니다.

다음과 같이 코드화합니다.

function example($anon) {
  $anon();
}

example(function(){
  // some codes here
});

(Laravel Illluminate에서 영감을 받은) 이런 것을 발명해 주시면 감사하겠습니다.

Object::method("param_1", function($param){
  $param->something();
});

@zombat의 답변에 따르면 먼저 익명 함수를 검증하는 것이 좋습니다.

function exampleMethod($anonFunc) {
    //execute anonymous function
    if (is_callable($anonFunc)) {
        $anonFunc();
    }
}

또는 PHP 5.4.0 이후의 인수 유형을 확인합니다.

function exampleMethod(callable $anonFunc) {}

PHP 버전 > = 5.3.0

예 1: 기본

function test($test_param, $my_function) {
    return $my_function($test_param);
}

test("param", function($param) {
    echo $param;
}); //will echo "param"

예 2: std 객체

$obj = new stdClass();
$obj->test = function ($test_param, $my_function) {
    return $my_function($test_param);
};

$test = $obj->test;
$test("param", function($param) {
    echo $param;
});

예 3: 비 스태틱클래스 콜

class obj{
    public function test($test_param, $my_function) {
        return $my_function($test_param);
    }
}

$obj = new obj();
$obj->test("param", function($param) {
    echo $param;
});

예 4: 스태틱클래스 콜

class obj {
    public static function test($test_param, $my_function) {
        return $my_function($test_param);
    }
}

obj::test("param", function($param) {
    echo $param;
});

PHP 5.3 테스트 완료

여기 보시는 바와 같이 Anonymous Function이 도움이 됩니다.http://php.net/manual/en/functions.anonymous.php

필요한 것, 즉석에서 생성된 함수로 감싸지 않고 함수를 통과시키는 방법에 대해서는 설명되지 않습니다.나중에 알게 되겠지만 문자열에 기재된 함수 이름을 매개 변수로 전달하고 "콜 가능성"을 확인한 후 호출해야 합니다.

작업관리 체크 기능:

if( is_callable( $string_function_name ) ){
    /*perform the call*/
}

그런 다음 다음 http://php.net/manual/en/function.call-user-func.php에 있는 이 코드를 사용합니다(파라미터가 필요한 경우 어레이에 배치합니다).

call_user_func_array( "string_holding_the_name_of_your_function", $arrayOfParameters );

(유사하고 파라미터가 없는 방법으로) 다음과 같습니다.

    function funToBeCalled(){
        print("----------------------i'm here");
    }
    function wrapCaller($fun){
        if( is_callable($fun)){
            print("called");
            call_user_func($fun);
        }else{
            print($fun." not called");
        }
    }

    wrapCaller("funToBeCalled");
    wrapCaller("cannot call me");

여기 비슷한 것을 하는 방법을 설명하는 수업이 있습니다.

<?php
class HolderValuesOrFunctionsAsString{
    private $functions = array();
    private $vars = array();

    function __set($name,$data){
        if(is_callable($data))
            $this->functions[$name] = $data;
        else
            $this->vars[$name] = $data;
    }

    function __get($name){
        $t = $this->vars[$name];
        if(isset($t))
            return $t;
        else{
            $t = $this->$functions[$name];
            if( isset($t))
                return $t;
        }
    }

    function __call($method,$args=null){
        $fun = $this->functions[$method];
        if(isset($fun)){
            call_user_func_array($fun,$args);
        } else {
            // error out
            print("ERROR: Funciton not found: ". $method);
        }
    }
}
?>

사용 예

<?php
    /*create a sample function*/
    function sayHello($some = "all"){
    ?>
         <br>hello to <?=$some?><br>
    <?php
    }

    $obj = new HolderValuesOrFunctionsAsString;

    /*do the assignement*/
    $obj->justPrintSomething = 'sayHello'; /*note that the given
        "sayHello" it's a string ! */

    /*now call it*/
    $obj->justPrintSomething(); /*will print: "hello to all" and
        a break-line, for html purpose*/

    /*if the string assigned is not denoting a defined method
         , it's treat as a simple value*/
    $obj->justPrintSomething = 'thisFunctionJustNotExistsLOL';

    echo $obj->justPrintSomething; /*what do you expect to print?
        just that string*/
    /*N.B.: "justPrintSomething" is treated as a variable now!
        as the __set 's override specify"*/

    /*after the assignement, the what is the function's destiny assigned before ? It still works, because it's held on a different array*/
     $obj->justPrintSomething("Jack Sparrow");


     /*You can use that "variable", ie "justPrintSomething", in both ways !! so you can call "justPrintSomething" passing itself as a parameter*/

     $obj->justPrintSomething( $obj->justPrintSomething );
         /*prints: "hello to thisFunctionJustNotExistsLOL" and a break-line*/

    /*in fact, "justPrintSomething" it's a name used to identify both
         a value (into the dictionary of values) or a function-name
         (into the dictionary of functions)*/
?>

클래스를 사용한 간단한 예:

class test {

    public function works($other_parameter, $function_as_parameter)
    {

        return $function_as_parameter($other_parameter) ;

    }

}

$obj = new test() ;

echo $obj->works('working well',function($other_parameter){


    return $other_parameter;


});

다음은 각 데이터 항목 검증에 대해 개별 함수를 사용하여 여러 데이터 항목의 검증을 구현하는 간단한 절차 예입니다. 함수 인수의 배열로 마스터 검증 함수에 전달되며, 검증할 데이터(함수에 대한 인수)는 마스터 검증에 다른 배열 인수로 전달됩니다.기능.폼 데이터의 유효성을 확인하기 위한 범용 코드를 작성하는 데 유용합니다.

<?php
function valX($value) {
    echo "<p>Validating $value == 5</p>";
    if ($value == 5) {
        return true;
    } else {
        return false;
    }
}

function valY($value) {
    echo "<p>Validating $value == 6</p>";
    if ($value == 6) {
        return true;
    } else {
        return false;
    }
}

function validate($values, $functions) {
    for ($i = 0; $i < count($values); $i++) {
        if ($functions[$i]($values[$i])) {
            echo "<p>$values[$i] passes validation</p>";
        } else {
            echo "<p>$values[$i] fails validation</p>";
        }
    }
}

$values = [5, 9];
$functions = ['valX', 'valY'];
validate($values, $functions);
?>

언급URL : https://stackoverflow.com/questions/2700433/accept-function-as-parameter-in-php

반응형