이 글은 주로 채팅 프레임워크 개발에 관한 의존성 주입, 컨테이너 및 모양 모드(상단)를 소개합니다. 이제 필요한 친구들이 참고할 수 있도록 공유합니다.
1. 의존성 주입 및 솔루션 Lotus
사랑에 빠진 남자와 여자는 당신 없이는 살 수 없다고 자주 말합니다. 이것은 얼마나 깊은 의존입니까~~
프로그래밍에서 의존의 본질은 우리 삶의 의존과 같습니다. 당신의 지원이 없으면 나도 없을 것입니다.
두 가지 유형의 종속성이 있습니다. 하나는 기능적이며 다른 하나는 아래 예를 사용하여 설명합니다.
이제 다음 작업이 있습니다.
사용자 로그인 작업
1. , 템플릿 출력;
2. 각각 Db 클래스, Validate 클래스 및 View 클래스에 해당합니다.
3. 학생들은 구체적인 예제를 직접 완성해야 합니다. 고객이 무엇인지 간단히 이해하세요.
1. 클라이언트: 요청을 시작할 수 있는 한 클라이언트, 브라우저 또는 코드 조각으로 간주될 수 있습니다.
2 다음 코드는 User 클래스를 인스턴스화하고 작동하도록 내부 로그온 메서드를 호출합니다.
3. 따라서 $user = new User();는 클라이언트 코드입니다.
4. 또는 이렇게 이해하면 클래스나 함수 코드 외부에 작성된 모든 내용을 클라이언트로 간주할 수 있습니다. 코드는 다음과 같습니다.
<?php //数据库操作类 class Db { //数据库连接 public function connect() { return '数据库连接成功<br>'; } } //数据验证类 class Validate { //数据验证 public function check() { return '数据验证成功<br>'; } } //视图图 class View { //内容输出 public function display() { return '用户登录成功'; } } //用户类 class User { //用户登录操作 public function login() { //实例化Db类并调用connect()连接数据库 $db = new Db(); echo $db->connect(); //实例化Validate类并调用check()进行数据验证 $validate = new Validate(); echo $validate->check(); //实例化视图类并调用display()显示运行结果 $view = new View(); echo $view->display(); } } //创建User类 $user = new User(); //调用User对象的login方法进行登录操作 echo $user->login();
위 코드는 정상적으로 작동하지만 여전히 다음과 같은 문제가 있습니다.
1. 위 4개 클래스 중 User만 실제 작업 클래스이고 나머지 3개는 도구 클래스(Db)입니다. , Validate, View)
2. 워크 클래스에서 호출되는 툴 클래스가 변경되면 Db 파라미터 변경 등 해당 툴 클래스에 대한 모든 참조 코드를 수정해야 합니다
3. 워크 클래스의 호출자는 매우 친숙해야 합니다. 사용할 모든 도구 클래스에 대해 매개변수와 반환 값을 이해해야 합니다.
4. 작업 클래스는 위의 세 가지 도구 클래스에 심각한 의존성을 형성했으며 이를 클래스 간 심각한 결합이라고도 합니다.
다음으로 사용합니다. 커플링을 분리하기 위해 가장 일반적으로 사용되는 종속성 주입(DI)
먼저 디커플링의 기본 개념을 이해하겠습니다.
1. 종속성 주입은 신성하지 않습니다.
2. 본질적으로 도구 클래스의 인스턴스화는 완료되지 않습니다. 작업 클래스이지만 작업 클래스 외부 즉, 클라이언트에서 완료됩니다.
3. 도구 클래스의 인스턴스화는 클라이언트에서 완료되므로 작업 클래스에 저장해야 합니다. 인스턴스화된 도구 개체
4 이때 사용자가 클라이언트에 넣을 수 있습니다. 인스턴스화된 도구 개체는 매개변수 형식으로 작업 클래스의 메서드에 직접 전달됩니다.
5. 현재 외부에서 작동하는 클래스를 종속성 주입이라고 합니다
소스 코드는 다음과 같습니다
<?php //数据库操作类 class Db { //数据库连接 public function connect() { return '数据库连接成功<br>'; } } //数据验证类 class Validate { //数据验证 public function check() { return '数据验证成功<br>'; } } //视图图 class View { //内容输出 public function display() { return '用户登录成功'; } } //用户类 class User { //创建三个成员属性,用来保存本类所依赖的对象 protected $db = null; protected $validate = null; protected $view = ''; //用户登录操作 public function login(Db $db, Validate $validate, View $view) { //实例化Db类并调用connect()连接数据库 // $db = new Db(); echo $db->connect(); //实例化Validate类并调用check()进行数据验证 // $validate = new Validate(); echo $validate->check(); //实例化视图类并调用display()显示运行结果 // $view = new View(); echo $view->display(); } } //在客户端完成工具类的实例化(即工具类实例化前移) $db = new Db(); $validate = new Validate(); $view = new View(); //创建User类 $user = new User(); //调用User对象的login方法进行登录操作 // echo $user->login(); // 将该类依赖的外部对象以参数方式注入到当前方法中,当然,推荐以构造器方式注入最方便 echo '<h3>用依赖注入进行解藕:</h3>'; echo $user->login($db, $validate, $view);
종속 클래스의 인스턴스화는 클라이언트로 전달되지만 클래스 간의 종속성 문제는 해결됩니다
하지만 여전히 다음 문제:
1. 작업 클래스 사용자를 일반 도구로 만들기 위해서는 사전에 외부화해야 합니다. 필요한 모든 클래스는 사전에 인스턴스화됩니다.
2. 매개 변수, 반환 값 등 이러한 종속 클래스의 세부 사항을 잘 이해하고 있어야 합니다.
그러면 사용자가 인스턴스를 사용하도록 허용할 수 있습니까? 종속 클래스를 변환하는 단계를 생략하는 것이 더 좋고 간단하지 않을까요? 외부 종속 클래스를 호출할 때 클래스 이름과 클래스 인스턴스를 생성하는 메서드(생성자)만 제공하면 되나요?
즉, 클래스 이름, 클래스 인스턴스를 생성하는 메서드, 나머지는 무시하세요
이제 "컨테이너 기술"을 사용하여 이 바보같은 디커플링 프로세스를 구현합니다
위 내용이 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다. PHP 중국어 웹사이트를 주목하세요!
관련 권장 사항:
프레임워크 개발의 종속성 주입, 컨테이너 및 모양 패턴에 대해 이야기해 보겠습니다(2부)위 내용은 프레임워크 개발에서 종속성 주입, 컨테이너 및 모양 패턴에 대해 이야기해 보겠습니다(1부).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!