"이 문서에서는 간단한 컨테이너 클래스를 구현합니다
"
이 시점에서 Person 파일을 수정하겠습니다
구조를 추가합니다. 함수, 생성자를 사용하여 매개변수를 할당합니다. buy 메서드에서는 매개변수를 전달할 필요가 없으며 this->obj만 사용하면 됩니다.
지금도 dependency
라우트를 직접 실행하면 다음 오류가 보고됩니다. 이는 Person의 생성자에 매개변수가 있지만 이를 전달하지 않았기 때문입니다.
이때 한 가지 수정해야 할 것이 있는데, 즉 Person을 인스턴스화할 때 Car 인스턴스를 매개변수로 전달하면 문제가 없을 것입니다.
하지만 위의 코드가 무엇인지 알게 될 것입니다. 이 경우에는 디자인 패턴에 관계없이 득보다 실이 더 많습니다. 글쎄요, 블라인드 사용도 프로젝트에 부담이 됩니다.
여기서 Reflection이 위에서 간략하게 소개되었으니 꼭 읽어보세요! 기사는 모두 하나로 연결되어 있습니다.
반사 전투 최적화 코드
최종 최적화 코드는 이러합니다. 다음으로 이 코드를 간략하게 분석하겠습니다.
kaka/container/Container.php
这个类里边的get方法<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>
文件application/index/controller/Container.php
这里就是修改之后的变动
问题一: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 파일임을 알 수 있습니다. 동일한 네임스페이스 내의 파일로 직접적으로 이해할 수 있습니다. 🎜질문 2: 파일 application/index/controller/Container.php
buy 메서드를 직접 호출할 수 있는 이유는 무엇인가요?
먼저 obj의 값을 살펴보세요. Car 클래스는 반환된 개체에서 이미 인스턴스화되었으므로 인스턴스화할 필요가 없습니다. 매개변수가 직접 전달되기 때문에 buy direct 메소드를 호출할 수 있습니다.
위 내용은 Kaka에서 구현한 간단한 컨테이너입니다. 이해가 안 되거나 궁금한 점이 있으면 직접 답변해 주세요. 댓글 영역에서.
다음 단계는 프레임워크의 컨테이너를 분석하고 근본 원인을 단계별로 추적하는 것입니다.
“배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요
”
위 내용은 ThinkPHP는 자체 컨테이너 클래스를 사용합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!