


Detailed explanation of how PHP implements automatic dependency injection based on reflection mechanism
This article mainly introduces the method of automatic dependency injection in PHP based on the reflection mechanism. It analyzes the steps, principles and related operating techniques of using reflection to realize automatic dependency injection in PHP in the form of examples. Friends in need can refer to it
Dependency injection is also called inversion of control. Anyone who has used the framework should be familiar with it. Many people think it is something very high-end when they see the name, and are daunted by it. Today I took the time to do some research and unravel its mystery. Without further ado, let’s go straight to the code;
/** * * 工具类,使用该类来实现自动依赖注入。 * */ class Ioc { // 获得类的对象实例 public static function getInstance($className) { $paramArr = self::getMethodParams($className); return (new ReflectionClass($className))->newInstanceArgs($paramArr); } /** * 执行类的方法 * @param [type] $className [类名] * @param [type] $methodName [方法名称] * @param [type] $params [额外的参数] * @return [type] [description] */ public static function make($className, $methodName, $params = []) { // 获取类的实例 $instance = self::getInstance($className); // 获取该方法所需要依赖注入的参数 $paramArr = self::getMethodParams($className, $methodName); return $instance->{$methodName}(...array_merge($paramArr, $params)); } /** * 获得类的方法参数,只获得有类型的参数 * @param [type] $className [description] * @param [type] $methodsName [description] * @return [type] [description] */ protected static function getMethodParams($className, $methodsName = '__construct') { // 通过反射获得该类 $class = new ReflectionClass($className); $paramArr = []; // 记录参数,和参数类型 // 判断该类是否有构造函数 if ($class->hasMethod($methodsName)) { // 获得构造函数 $construct = $class->getMethod($methodsName); // 判断构造函数是否有参数 $params = $construct->getParameters(); if (count($params) > 0) { // 判断参数类型 foreach ($params as $key => $param) { if ($paramClass = $param->getClass()) { // 获得参数类型名称 $paramClassName = $paramClass->getName(); // 获得参数类型 $args = self::getMethodParams($paramClassName); $paramArr[] = (new ReflectionClass($paramClass->getName()))->newInstanceArgs($args); } } } } return $paramArr; } }
The above code uses the reflection function of PHP to create a container class and use this class to Implement dependency injection functions for other classes. The above dependency injection is divided into two types, one is dependency injection of constructor, and the other is dependency injection of method. We use the following three classes for testing.
class A { protected $cObj; /** * 用于测试多级依赖注入 B依赖A,A依赖C * @param C $c [description] */ public function __construct(C $c) { $this->cObj = $c; } public function aa() { echo 'this is A->test'; } public function aac() { $this->cObj->cc(); } } class B { protected $aObj; /** * 测试构造函数依赖注入 * @param A $a [使用引来注入A] */ public function __construct(A $a) { $this->aObj = $a; } /** * [测试方法调用依赖注入] * @param C $c [依赖注入C] * @param string $b [这个是自己手动填写的参数] * @return [type] [description] */ public function bb(C $c, $b) { $c->cc(); echo "\r\n"; echo 'params:' . $b; } /** * 验证依赖注入是否成功 * @return [type] [description] */ public function bbb() { $this->aObj->aac(); } } class C { public function cc() { echo 'this is C->cc'; } }
// 使用Ioc来创建B类的实例,B的构造函数依赖A类,A的构造函数依赖C类。 $bObj = Ioc::getInstance('B'); $bObj->bbb(); // 输出:this is C->cc , 说明依赖注入成功。 // 打印$bObj var_dump($bObj); // 打印结果,可以看出B中有A实例,A中有C实例,说明依赖注入成功。 object(B)#3 (1) { ["aObj":protected]=> object(A)#7 (1) { ["cObj":protected]=> object(C)#10 (0) { } } }
Ioc::make('B', 'bb', ['this is param b']); // 输出结果,可以看出依赖注入成功。 this is C->cc params:this is param b
Related reading:
PHP Reflection usage example code
PHP reflection mechanism code to implement dynamic proxy
The above is the detailed content of Detailed explanation of how PHP implements automatic dependency injection based on reflection mechanism. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











Multiple calls to session_start() will result in warning messages and possible data overwrites. 1) PHP will issue a warning, prompting that the session has been started. 2) It may cause unexpected overwriting of session data. 3) Use session_status() to check the session status to avoid repeated calls.

IIS and PHP are compatible and are implemented through FastCGI. 1.IIS forwards the .php file request to the FastCGI module through the configuration file. 2. The FastCGI module starts the PHP process to process requests to improve performance and stability. 3. In actual applications, you need to pay attention to configuration details, error debugging and performance optimization.

session_start()iscrucialinPHPformanagingusersessions.1)Itinitiatesanewsessionifnoneexists,2)resumesanexistingsession,and3)setsasessioncookieforcontinuityacrossrequests,enablingapplicationslikeuserauthenticationandpersonalizedcontent.

AI can help optimize the use of Composer. Specific methods include: 1. Dependency management optimization: AI analyzes dependencies, recommends the best version combination, and reduces conflicts. 2. Automated code generation: AI generates composer.json files that conform to best practices. 3. Improve code quality: AI detects potential problems, provides optimization suggestions, and improves code quality. These methods are implemented through machine learning and natural language processing technologies to help developers improve efficiency and code quality.

Configuring and running PHP on IIS requires the following steps: 1) Download and install PHP, 2) Configuring IIS and adding FastCGI module, 3) Create and set up an application pool, 4) Create a website and bind to an application pool. Through these steps, you can easily deploy PHP applications on your Windows server and improve application stability and efficiency by configuring scaling and optimizing performance.

MySQL functions can be used for data processing and calculation. 1. Basic usage includes string processing, date calculation and mathematical operations. 2. Advanced usage involves combining multiple functions to implement complex operations. 3. Performance optimization requires avoiding the use of functions in the WHERE clause and using GROUPBY and temporary tables.

HTML5 brings five key improvements: 1. Semantic tags improve code clarity and SEO effects; 2. Multimedia support simplifies video and audio embedding; 3. Form enhancement simplifies verification; 4. Offline and local storage improves user experience; 5. Canvas and graphics functions enhance the visualization of web pages.

Composer is a dependency management tool for PHP, and manages project dependencies through composer.json file. 1) parse composer.json to obtain dependency information; 2) parse dependencies to form a dependency tree; 3) download and install dependencies from Packagist to the vendor directory; 4) generate composer.lock file to lock the dependency version to ensure team consistency and project maintainability.
