PHP의 리플렉션 및 종속성 주입 개념을 어떻게 이해하기 쉽게 이해할 수 있습니까?

WBOY
풀어 주다: 2016-08-04 09:21:40
원래의
860명이 탐색했습니다.

조언 부탁드립니다. 감사합니다

답글 내용:

조언 부탁드립니다. 감사합니다

이해할 필요는 없습니다. 농담이 아닙니다.
ZendFramework, ThinkPHP, CakePHP 등과 같은 프레임워크를 개발하지 않는 이상 이를 사용할 기회는 거의 없습니다.
이것은 매우 낮은 수준이며, 특히 종속성 주입의 적용 시나리오는 개발을 지원하기 위한 것입니다. 선택한 프레임워크는 종속성 주입만 지원하면 됩니다. 직접 구현할 필요는 없습니다. 리플렉션도 비슷합니다. 비즈니스 로직에서 리플렉션으로 해결해야 하는 문제는 한번도 본 적이 없습니다. 또한 프레임워크에서만 사용됩니다.

아, 잘못 읽으셨군요. 개념만 알면 됩니다.
리플렉션은 객체 인스턴스의 역분석을 통해 정보를 얻는 것입니다. 예를 들어, 리플렉션을 기반으로 PHPDocument를 자동으로 생성합니다.
의존성 주입이란 객체 생성 및 메소드 호출 시 필요한 매개변수를 자동으로 분석하여 자동으로 주입하는 것을 말합니다. 일반적으로 이러한 개체의 인스턴스는 특정 방법을 통해 얻어야 하며 간단한 새로 만들기를 통해 생성하기가 어렵습니다.

클래스 정보를 동적으로 얻어 수정하는 것을 소위 리플렉션이라고 합니다. 예를 들어, 일부 매직 메소드 __FUNCTION__, __METHOD__. 더 발전하려면 리플렉션 클래스 획득인 리플렉션클래스를 사용할 수 있습니다.
의존성 주입, 제어 역전이라고도 합니다. 시간이 나면 코드 데모를 게시하겠습니다

명확하게 설명할 수는 없습니다. 주로 클래스의 일부 매직 메서드입니다.
Baidu에서 PHP 직렬화 취약점을 검색할 수 있습니다

1 먼저 제가 익숙한 "의존성 주입"에 대해 설명하겠습니다. 종속성 주입이란 종속 객체를 사용할 때 새로 표시하는 것이 아니라 매개변수 형태로 한 번에 전달하는 것을 말합니다. 기장을 드세요:

<code>//这就是依赖注入。。。
class Bar
{
}

class Foo
{
    protected $bar;

    public function __construct(Bar $bar)
    {
        $this->bar = $bar;
    }

    public function getBar()
    {
        return $this->bar;
    }
}

$bar = new Bar();
$foo = new Foo($bar); //将类Bar的对象$bar通过参数的形式注入进去
</code>
로그인 후 복사

2 확장:
//종속 클래스 Human
추상 클래스 Human
{
}

//여성을 계승하다
여성이 인간을 확장하는 클래스
{
}

클래스맨이 인간을 확장하다
{

<code>protected $wife;

public function setWife(Human $human)
{
   $this->wife = $human;
}</code>
로그인 후 복사

}

$man = new Man();
$man->setWife(new Woman());

요약: 이전에 선언된 클래스에 의존하는 경우 이 클래스는 종속 클래스를 상속하는 모든 클래스가 될 수 있습니다(인터페이스에도 동일하게 적용됨)

리플렉션은 클래스(단지 클래스가 아님)에 대한 정보를 얻는 데 사용되는 역 매핑입니다. 예를 들어 클래스에 포함된 메서드, 이러한 메서드에 전달해야 하는 매개 변수, 각 매개 변수의 유형을 알고 싶습니다. .

종속성 주입에는 다음과 같은 반영이 필요합니다.

<code>class A
{
    protected $b;

    public function __constrcut(B $b)
    {
        $this->b = $b;
    }
}

// 通过控制反转容器生成 A 的实例时,会通过反射发现 A 的构造函数需要一个 B 类的实例
// 于是自动向 A 类的构造函数注入 B 类的实例
$a = IoC::make(A::class);</code>
로그인 후 복사

