使用ä¾èµ–注入 ========================== 下é¢è¦è®²çš„è¿™ä¸ªä¾‹åæœ‰ç‚¹é•¿ï¼Œä½†å¯ä»¥å¾ˆå¥½çš„解释为什么使用Service Container以åŠDI。首先,我们å‡è®¾ï¼Œæˆ‘们è¦å¼€å‘一个组件命å为SomeComponent。这个组件ä¸çŽ°åœ¨å°†è¦æ³¨å…¥ä¸€ä¸ªæ•°æ®åº“连接。 在这个例åä¸ï¼Œæ•°æ®åº“连接在componentä¸è¢«åˆ›å»ºï¼Œè¿™ç§æ–¹æ³•是ä¸åˆ‡å®žé™…çš„ï¼Œè¿™æ ·åšçš„è¯ï¼Œæˆ‘们将ä¸èƒ½æ”¹å˜æ•°æ®åº“è¿žæŽ¥å‚æ•°åŠæ•°æ®åº“类型ç‰ä¸€äº›å‚数。 .. code-block:: php <?php class SomeComponent { /** * The instantiation of the connection is hardcoded inside * the component so is difficult to replace it externally * or change its behavior */ public function someDbTask() { $connection = new Connection(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo" )); // ... } } $some = new SomeComponent(); $some->someDbTask(); ä¸ºäº†è§£å†³ä¸Šé¢æ‰€è¯´çš„问题,我们需è¦åœ¨ä½¿ç”¨å‰åˆ›å»ºä¸€ä¸ªå¤–部连接,并注入到容器ä¸ã€‚就目å‰è€Œè¨€ï¼Œè¿™çœ‹èµ·æ¥æ˜¯ä¸€ä¸ªå¾ˆå¥½çš„解决方案: .. code-block:: php <?php class SomeComponent { protected $_connection; /** * Sets the connection externally */ public function setConnection($connection) { $this->_connection = $connection; } public function someDbTask() { $connection = $this->_connection; // ... } } $some = new SomeComponent(); //Create the connection $connection = new Connection(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo" )); //Inject the connection in the component $some->setConnection($connection); $some->someDbTask(); 现在我们æ¥è€ƒè™‘一个问题,我们在应用程åºä¸çš„ä¸åŒåœ°æ–¹ä½¿ç”¨æ¤ç»„件,将多次创建数æ®åº“连接。使用一ç§ç±»ä¼¼å…¨å±€æ³¨å†Œè¡¨çš„æ–¹å¼ï¼Œä»Žè¿™èŽ·å¾—ä¸€ä¸ªæ•°æ®åº“è¿žæŽ¥å®žä¾‹ï¼Œè€Œä¸æ˜¯ä½¿ç”¨ä¸€æ¬¡å°±åˆ›å»ºä¸€æ¬¡ã€‚ .. code-block:: php <?php class Registry { /** * Returns the connection */ public static function getConnection() { return new Connection(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo" )); } } class SomeComponent { protected $_connection; /** * Sets the connection externally */ public function setConnection($connection){ $this->_connection = $connection; } public function someDbTask() { $connection = $this->_connection; // ... } } $some = new SomeComponent(); //Pass the connection defined in the registry $some->setConnection(Registry::getConnection()); $some->someDbTask(); çŽ°åœ¨ï¼Œè®©æˆ‘ä»¬æ¥æƒ³åƒä¸€ä¸‹ï¼Œæˆ‘们必须在组件ä¸å®žçŽ°ä¸¤ä¸ªæ–¹æ³•ï¼Œé¦–å…ˆéœ€è¦åˆ›å»ºä¸€ä¸ªæ–°çš„æ•°æ®åº“连接,第二个总是获得一个共享连接: .. code-block:: php <?php class Registry { protected static $_connection; /** * Creates a connection */ protected static function _createConnection() { return new Connection(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo" )); } /** * Creates a connection only once and returns it */ public static function getSharedConnection() { if (self::$_connection===null){ $connection = self::_createConnection(); self::$_connection = $connection; } return self::$_connection; } /** * Always returns a new connection */ public static function getNewConnection() { return self::_createConnection(); } } class SomeComponent { protected $_connection; /** * Sets the connection externally */ public function setConnection($connection){ $this->_connection = $connection; } /** * This method always needs the shared connection */ public function someDbTask() { $connection = $this->_connection; // ... } /** * This method always needs a new connection */ public function someOtherDbTask($connection) { } } $some = new SomeComponent(); //This injects the shared connection $some->setConnection(Registry::getSharedConnection()); $some->someDbTask(); //Here, we always pass a new connection as parameter $some->someOtherDbTask(Registry::getConnection()); 到æ¤ä¸ºæ¢ï¼Œæˆ‘们已ç»çœ‹åˆ°äº†å¦‚何使用ä¾èµ–æ³¨å…¥è§£å†³æˆ‘ä»¬çš„é—®é¢˜ã€‚ä¸æ˜¯åœ¨ä»£ç 内部创建ä¾èµ–å…³ç³»ï¼Œè€Œæ˜¯è®©å…¶ä½œä¸ºä¸€ä¸ªå‚æ•°ä¼ é€’ï¼Œè¿™ä½¿å¾—æˆ‘ä»¬çš„ç¨‹åºæ›´å®¹æ˜“维护,é™ä½Žç¨‹åºä»£ç 的耦åˆåº¦ï¼Œå®žçŽ°ä¸€ç§æ¾è€¦åˆã€‚但是从长远æ¥çœ‹ï¼Œè¿™ç§å½¢å¼çš„ä¾èµ–注入也有一些缺点。 ä¾‹å¦‚ï¼Œå¦‚æžœç»„ä»¶ä¸æœ‰è¾ƒå¤šçš„ä¾èµ–关系,我们需è¦åˆ›å»ºå¤šä¸ªsetteræ–¹æ³•ä¼ é€’ï¼Œæˆ–åˆ›å»ºæž„é€ å‡½æ•°è¿›è¡Œä¼ é€’ã€‚å¦å¤–ï¼Œæ¯æ¬¡ä½¿ç”¨ç»„件时,都需è¦åˆ›å»ºä¾èµ–组件,使代ç 维护ä¸å¤ªæ˜“,我们编写的代ç å¯èƒ½åƒè¿™æ ·ï¼š .. code-block:: php <?php //Create the dependencies or retrieve them from the registry $connection = new Connection(); $session = new Session(); $fileSystem = new FileSystem(); $filter = new Filter(); $selector = new Selector(); //Pass them as constructor parameters $some = new SomeComponent($connection, $session, $fileSystem, $filter, $selector); // ... or using setters $some->setConnection($connection); $some->setSession($session); $some->setFileSystem($fileSystem); $some->setFilter($filter); $some->setSelector($selector); 我想,我们ä¸å¾—ä¸åœ¨åº”用程åºçš„è®¸å¤šåœ°æ–¹åˆ›å»ºè¿™ä¸ªå¯¹è±¡ã€‚å¦‚æžœä½ ä¸éœ€è¦ä¾èµ–的组件åŽï¼Œæˆ‘们åˆè¦åŽ»ä»£ç æ³¨å…¥éƒ¨åˆ†ç§»é™¤æž„é€ å‡½æ•°ä¸çš„傿•°æˆ–者是setteræ–¹æ³•ã€‚ä¸ºäº†è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œæˆ‘ä»¬å†æ¬¡è¿”回去使用一个全局注册表æ¥åˆ›å»ºç»„件。但是,在创建对象之å‰ï¼Œå®ƒå¢žåŠ äº†ä¸€ä¸ªæ–°çš„æŠ½è±¡å±‚ï¼š .. code-block:: php <?php class SomeComponent { // ... /** * Define a factory method to create SomeComponent instances injecting its dependencies */ public static function factory() { $connection = new Connection(); $session = new Session(); $fileSystem = new FileSystem(); $filter = new Filter(); $selector = new Selector(); return new self($connection, $session, $fileSystem, $filter, $selector); } } 这一刻,我们好åƒå›žåˆ°äº†é—®é¢˜çš„开始,我们æ£åœ¨åˆ›å»ºç»„件内部的ä¾èµ–ï¼Œæˆ‘ä»¬æ¯æ¬¡éƒ½åœ¨ä¿®æ”¹ä»¥åŠæ‰¾å¯»ä¸€ç§è§£å†³é—®é¢˜çš„åŠžæ³•ï¼Œä½†è¿™éƒ½ä¸æ˜¯å¾ˆå¥½çš„åšæ³•。 一ç§å®žç”¨å’Œä¼˜é›…çš„æ¥è§£å†³è¿™äº›é—®é¢˜ï¼Œæ˜¯ä½¿ç”¨å®¹å™¨çš„ä¾èµ–æ³¨å…¥ï¼Œåƒæˆ‘们在å‰é¢çœ‹åˆ°çš„,容器作为全局注册表,使用容器的ä¾èµ–注入åšä¸ºä¸€ç§æ¡¥æ¢æ¥è§£å†³ä¾èµ–å¯ä»¥ä½¿æˆ‘们的代ç 耦åˆåº¦æ›´ä½Žï¼Œå¾ˆå¥½çš„é™ä½Žäº†ç»„ä»¶çš„å¤æ‚性: .. code-block:: php <?php class SomeComponent { protected $_di; public function __construct($di) { $this->_di = $di; } public function someDbTask() { // Get the connection service // Always returns a new connection $connection = $this->_di->get('db'); } public function someOtherDbTask() { // Get a shared connection service, // this will return the same connection everytime $connection = $this->_di->getShared('db'); //This method also requires a input filtering service $filter = $this->_db->get('filter'); } } $di = new Phalcon\DI(); //Register a "db" service in the container $di->set('db', function(){ return new Connection(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo" )); }); //Register a "filter" service in the container $di->set('filter', function(){ return new Filter(); }); //Register a "session" service in the container $di->set('session', function(){ return new Session(); }); //Pass the service container as unique parameter $some = new SomeComponent($di); $some->someTask(); çŽ°åœ¨ï¼Œè¯¥ç»„ä»¶åªæœ‰è®¿é—®æŸç§service的时候æ‰éœ€è¦å®ƒï¼Œå¦‚果它ä¸éœ€è¦ï¼Œå®ƒç”šè‡³ä¸åˆå§‹åŒ–,以节约资æºã€‚该组件是高度解耦。他们的行为,或者说他们的任何其他方é¢éƒ½ä¸ä¼šå½±å“到组件本身。 我们的实现办法 ---------------------- Phalcon\\DI 是一个实现了æœåŠ¡çš„ä¾èµ–注入功能的组件,它本身也是一个容器。 由于Phalcon高度解耦,Phalcon\\DI 是框架用æ¥é›†æˆå…¶ä»–组件的必ä¸å¯å°‘的部分,开å‘人员也å¯ä»¥ä½¿ç”¨è¿™ä¸ªç»„ä»¶ä¾èµ–注入和管ç†åº”用程åºä¸ä¸åŒç±»æ–‡ä»¶çš„实例。 基本上,这个组件实现了 `Inversion of Control`_ 模å¼ã€‚基于æ¤ï¼Œå¯¹è±¡ä¸å†ä»¥æž„é€ å‡½æ•°æŽ¥æ”¶å‚æ•°æˆ–者使用setterçš„æ–¹å¼æ¥å®žçŽ°æ³¨å…¥ï¼Œè€Œæ˜¯ç›´æŽ¥è¯·æ±‚æœåŠ¡çš„ä¾èµ–注入。这就大大é™ä½Žäº†æ•´ä½“程åºçš„夿‚æ€§ï¼Œå› ä¸ºåªæœ‰ä¸€ä¸ªæ–¹æ³•用以获得所需è¦çš„一个组件的ä¾èµ–关系。 æ¤å¤–ï¼Œè¿™ç§æ¨¡å¼å¢žå¼ºäº†ä»£ç çš„å¯æµ‹è¯•性,从而使它ä¸å®¹æ˜“出错。 åœ¨å®¹å™¨ä¸æ³¨å†ŒæœåŠ¡ ------------------------------------- 框架本身或开å‘人员都å¯ä»¥æ³¨å†ŒæœåŠ¡ã€‚å½“ä¸€ä¸ªç»„ä»¶Aè¦æ±‚调用组件B(或它的类的一个实例),å¯ä»¥ä»Žå®¹å™¨ä¸è¯·æ±‚调用组件Bï¼Œè€Œä¸æ˜¯åˆ›å»ºç»„ä»¶B的一个实例。 è¿™ç§å·¥ä½œæ–¹å¼ä¸ºæˆ‘们æä¾›äº†è®¸å¤šä¼˜ç‚¹ï¼š * 我们å¯ä»¥æ›´æ¢ä¸€ä¸ªç»„件,从他们本身或者第三方轻æ¾åˆ›å»ºã€‚ * 在组件å‘布之å‰ï¼Œæˆ‘们å¯ä»¥å……分的控制对象的åˆå§‹åŒ–,并对对象进行å„ç§è®¾ç½®ã€‚ * 我们å¯ä»¥ä½¿ç”¨ç»Ÿä¸€çš„æ–¹å¼ä»Žç»„件得到一个结构化的全局实例 æœåŠ¡å¯ä»¥é€šè¿‡ä»¥ä¸‹å‡ ç§æ–¹å¼æ³¨å…¥åˆ°å®¹å™¨ï¼š .. code-block:: php <?php //Create the Dependency Injector Container $di = new Phalcon\DI(); //By its class name $di->set("request", 'Phalcon\Http\Request'); //Using an anonymous function, the instance will lazy loaded $di->set("request", function(){ return new Phalcon\Http\Request(); }); //Registering directly an instance $di->set("request", new Phalcon\Http\Request()); //Using an array definition $di->set("request", array( "className" => 'Phalcon\Http\Request' )); 在上é¢çš„例åä¸ï¼Œå½“呿¡†æž¶è¯·æ±‚è®¿é—®ä¸€ä¸ªè¯·æ±‚æ•°æ®æ—¶ï¼Œå®ƒå°†é¦–å…ˆç¡®å®šå®¹å™¨ä¸æ˜¯å¦å˜åœ¨è¿™ä¸ª"reqeust"åç§°çš„æœåŠ¡ã€‚ 容器会å回一个请求数æ®çš„实例,开å‘人员最终得到他们想è¦çš„组件。 在上é¢ç¤ºä¾‹ä¸çš„æ¯ä¸€ç§æ–¹æ³•都有优缺点,具体使用哪一ç§ï¼Œç”±å¼€å‘过程ä¸çš„特定场景æ¥å†³å®šçš„。 用一个å—符串æ¥è®¾å®šä¸€ä¸ªæœåŠ¡éžå¸¸ç®€å•ï¼Œä½†ç¼ºå°‘çµæ´»æ€§ã€‚设置æœåŠ¡æ—¶ï¼Œä½¿ç”¨æ•°ç»„åˆ™æä¾›äº†æ›´å¤šçš„çµæ´»æ€§ï¼Œè€Œä¸”å¯ä»¥ä½¿ç”¨è¾ƒå¤æ‚的代ç 。lambda函数是两者之间一个很好的平衡,但也å¯èƒ½å¯¼è‡´æ›´å¤šçš„ç»´æŠ¤ç®¡ç†æˆæœ¬ã€‚ Phalcon\\DI æä¾›æœåŠ¡çš„å»¶è¿ŸåŠ è½½ã€‚é™¤éžå¼€å‘人员在注入æœåŠ¡çš„æ—¶å€™ç›´æŽ¥å®žä¾‹åŒ–ä¸€ä¸ªå¯¹è±¡ï¼Œç„¶åŽå˜å˜å‚¨åˆ°å®¹å™¨ä¸ã€‚在容器ä¸ï¼Œé€šè¿‡æ•°ç»„,å—ç¬¦ä¸²ç‰æ–¹å¼å˜å‚¨çš„æœåŠ¡éƒ½å°†è¢«å»¶è¿ŸåŠ è½½ï¼Œå³åªæœ‰åœ¨è¯·æ±‚对象的时候æ‰è¢«åˆå§‹åŒ–。 .. code-block:: php <?php //Register a service "db" with a class name and its parameters $di->set("db", array( "className" => "Phalcon\Db\Adapter\Pdo\Mysql", "parameters" => array( "parameter" => array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "blog" ) ) )); //Using an anonymous function $di->set("db", function(){ return new Phalcon\Db\Adapter\Pdo\Mysql(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "blog" )); }); ä»¥ä¸Šè¿™ä¸¤ç§æœåŠ¡çš„æ³¨å†Œæ–¹å¼äº§ç”Ÿç›¸åŒçš„结果。然åŽï¼Œé€šè¿‡æ•°ç»„定义的,在åŽé¢éœ€è¦çš„æ—¶å€™ï¼Œä½ å¯ä»¥ä¿®æ”¹æœåС傿•°ï¼š .. code-block:: php <?php $di->setParameter("db", 0, array( "host" => "localhost", "username" => "root", "password" => "secret" )); 从容器ä¸èŽ·å¾—æœåŠ¡çš„æœ€ç®€å•æ–¹å¼å°±æ˜¯ä½¿ç”¨"get"方法,它将从容器ä¸è¿”回一个新的实例: .. code-block:: php <?php $request = $di->get("request"); 或者通过下é¢è¿™ç§é”术方法的形å¼è°ƒç”¨ï¼š .. code-block:: php <?php $request = $di->getRequest(); Phalcon\\DI åŒæ—¶å…许æœåŠ¡é‡ç”¨ï¼Œä¸ºäº†å¾—到一个已ç»å®žä¾‹åŒ–过的æœåŠ¡ï¼Œå¯ä»¥ä½¿ç”¨ getShared() æ–¹æ³•çš„å½¢å¼æ¥èŽ·å¾—æœåŠ¡ã€‚ 具体的 Phalcon\\Http\\Request 请求示例: .. code-block:: php <?php $request = $di->getShared("request"); 傿•°è¿˜å¯ä»¥åœ¨è¯·æ±‚çš„æ—¶å€™é€šè¿‡å°†ä¸€ä¸ªæ•°ç»„å‚æ•°ä¼ é€’ç»™æž„é€ å‡½æ•°çš„æ–¹å¼ï¼š .. code-block:: php <?php $component = $di->get("MyComponent", array("some-parameter", "other")) Factory Default DI ------------------ 虽然Phalcon在解耦方é¢ä¸ºæˆ‘们æä¾›äº†å¾ˆå¤§çš„è‡ªç”±åº¦å’Œçµæ´»æ€§ï¼Œä¹Ÿè®¸æˆ‘ä»¬åªæ˜¯å•纯的把它当作一个full-stack的框架æ¥ä½¿ç”¨ã€‚ä¸ºäº†å®žçŽ°è¿™ä¸€ç›®æ ‡ï¼Œè¯¥æ¡†æž¶æä¾›äº† Phalcon\\DI 的一个å˜ç§ Phalcon\\DI\\FactoryDefault 。这个类会自动注册相应的æœåŠ¡ï¼Œä½¿å„ç§æœåŠ¡ç»„ä»¶ç»‘å®šåˆ°æ¡†æž¶ã€‚ .. code-block:: php <?php $di = new Phalcon\DI\FactoryDefault(); æœåС命å约定 ------------------------ è™½ç„¶ä½ å¯ä»¥ä»»æ„æ³¨å…¥ä½ æƒ³è¦çš„æœåŠ¡(åç§°)到容器ä¸ï¼Œä½†Phalcon有一系列的命å约定,使用它们以能得到适当的æœåŠ¡ã€‚ +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | Service Name | Description | Default | Shared | +=====================+=============================================+====================================================================================================+========+ | dispatcher | Controllers Dispatching Service | :doc:`Phalcon\\Mvc\\Dispatcher <../api/Phalcon_Mvc_Dispatcher>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | router | Routing Service | :doc:`Phalcon\\Mvc\\Router <../api/Phalcon_Mvc_Router>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | url | URL Generator Service | :doc:`Phalcon\\Mvc\\Url <../api/Phalcon_Mvc_Url>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | request | HTTP Request Environment Service | :doc:`Phalcon\\Http\\Request <../api/Phalcon_Http_Request>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | response | HTTP Response Environment Service | :doc:`Phalcon\\Http\\Response <../api/Phalcon_Http_Response>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | filter | Input Filtering Service | :doc:`Phalcon\\Filter <../api/Phalcon_Filter>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | flash | Flash Messaging Service | :doc:`Phalcon\\Flash\\Direct <../api/Phalcon_Flash_Direct>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | session | Session Service | :doc:`Phalcon\\Session\\Adapter\\Files <../api/Phalcon_Session_Adapter_Files>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | eventsManager | Events Management Service | :doc:`Phalcon\\Events\\Manager <../api/Phalcon_Events_Manager>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | db | Low-Level Database Connection Service | :doc:`Phalcon\\Db <../api/Phalcon_Db>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | modelsManager | Models Management Service | :doc:`Phalcon\\Mvc\\Model\\Manager <../api/Phalcon_Mvc_Model_Manager>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | modelsMetadata | Models Meta-Data Service | :doc:`Phalcon\\Mvc\\Model\\MetaData\\Memory <../api/Phalcon_Mvc_Model_MetaData_Memory>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | transactionManager | Models Transaction Manager Service | :doc:`Phalcon\\Mvc\\Model\\Transaction\\Manager <../api/Phalcon_Mvc_Model_Transaction_Manager>` | Yes | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | modelsCache | Cache backend for models cache | None | - | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ | viewsCache | Cache backend for views fragments | None | - | +---------------------+---------------------------------------------+----------------------------------------------------------------------------------------------------+--------+ Instantiating classes via the Services Container ------------------------------------------------ å½“ä½ å‘æœåŠ¡å®¹å™¨è¯·æ±‚æœåŠ¡çš„æ—¶å€™ï¼Œå¦‚æžœåœ¨å®¹å™¨ä¸æ‰¾ä¸åˆ°è¿™ä¸ªæœåŠ¡ï¼Œå®ƒä¼šå°è¯•åŠ è½½å…·æœ‰ç›¸åŒå称的一个类,通过这ç§è¡Œä¸ºï¼Œæˆ‘们å¯ä»¥ä½¿ç”¨æ³¨å†Œä¸ºä¸€ä¸ªæœåŠ¡çš„å½¢å¼æ¥èŽ·å–一个类的实例: .. code-block:: php <?php //Register a controller as a service $di->set('IndexController', function() { $component = new Component(); return $component; }); //Register a controller as a service $di->set('MyOtherComponent', function() { //Actually returns another component $component = new AnotherComponent(); return $component; }); //Create a instance via the services container $myComponent = $di->get('MyOtherComponent'); ä½ å¯ä»¥åˆ©ç”¨è¿™ä¸ªç‰¹ç‚¹ï¼Œæ€»æ˜¯é€šè¿‡å‘æœåС容噍(å³ä½¿å®ƒä»¬æ²¡æœ‰è¢«æ³¨å†Œä¸ºæœåŠ¡)请求æœåŠ¡æ¥èŽ·å¾—ç±»çš„å®žä¾‹ï¼ŒDI会通过 autoloader åŠ è½½çš„ç±»è¿”å›žä¸€ä¸ªç±»çš„å®žä¾‹ã€‚ Accessing the DI in a static way -------------------------------- å¦‚æžœä½ éœ€è¦ï¼Œä½ 还å¯ä»¥é€šè¿‡ä»¥ä¸‹çš„æ–¹å¼ä½¿ç”¨DIæ¥åˆ›å»ºä¸€ä¸ªé™æ€å‡½æ•° .. code-block:: php <?php class SomeComponent { public static function someMethod() { $session = Phalcon\DI::getDefault()->getShared('session'); } } .. _`Inversion of Control`: http://en.wikipedia.org/wiki/Inversion_of_control