DI 종속성 주입 및 phalapi의 싱글톤 구현

*文
풀어 주다: 2023-03-18 10:10:01
원래의
1862명이 탐색했습니다.

단순이자 모델과 의존성 주입에 익숙하신 분들이 많을 거라 생각합니다. 이 글에서는 phalapi의 DI 의존성 주입과 싱글턴 모드에 대해 주로 설명합니다. 의존성 주입과 싱글턴 모드에 관심이 있는 학생들은 한번 살펴보세요.

1. 싱글턴 모드

오랫동안 객체지향 프로그래밍을 해왔던 아이들에게는 싱글턴 모드가 낯설지 않을 것입니다. PHP를 배우는 아이들도 한 번쯤은 들어봤을 것입니다. 모드는 어떤 것이고, 어떤 문제가 해결되며, PhalApi에서는 어떻게 구현되나요?

싱글톤, 소위 싱글톤은 단 하나의 존재라는 뜻입니다. 싱글톤이므로 어렵지 않습니다. 리소스를 덜 사용하기 때문에 이점을 확인하세요. 클래스를 사용하려면 새로운 인스턴스가 있어야 한다는 사실은 누구나 알고 있습니다. 프로그램을 한 번 실행하는 데 많은 새로운 인스턴스가 사용되면 동일한 객체가 동일한 객체로 변환되면 더 많은 리소스를 소비하지만 전역 변수를 사용하는 범용 프로그램이라면 우아하지 않고 지저분해집니다. .이 경우 싱글턴 모드가 생성됩니다.


싱글턴 모드는 두 가지 모두에서 최고입니다. 두 번째로 너무 많은 리소스를 차지할 염려가 없으며 세 번째로, 매우 우아합니다. PhalApi에서 싱글톤 모드를 구현하는 방법을 살펴보겠습니다.

//大家看到我们常用的DI方法内部实现的是PhalApi_DI中的静态方法one方法
function DI() {
    return PhalApi_DI::one();
}
로그인 후 복사

그런 다음 One 메소드 내부를 살펴보겠습니다.


요청할 때마다 먼저 정적 변수 인스턴스가 초기화되지 않았는지 확인합니다. 첫 번째 호출인 경우 내부적으로 PhalApi_DI 클래스를 인스턴스화한 다음 $instance에 음수 값을 제공하고 다음 번에 요청할 때 이 정적 변수가 인스턴스화되어 바로 건너뜁니다. PhalApi 프레임워크의 모든 곳에서 사용하는 DI인 이 객체를 직접 반환합니다. 메소드는 실제로 객체이며, 코드는 다음과 같습니다:

public static function one(){
    if(self::$instance == NULL){
        self::$instance = new PhalApi_DI();
        self::$instance->onConstruct();
    }
    return self::$instance;
}
로그인 후 복사

사실. , 어렵지 않습니다. new를 사용하여 클래스의 작업을 new가 필요한 클래스의 정적 메서드로 캡슐화한 다음 위와 동일한 판단을 내리면 쉽게 싱글톤 모드를 구현할 수 있습니다.


2. 종속성 주입

종속성 주입은 "제어 반전"이라고도 합니다. Javaweb 개발의 스프링 프레임워크에 익숙하다면 여기에서 자세히 설명하지 않고 간단히 설명하겠습니다. PhalApi에서 DI 종속성 주입을 구현하여 모든 사람이 이 디자인 패턴을 구현하는 방법과 이를 기반으로 구현된 지연 로딩 메커니즘을 이해할 수 있습니다.


2.1 DI 종속성 주입 구현

PhalApi에서 일반적으로 사용되는 DI() 메서드는 다음과 같습니다. 위에서 소위 싱글톤 모드를 채택하는 것은 말할 필요도 없이 DI()를 사용할 때마다 실제로 PhalApi_DI 클래스를 사용하므로 종속성 주입의 핵심은 PhalApi_DI


먼저 이야기해 보겠습니다. 구현 방법 중 하나에 대해 설명하고 구체적인 구현에 대해 이야기해 보겠습니다. 다음은 예입니다:

//配置
DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');
로그인 후 복사

실제로 내부적으로 config를 키로 사용하는 배열이 있습니다. new PhalApi_Config_File(API_ROOT . '/Config') 값으로 사용되어 저장됩니다. 다음에 DI->config->get();을 사용하면 키 값 config에 따라 새 클래스가 제거됩니다. DI(), DI()->config를 사용할 때 항상 인스턴스를 사용하므로 리소스 소비도 줄일 수 있습니다.

DI()->config가 왜 DI()->config에 저장되는지 궁금해하는 어린이도 있습니다. 관심이 있으시면 Baidu에서 마법의 방법을 사용하여

/**大家可以看到这是PhalApi_DI中的魔法方法__set
 * 也就是当使用DI()->config = new PhalApi_Config_File(API_ROOT . '/Config');的时候
 * 获得的name值就是config,获得的value也就是new PhalApi_Config_File(API_ROOT . '/Config');
 */get同理,在内部实现都是调用了内部get和set方法
public function __set($name, $value){
    $this->set($name, $value);
}
public function __get($name){
    return $this->get($name, NULL);
}
로그인 후 복사

를 얻으실 수 있습니다. 이 내용을 읽으시고 나면 나중에 직접 사용해도 될 것 같으신가요?


2.2 지연 로딩

PhalApi의 DI() 메소드도 지연 로딩을 제공합니다. 지연 로딩은 문자 그대로 클래스가 사용되지 않을 때 로드되지 않습니다. 이 작업은 불필요한 리소스 낭비를 방지하기 위한 것이기도 합니다. 사용하지 않을 때는 절대 인스턴스화하지 않습니다. 이 클래스를 새로 만든 다음 인스턴스화하여 어떻게 사용하는지 살펴보겠습니다.

//当我们执行以下语句的时候,在依赖注入的时候存的是value值是字符串的test
DI()->test = 'test';
//使用DI()->test->test();的时候会使用到PhalApi中的get方法,在get方法中有一段代码
$this->data[$key] = $this->initService($this->data[$key]);
//在initService方法内部验证了value是字符串就实例化了再返回
if($config instanceOf Closure){
    $rs = $config();
}elseif(is_string($config) && class_exists($config)){
    $rs = new $config();
    if(is_callable(array($rs, 'onInitialize'))){
        call_user_func(array($rs, 'onInitialize'));
    }
}else{
    $rs = $config;
}
로그인 후 복사

관련 권장 사항:

phalapi - 데이터베이스 읽기 및 쓰기 분리를 달성하는 방법

phalapi-cache 사용 및 Redis 확장

PhalApi(π 프레임)

위 내용은 DI 종속성 주입 및 phalapi의 싱글톤 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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