obj를 사용하면 됩니다."/> obj를 사용하면 됩니다.">

>PHP 프레임워크 >ThinkPHP >ThinkPHP는 자체 컨테이너 클래스를 사용합니다.

ThinkPHP는 자체 컨테이너 클래스를 사용합니다.

咔咔
咔咔원래의
2020-10-12 12:24:071957검색
"

이 문서에서는 간단한 컨테이너 클래스를 구현합니다

"

5. 자신만의 컨테이너 클래스로 플레이해 보세요

이 시점에서 Person 파일을 수정하겠습니다

구조를 추가합니다. 함수, 생성자를 사용하여 매개변수를 할당합니다. buy 메서드에서는 매개변수를 전달할 필요가 없으며 this->obj만 사용하면 됩니다.

ThinkPHP는 자체 컨테이너 클래스를 사용합니다.지금도 dependency 라우트를 직접 실행하면 다음 오류가 보고됩니다. 이는 Person의 생성자에 매개변수가 있지만 이를 전달하지 않았기 때문입니다.

ThinkPHP는 자체 컨테이너 클래스를 사용합니다. 이때 한 가지 수정해야 할 것이 있는데, 즉 Person을 인스턴스화할 때 Car 인스턴스를 매개변수로 전달하면 문제가 없을 것입니다.

ThinkPHP는 자체 컨테이너 클래스를 사용합니다.
여기에 그림 설명을 삽입하세요

하지만 위의 코드가 무엇인지 알게 될 것입니다. 이 경우에는 디자인 패턴에 관계없이 득보다 실이 더 많습니다. 글쎄요, 블라인드 사용도 프로젝트에 부담이 됩니다.

여기서 Reflection이 위에서 간략하게 소개되었으니 꼭 읽어보세요! 기사는 모두 하나로 연결되어 있습니다.

반사 전투 최적화 코드

최종 최적화 코드는 이러합니다. 다음으로 이 코드를 간략하게 분석하겠습니다.

  • 이전 코드를 기준으로 kaka/container/Container.php这个类里边的get方法
  • 判断这个名person是否在容器中
  • 使用反射接口,然后获取传进去person类的构造方法
  • 如果person没有构造方法就直接返回person这个实例即可
  • 如存person在构造函数,则获取person构造函数的方法
  • 由于person类里边的构造函数的参数不会仅限于一个
  • 所以需要循环来获取每个参数的对象
  • 最后使用反射的 newInstanceArgs接口创建对应的实例
<span style="display: block; background: url(https://my-wechat.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"></span><code class="hljs" style="overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;"><span class="hljs-meta" style="color: #61aeee; line-height: 26px;"><?php</span><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * Created by PhpStorm.<br/> * User: 咔咔<br/> * Date: 2020/9/21<br/> * Time: 19:04<br/> */</span><br/><br/><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">namespace</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">container</span>;<br/><br/><br/><span class="hljs-class" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">class</span> <span class="hljs-title" style="color: #e6c07b; line-height: 26px;">Container</span><br/></span>{<br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * 存放容器<br/>     * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@var</span> array<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> $instances = [];<br/><br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * 容器的对象实例<br/>     * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@var</span> array<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">protected</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">static</span> $instance;<br/><br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * 定义一个私有的构造函数防止外部类实例化<br/>     * Container constructor.<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">private</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">__construct</span><span class="hljs-params" style="line-height: 26px;">()</span> </span>{<br/><br/>    }<br/><br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * 获取当前容器的实例(单例模式)<br/>     * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@return</span> array|Container<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">static</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">getInstance</span> <span class="hljs-params" style="line-height: 26px;">()</span><br/>    </span>{<br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(is_null(<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance)){<br/>            <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">new</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>();<br/>        }<br/><br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance;<br/>    }<br/><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">set</span> <span class="hljs-params" style="line-height: 26px;">($key,$value)</span><br/>    </span>{<br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->instances[$key] = $value;<br/>    }<br/><br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * User : 咔咔<br/>     * Notes: 获取容器里边的实例  使用反射<br/>     * Time :2020/9/21 22:04<br/>     * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@param</span> $key<br/>     * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@return</span> mixed<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">get</span> <span class="hljs-params" style="line-height: 26px;">($key)</span><br/>    </span>{<br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(!<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">empty</span>(<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->instances[$key])){<br/>            $key = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->instances[$key];<br/>        }<br/><br/>        $reflect = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">new</span> \ReflectionClass($key);<br/>        <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">// 获取类的构造函数</span><br/>        $c = $reflect->getConstructor();<br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(!$c){<br/>            <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">new</span> $key;<br/>        }<br/><br/>        <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">// 获取构造函数的参数</span><br/>        $params = $c->getParameters();<br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">foreach</span> ($params <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">as</span> $param) {<br/>       <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>             ReflectionClass Object<br/>            (<br/>                [name] => container\dependency\Car<br/>            )<br/>             */</span><br/>            $class = $param->getClass();<br/>            <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(!$class){<br/><br/>            }<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">else</span>{<br/>                <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">// container\dependency\Car</span><br/>                $args[] = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->get($class->name);<br/>            }<br/>        }<br/>        <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">// 从给出的参数创建一个新的类实例</span><br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> $reflect->newInstanceArgs($args);<br/>    }<br/>}<br/></code>

