익명 함수(클로저 기능)부터 PHP 디자인 패턴 컨테이너 패턴까지

藏色散人
풀어 주다: 2023-04-05 19:46:01
앞으로
3093명이 탐색했습니다.

익명 함수(클로저 함수)

익명 함수(클로저 함수라고도 함)를 사용하면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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