PHP의 클로저(Closure) 익명함수에 대한 사전 이해

怪我咯
풀어 주다: 2023-03-11 17:58:01
원래의
1082명이 탐색했습니다.

이 글은 주로 php5.3에서 소개된 PHP 익명함수, 즉 클로저(Closure)와 클로저의 역할에 대해 매우 자세하게 소개하고 있습니다.

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

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

그런데 PHP가 클로저를 도입하기 전에는 익명 함수를 생성할 수 있는 함수도 있었습니다: create function이지만 코드 로직은 string로만 작성할 수 있습니다. 모호하고 유지 관리가 쉽지 않아 사용하는 사람이 거의 없습니다.

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
로그인 후 복사

아, references를 사용하는 것은 단지 변수의 복사본이라는 것이 밝혀졌습니다. 하지만 복사본이 아닌 변수에 대한 전체 참조를 원합니다.

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

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와 비교할 수 없습니다. PHP의 클로저 지원에 대한 향후 개선을 기대할 수 있습니다. 그러나 익명 함수는 여전히 매우 유용합니다. 예를 들어 preg_replace_callback과 같은 함수를 사용할 때 외부에서 콜백 함수를 선언할 필요가 없습니다.

위 내용은 PHP의 클로저(Closure) 익명함수에 대한 사전 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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