ThinkPHP는 자체 컨테이너 클래스를 사용합니다.文件application/index/controller/Container.php这里就是修改之后的变动

ThinkPHP는 자체 컨테이너 클래스를 사용합니다.问题一:kaka/container/dependency/Person.php이름이 지정된 사람이 컨테이너에 있는지 확인

리플렉션 사용 그런 다음 전달된 person 클래스의 생성자를 가져옵니다.

🎜person에 생성자가 없는 경우 person의 인스턴스를 직접 반환하세요.🎜🎜If person 사람 생성자 메서드🎜🎜사람 클래스의 생성자 매개변수는 하나로 제한되지 않기 때문에🎜🎜 루프가 생성됩니다. 각 매개변수의 객체를 얻기 위해 필요합니다🎜🎜마지막으로 반영된 newInstanceArgs 인터페이스를 사용하여 해당 인스턴스를 생성합니다rrreee🎜여기에 이미지 설명 삽입fileapplication/index/controller/Container.php수정 후 변경 사항은 다음과 같습니다🎜🎜여기에 이미지 설명을 삽입하세요🎜질문 1: kaka/container/dependent/Person.php Car inside 매개변수는 무엇을 의미합니까? 이 질문은 실제로 매우 간단합니다. . 이 Car 는 같은 디렉토리의 Car.php 파일임을 알 수 있습니다. 동일한 네임스페이스 내의 파일로 직접적으로 이해할 수 있습니다. 🎜

ThinkPHP는 자체 컨테이너 클래스를 사용합니다.질문 2: 파일 application/index/controller/Container.phpbuy 메서드를 직접 호출할 수 있는 이유는 무엇인가요?

먼저 obj의 값을 살펴보세요. Car 클래스는 반환된 개체에서 이미 인스턴스화되었으므로 인스턴스화할 필요가 없습니다. 매개변수가 직접 전달되기 때문에 buy direct 메소드를 호출할 수 있습니다.

ThinkPHP는 자체 컨테이너 클래스를 사용합니다.
여기에 그림 설명을 삽입하세요

ThinkPHP는 자체 컨테이너 클래스를 사용합니다.위 내용은 Kaka에서 구현한 간단한 컨테이너입니다. 이해가 안 되거나 궁금한 점이 있으면 직접 답변해 주세요. 댓글 영역에서.

다음 단계는 프레임워크의 컨테이너를 분석하고 근본 원인을 단계별로 추적하는 것입니다.

배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요

위 내용은 ThinkPHP는 자체 컨테이너 클래스를 사용합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.