익명 함수(클로저 함수)
익명 함수(클로저 함수라고도 함)를 사용하면 The 없이 함수를 임시로 생성할 수 있습니다. 지정된 이름의 함수는 콜백 함수 매개변수의 값으로 사용되는 경우가 많으며, 변수의 값으로도 사용할 수 있습니다. 구체적인 사용법은 다음 예제 코드를 참조하세요.
/* 示例一:声明一个简单匿名函数,并赋值给一个变量,通过变量名调用这个匿名函数 */ $anonFunc = function($param){ echo $param; }; $anonFunc('这里是一个匿名函数'); // 通过变量名调用匿名函数,和普通函数没什么区别 /* 示例二:通过在函数内部使用匿名函数动态创建函数 */ function operate($operator){ if($operator == '+'){ return function($a, $b){ return $a + $b; } } if($operator == '-'){ return function($a, $b){ return $a - $b; } } } $add = operate('+'); echo $add(4, 3); // 7 $sub = operate('-'); echo $sub(4, 3); // 1 /* 示例三:匿名函数作为回调函数参数传入 */ function callback($callback){ $callback(); } function callback(){ // 闭包测试函数 echo '这里是闭包测试函数体'; }
위 코드의 세 가지 예제에서 익명 함수는 매개변수를 전달하지 않습니다. 상위 함수 매개변수 변수는 하위 함수에서 직접 사용할 수 있지만 PHP 언어에서는 동일한 목적을 달성하려면 use($var) 키워드(코드 사용법 참고)를 사용해야 합니다. 위 코드의 예제 3을 다음과 같이 수정합니다.
/* 示例三修改:匿名函数作为参数传入,并且携带参数 */ function callback($callback) use ($content){ $callback($content); } $content = '这里是闭包函数的输出内容'; function callback($content){ // 闭包函数 echo $content; }
위 코드의 예제 2에서는 use 키워드를 사용하여 상위 함수의 외부 변수에 대한 익명 함수의 참조를 구현할 수도 있습니다. . 이 샘플 코드에서 익명 함수와 클로저 기능을 사용하는 것은 개념을 이해하기 위한 것일 뿐 실제적인 의미는 크지 않습니다. 클로저는 다양한 용도로 사용되며 PHP에서 컨테이너 모드의 DI(종속성 주입)에 가장 일반적으로 사용됩니다. 뼈대.
PHP 객체지향 컨테이너 패턴
이름에서 알 수 있듯이 컨테이너는 물건을 저장하는 데 사용됩니다. 실제로는 선언하는 것입니다. 사물을 저장하는 데 특별히 사용되는 클래스입니다. 객체 인스턴스를 가져옵니다. 이 경우 컨테이너에 종속성을 바인딩하고 컨테이너에서 종속성을 얻으려면 컨테이너에 두 개 이상의 핵심 메서드가 있어야 합니다. 컨테이너는 종속성 관리 도구라고 할 수 있으며 서비스 컨테이너라고도 합니다.
/* 声明一个简单的容器类 */ class Container{ private $_diList = array(); // 用于存放依赖 /* 核心方法之一,用于绑定服务 * @param string $className 类名称 * @param mixed $concrete 依赖在容器中的存储方式,可以是类名字符串,数组,一个实例化对象,或者是一个匿名函数 */ puclic function set($className, $concrete){ $this->_diList[$className] = $concrete; } /* * 核心方法之二,用于获取服务对象 * @param string $className 将要获取的依赖的名称 * @return object 返回一个依赖的实例化对象 */ public function get($className){ if(isset($this->_diList[$className])){ return $this->diList[$className]; } return null; } }
위 코드는 간단한 컨테이너 패턴으로, 종속성을 등록하기 위해 set 메소드를 사용하고, 종속성을 얻기 위해 get 메소드를 사용합니다. 컨테이너가 종속성을 저장하는 방법에는 여러 가지가 있습니다. 다음 예제 코드에서는 익명 함수를 예시로 사용합니다.
/* 数据库连接类 */ class Connection{ public function __construct($dbParams){ // connect the database... } public someDbTask(){ // code... } } /* 会话控制类 */ class Session{ public function openSession(){ session_start(); } // code... } $container->set('session', function(){ return new Session(); }); $container = new Container(); // 使用容器注册数据库连接服务 $container->set('db', function(){ return new Connetion(array( "host" => "localhost", "username" => "root", "password" => "root", "dbname" => "dbname" )); }); // 使用容器注册会话控制服务 $container->set('session', function(){ return new Session(); }); // 获取之前注册到容器中的服务,并进行业务的处理 $container->get('db')->someDbTask(); $container->get('session')->openSession();
위의 코드는 db와 session 두 가지 서비스가 등록된 컨테이너 사용 방법입니다. 여기서는 익명 함수를 종속 저장 방식으로 사용하고 $container->set를 사용합니다. () 메소드가 호출되는데, 서비스 등록 시에는 실제로 인스턴스화되지 않고, 대신 종속성을 얻기 위해 $container->get() 메소드가 호출될 때 익명 함수가 실행되어 인스턴스화된 객체가 반환됩니다. 주문형 인스턴스화를 달성합니다. 인스턴스화가 없으면 프로그램의 실행 효율성이 향상됩니다.
위 내용은 익명 함수(클로저 기능)부터 PHP 디자인 패턴 컨테이너 패턴까지의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!