> 백엔드 개발 > PHP 튜토리얼 > PHP 콜백 함수 분석

PHP 콜백 함수 분석

*文
풀어 주다: 2023-03-18 08:52:02
원래의
2798명이 탐색했습니다.

노드 개발에 익숙한 분들은 콜백 함수에 익숙하겠지만, PHP에서는 흔히 사용되지 않습니다. 실제로 PHP는 콜백 함수도 지원합니다. 오늘은 PHP에서 콜백 함수와 익명 함수의 사용법을 자세히 설명하겠습니다.

콜백 함수

콜백 함수: 콜백(즉, 콜백
은 메인 함수에 의해 호출된 후 메인 함수로 돌아갑니다)은 함수 매개변수를 통해 다른 코드로 전달되는 특정 실행 코드 블록에 대한 참조를 나타냅니다. .

사용하기 위해 함수를 다른 함수에 매개변수로 전달하는 것이 널리 사용됩니다. PHP에는 array_map, usort, call_user_func_array 등과 같이 "매개변수를 함수로 요구하는" 함수가 많이 있습니다. 그런 다음 결과를 직접 기본 함수로 반환합니다. 장점은 함수를 값으로 사용하기 편리하고, 코드가 간결하고 가독성이 좋다는 점입니다.

익명 함수:

익명 함수는 이름에서 알 수 있듯이 정해진 함수 이름이 없는 함수입니다. PHP는 익명 함수와 클로저를 동일한 개념으로 취급합니다(익명 함수는 PHP에서 클로저 함수라고도 합니다). 물론 사용법은 변수로만 사용할 수 있습니다.

PHP에서 변수에 함수를 할당하는 방법에는 네 가지가 있습니다.

우리가 자주 사용하는 방법은 함수가 외부에서/또는 PHP에 내장되어 정의되고, 함수 이름이 문자열 매개변수로 직접 전달되는 것입니다. 참고: 클래스 정적 함수인 경우 CLASS::FUNC_NAME으로 전달됩니다.

create_function($args, $func_code);를 사용하여 함수 이름을 반환하는 함수를 만듭니다.
$func_code는 코드 본문이고 $args는 ','로 구분된 매개변수 문자열입니다.

직접 할당: $func_name = function($arg){statement}

익명 함수를 직접 사용하고 함수를 직접 정의합니다.

첫 번째 방법은 일반적으로 사용되기 때문에 더 이상 언급되지 않습니다. 두 번째 방법도 eval() 방법과 마찬가지로 공식적으로 PHP에서 권장되지 않는 것으로 나열되어 있습니다. use 정의 방법이 너무 직관적이지 않습니다. 테스트를 제외하고는 다른 곳에서 사용한 적이 없으므로 언급하지 않겠습니다. 여기서는 세 번째와 네 번째 사용법에 중점을 둡니다.

후자의 두 가지에 의해 생성된 함수는 익명 함수, 즉 세 번째 할당 방법으로 생성된 함수는 매우 유연하며 변수를 통해 전달될 수 있습니다. is_callable($func_name)을 사용하여 이 함수를 호출할 수 있는지 테스트하거나 $func_name($var)을 통해 직접 호출할 수 있습니다. 네 번째 방법으로 생성된 함수는 JS의 콜백 함수와 더 유사하며 그렇지 않습니다.

또 다른 특별한 소개는 함수를 정의할 때 상위 범위의 변수를 참조하는 데 사용할 수 있는 키워드입니다. function($arg) use($outside_arg) {function_statement} . 그 중 $outside_arg는 상위 스코프의 변수로 function_statement에서 사용할 수 있습니다.

이 사용법은 "매개변수 값의 개수가 결정됩니다"라는 콜백 함수에서 사용됩니다. 예를 들어 usort에서는 $callback의 매개변수 값이 두 개의 항목이어야 하지만 정렬에 영향을 주기 위해 다른 매개변수를 도입해야 하는 경우에는 어떻게 될까요? use() 키워드를 사용하면 내부 사용을 위해 $callback에 새 변수를 도입하는 것이 매우 편리합니다.


array_map/array_filter/array_walk:

이 세 함수의 실행 논리는 다음 코드와 유사하게 상대적으로 유사하므로 이 세 함수를 함께 사용하세요.

$result = [];
foreach($vars as $key=>$val){
        $item = callback();
        $result[] = $item;
}
return $result;
array_walk($vars, $callback)
로그인 후 복사

콜백은 다음과 같아야 합니다.

$callback = function(&$val, $key[, $arg]){    
   doSomething($val);
}
로그인 후 복사

