>  기사  >  백엔드 개발  >  PHP 클로저 소개(Closure)

PHP 클로저 소개(Closure)

不言
不言원래의
2018-07-04 17:10:352087검색

이 글은 주로 PHP 클로저(Closure)의 소개를 다루고 있습니다. 이제는 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

익명 기능

클로저에 관해서는 생각해야 합니다. 클로저 함수(클로저)라고도 불리는 익명 함수의 경우 PHP 클로저 구현이 주로 이에 의존하는 것으로 보입니다. 익명 함수 선언은 다음과 같습니다.

$func = function() {
    
}; //带结束符

보시다시피 익명 함수에는 이름이 없으므로 사용하려면 변수에 반환해야 합니다. 익명 함수도 일반 함수처럼 매개변수를 선언할 수 있으며 호출 방법도 동일합니다.

$func = function( $param ) {
    echo $param;
};
$func( 'some string' );

//输出:
//some string

그런데 PHP가 클로저를 도입하기 전에는 익명 함수를 생성할 수 있는 함수도 있었습니다. 함수를 생성하지만 코드 로직은 다음과 같습니다. 문자열로만 작성하면 모호하고 유지 관리가 어려워서 사용하는 사람이 거의 없습니다.

클로저 구현

익명 함수를 일반 함수의 매개변수로 전달하면 반환도 가능합니다. 이는 간단한 폐쇄를 구현합니다.

아래에는 세 가지 예가 있습니다

//例一
//在函数里定义一个匿名函数,并且调用它
function printStr() {
    $func = function( $str ) {
        echo $str;
    };
    $func( 'some string' );
}

printStr();



//例二
//在函数中把匿名函数返回,并且调用它
function getPrintStrFunc() {
    $func = function( $str ) {
        echo $str;
    };
    return $func;
}

$printStrFunc = getPrintStrFunc();
$printStrFunc( 'some string' );




//例三
//把匿名函数当做参数传递,并且调用它
function callFunc( $func ) {
    $func( 'some string' );
}

$printStrFunc = function( $str ) {
    echo $str;
};
callFunc( $printStrFunc );

//也可以直接将匿名函数进行传递。如果你了解js,这种写法可能会很熟悉
callFunc( function( $str ) {
    echo $str;
} );

클로저와 외부 변수를 연결하는 키워드: USE

클로저는 일부 변수와 값이 위치한 코드 블록의 컨텍스트에서 일부 변수와 값을 저장할 수 있습니다. 기본적으로 PHP에서 익명 함수는 자신이 위치한 코드 블록의 컨텍스트 변수를 호출할 수 없지만 use 키워드를 사용해야 합니다.

또 다른 예를 살펴보겠습니다.

function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}
getMoney();

//输出:
//1
//报错,找不到dorllar变量

use 키워드에 dollar가 선언되지 않아 이 익명 함수에서는 달러를 얻을 수 없으므로 개발 시 이 문제에 주의해야 합니다.

익명 함수에서 컨텍스트 변수를 변경하는 것이 가능한지 궁금해하시는 분들도 계시겠지만, 저는 불가능하다는 것을 알게 되었습니다.

function getMoney() {
    $rmb = 1;
    $func = function() use ( $rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}
getMoney();

//输出:
//1
//1

아, 알고 보니 use는 변수의 복사본만을 참조하는 것이었습니다. 하지만 복사본이 아닌 변수에 대한 전체 참조를 원합니다.

이 효과를 얻으려면 변수 앞에 & 기호를 추가하면 됩니다.

function getMoney() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    $func();
    echo $rmb;
}
getMoney();

//输出:
//1
//2

알겠습니다. 그러면 익명 함수가 컨텍스트 변수를 참조할 수 있습니다. 익명 함수가 외부 세계로 반환되면 익명 함수는 사용으로 참조되는 변수를 저장하지만 외부 세계에서는 이러한 변수를 얻을 수 없게 됩니다. 이렇게 하면 '클로저'의 개념이 더 명확해질 수 있습니다.

설명에 따라 위의 예를 변경하세요.

function getMoneyFunc() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}

$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();

//输出:
//1
//2
//3

Summary

PHP 클로저의 특성에 대해 별로 놀랄 일이 아닙니다. 실제로 CLASS를 사용하면 비교할 수 없는 기능을 얻을 수 있습니다. js 클로저를 사용하면 앞으로 PHP의 클로저 지원이 향상되기를 기대할 수 있습니다. 그러나 익명 함수는 여전히 매우 유용합니다. 예를 들어 preg_replace_callback과 같은 함수를 사용하는 경우 외부에서 콜백 함수를 선언할 필요가 없습니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장사항:

php에서 스크립트의 비동기 실행 소개

AOP를 구현하는 PHP의 기본

위 내용은 PHP 클로저 소개(Closure)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.