>백엔드 개발 >PHP 튜토리얼 >PHP의 클로저(Closure) 익명 function_php 스킬에 대한 예비 연구

PHP의 클로저(Closure) 익명 function_php 스킬에 대한 예비 연구

WBOY
WBOY원래의
2016-05-16 19:58:451167검색

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

$func = function() {
   
}; //带结束符
可以看到,匿名函数因为没有名字,如果要使用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,调用方法也相同:
$func = function( $param ) {
  echo $param;
};
 
$func( 'some string' );
 
//输出:
//some string

그런데 PHP가 클로저를 도입하기 전에는 익명 함수를 생성할 수 있는 함수도 있었습니다: create function. 그러나 코드 로직은 문자열로만 작성할 수 있어 매우 모호하고 유지 관리가 어려워 보였습니다. 사람들은 그것을 사용했습니다.

1. 클로저 구현
일반 함수의 매개변수로 익명 함수를 전달하는 것도 반환될 수 있습니다. 이는 간단한 폐쇄를 구현합니다.

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

//例一
//在函数里定义一个匿名函数,并且调用它
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;
} );

2. 클로저와 외부변수를 연결하는 키워드 : 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

요약
PHP 클로저의 기능에는 큰 놀라움이 없습니다. 실제로 CLASS를 사용하면 JS 클로저와 비교할 수 없는 훨씬 더 강력한 기능을 얻을 수 있습니다. 미래. 그러나 익명 함수는 여전히 매우 유용합니다. 예를 들어 preg_replace_callback과 같은 함수를 사용하는 경우 외부에서 콜백 함수를 선언할 필요가 없습니다.

이 기사가 여러분에게 몇 가지 팁을 줄 수 있기를 바라며, 마음에 드셨으면 좋겠습니다.

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