array_walk 실행 성공 여부를 Boolean 값으로 반환합니다. $value에 참조 기호를 추가하면 함수 내의 $value 값을 변경하여 $vars 배열을 변경하는 효과를 얻을 수 있습니다. $callback에는 두 개의 매개변수가 필요하므로 array_walk는 strtolower/array_filter와 같은 $callback을 전달할 수 없습니다. 비슷한 기능을 수행하려면 array_map()을 사용하여 다음에 설명할 수 있습니다.

array_walk_recursive($arr, $callback);

반환 값과 실행 메커니즘은 array_walk와 유사합니다.

콜백은 array_walk와 동일하지만 차이점은 $val이 배열인 경우 함수가 재귀적으로 처리한다는 것입니다. $val 하향 필수; 이 경우 $val은 배열의 $key이며 무시됩니다.

array_filter($vars, $callback, $flag);

its $callback은 다음과 유사합니다.

$callback = function($var){
   return true or false;         
}
로그인 후 복사

array_filter는 $callback이 실행될 때 false를 반환하는 항목을 필터링하고 array_filter는 필터링이 완료된 후 배열을 반환합니다.

세 번째 매개변수인 $flag는 콜백 매개변수인 $var의 값을 결정하지만, 이는 PHP 상위 버전의 기능일 수 있으며 직접 테스트할 수 있습니다. 기본적으로 배열에 있는 각 항목의 값이 전달됩니다. 플래그가 ARRAY_FILTER_USE_KEY이면 배열에 있는 각 항목의 키가 전달되고 ARRAY_FILTER_USE_BOTH는 키와 값에 전달됩니다.

array_map($callback, &$var_as [,$var_bs...]);

$callback은 다음과 유사합니다.

$callback = function($var_a[, $var_b...]){
     doSomething($var_a, $var_b);
}
로그인 후 복사

콜백으로 처리된 $var_as 배열을 반환합니다(배열이 여러 개인 경우 원래 배열이 변경됨). 두 배열 중 동일한 순서의 항목이 처리를 위해 전달되며 실행 횟수는 매개변수 배열의 숫자가 됩니다.


usort/array_reduce

이 두 함수를 넣으세요. 실행 메커니즘이 다소 특별하기 때문에 함께 사용됩니다.

usort(&$vars, $callback)

$callback은 다음과 같아야 합니다.

callback = function($left, $right){
    $res = compare($left, $right);
    return $res;
}
로그인 후 복사

usort는 실행 성공 여부를 부울 값으로 반환합니다. 사용자 정의 메서드는 $left와 $right를 비교합니다. 여기서 $left와 $right는 $vars의 두 항목입니다.

$left > $right는 양의 정수를 반환하고, $left < $left = $right;이면 0을 반환합니다.

$vars中的元素会被取出会被由小到大升序排序。 想实现降序排列,将$callback的返回值反一下就行了。

array_reduce($vars ,$callable [, mixed $initial = NULL])

$callback应该如下:

$callback = function($initial, $var){
    $initial = calculate($initail, $var);
    return $initial;
}
로그인 후 복사

初始值$initial默认为null,返回经过迭代后的initial;一定要将$initial返回,这样才能不停地改变$initial的值,实现迭代的效果。

这里顺便说一下map和reduce的不同:

map:将数组中的成员遍历处理,每次返回处理后的一个值,最后结果值为所有处理后值组成的多项数组;

reduce:遍历数组成员,每次使用数组成员结合初始值处理,并将初始值返回,即使用上一次执行的结果,配合下一次的输入继续产生结果,结果值为一项;


call_user_func/call_user_func_array

call_user_func[_array]($callback, $param)

$callback形如:

$callback = function($param){
    $result = statement(); 
    return $result;
}
로그인 후 복사

返回值多种,具体看$callback。

可用此函数实现PHP的事件机制,其实并不高深,在判断条件达成,或程序执行到某一步后 call_user_func()就OK了。这个我在之前的博客中也有介绍到:搭建自己的PHP框架心得(二)


总结

其实以上$callback不用单独定义并使用变量引用,使用上面说过的第四种函数定义方式,直接在函数内定义,使用‘完全’匿名函数就行了。 如:

usort($records, function mySortFunc($arg) use ($order){
      func_statement;
});
로그인 후 복사

是不是逼格满满呢?

相关阅读:

php的闭包(Closure)匿名函数初探

详解PHP匿名函数与注意事项

PHP匿名函数和use子句用法实例,匿名use子句实例_PHP教程

위 내용은 PHP 콜백 함수 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