리플렉션은 또한 단위 테스트에서 일련의 어설션 만들기, 일부 개인 속성 획득 결정, PHPDocument 문서 생성 등 다양한 용도로 사용됩니다(리플렉션은 메서드 및 클래스에 대한 주석을 얻을 수 있기 때문입니다).

제어 반전과 종속성 주입은 당연히 이 기능을 사용해야 합니다.

종속성 주입에 대해서는 내 블로그에서 이 기사를 참조할 수 있습니다. 비록 Laravel 프레임워크용으로 작성되었지만 이는 또한 보편적입니다(Laravel에서 사용하는 디자인 패턴은 매우 풍부하고 남용되지 않습니다. 딱 맞고 아주 좋습니다. 학습에 적합):

https://www.insp.top/article/learn-laravel-container

종속성 주입은 클래스 객체를 동적으로 로드하고 인스턴스화하는 것입니다. 일반적으로 구성 파일을 읽고 요청 시 로드하는 데 사용됩니다.

이 외에도 리플렉션은 객체의 멤버에 동적으로 액세스할 수도 있습니다. 스크립팅 언어 PHP의 반영은 더욱 강력하며 개체 내부의 연결 테이블을 수정하여 개체에 새 멤버를 추가할 수도 있습니다.

ie8은 e.cancelBubble=true를 사용합니다
다른 사람들은 e.stopPropagation()을 사용합니다

종속성 주입에 따르면 객체는 클래스의 생성자에 로드되며 일반적으로 구성이 완료된 후 어셈블리를 위해 기본 클래스에 로드됩니다. 여러 기능 달성
반영은 클래스의 속성과 메서드를 꺼내는 것입니다

给你推荐个地址吧,http://www.digpage.com/di.html,内容将的是yii2的依赖注入,里面的例子你看一遍差不多能明白是怎么回事了。

https://3v4l.org/1OVmo

<code>class Request 
{
    public function hello()
    {
        return 'hello ';
    }
}

class App
{
    public function name()
    {
        return 'the app';
    }
    public function response(Request $req, App $app)
    {
        return $req->hello().$app->name();
    }
}


//依赖查找 or 自动依赖注入
$c['App']     = new App;
$c['Request'] = new Request;

$r      = new ReflectionMethod('App', 'response');
$params = $r->getParameters();
$params = array_map(function($p) use ($c) {
    $className = $p->getClass()->name;
    return $c[$className]??null;
}, $params);

$res = $r->invokeArgs($c['App'], $params);


//手动依赖注入
$app = new App;
$req = new Request;
$res = $app->response($req, $app);</code>
로그인 후 복사

只是名字比较唬人,其实很简单
反射其实就是获取类的信息(把类也看成是对象,然后通过反射类获取这个对象的一些属性), 你比如说有个发送邮件的类。

<code><?php 
class MailerService
{
    public $mail;
    
    public function __construct(Mailer $mail)
    {
       $this->setHandle($mail);
    }
    
    public function setHandle(Mailer $mail)
    {
         $this->mail = $mail;
    }
}</code>
로그인 후 복사

比如说:
我想知道这个类有哪些方法, 那我可以这样:

<code><?php 
$class = new ReflectionClass('MailerService');
$methods = $class->getMethods();</code>
로그인 후 복사

我想知道这个类的构造函数要传什么参数

<code><?php 
$method = new ReflectionMethod('MailerService', '__construct');
$paramters = $method->getParameters();</code>
로그인 후 복사

一言以蔽之, 反射就是获取类的信息的.

控制反转也很好理解,不过要先搞清楚, 控制反转和依赖注入不是一回事.
控制反转是一种目的,而实现方法之一就是依赖注入.
所谓的依赖注入就是不自己new class了, 而是由一个专门的类去做, 由这个类去解决类的依赖的问题,比如上面的MailerService类就依赖Mailer类, 这个专门的类会通过反射去获取MailerService类的构造函数需要什么参数,这个需要的参数也叫作依赖, 然后解决依赖. 这个就叫依赖注入. 一般通过依赖注入的方式来实现控制反转. 上述的那个专门的类一般也叫服务容器.

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