標籤:imp dem 驗證 color ace href service div pre
此文參考PHP容器--Pimple運行流程淺析 和 利用 Composer 一步一步構建自己的 PHP 架構,如有不清楚的,請參考原文。
Pimple貌似在PHP社區裡非常流行,聽聞是個非常輕量化並且好用的iOC容器。以想著在項目中運用的目的,今天來研究一番。
先來搭建個簡單的php環境吧,參照著上面提到的用Composer搭建,路由使用macaw,建立了一個BaseController、IndexController、User、UserServiceProvider。其中BaseController繼承了Container容器,在參考的原文裡是在App類中的。下面一個個來講一下。<?phpnamespace App\Controllers;
/** * Created by PhpStorm. * User: hackcat * Date: 2017/7/1 * Time: 下午2:11 */class BaseController extends \Pimple\Container{
//服務提供中,所有提供者都在這裡填寫,demo中只涉及到了UserService,當然還有Route啥的。 protected $providers = [ UserServiceProvider::class ]; public function __construct() { parent::__construct();
//建構函式中調用註冊提供者方法。 $this->registerProviders(); } public function addProvider($provider){ array_push($this->providers,$provider); return $this; } public function setProviders($providers){ $this->providers = []; foreach ($providers as $provider){ $this->addProvider($provider); } } public function getProviders(){ return $this->providers; } public function __get($id) { return $this->offsetGet($id); } public function __set($id, $value) { $this->offsetSet($id,$value); }
//迴圈迭代之前的服務提供者,在Container的register方法中註冊提供者執行個體,注意,這裡只是提供者執行個體,而不是User。 private function registerProviders(){
foreach ($this->providers as $provider){ $this->register(new $provider()); } }}
<?php
/**
* User服務提供者,需要實現\Pimple\ServiceProviderInterface介面
* Created by PhpStorm. * User: hackcat * Date: 2017/7/1 * Time: 下午2:27 */
class UserServiceProvider implements \Pimple\ServiceProviderInterface {
//這邊實現register方法 public function register(\Pimple\Container $pimple) {
//注意,此處是返回一個匿名函數,而不是返回User的執行個體,所以不等於 $pimple[‘user‘] = new User();這個等會我們會在測試程式中得到驗證。實現一個按需載入,消極式載入的作用。 $pimple[‘user‘] = function($pimple){ return new User(); }; }}
<?php/**
* User類,主要是幾個測試方法和建構函式,用於等下做測試的。 * Created by PhpStorm. * User: hackcat * Date: 2017/7/1 * Time: 下午2:26 */class User{ public $name; public function __construct() { echo ‘new User‘; } public function sayHello(){ echo ‘Hello my name is ‘.$this->name; }}
<?php/**
* 測試類別。 * Created by PhpStorm. * User: hackcat * Date: 2017/7/1 * Time: 下午1:55 */class IndexController extends BaseController{ public function index(){
$user = $this->user; $user->name = ‘hackcat‘; $user->sayHello(); $user1 = $this->user; echo $user1 === $user; }}
1. 測試1:
class IndexController extends BaseController{ public function index(){ }}
介面上不顯示任何文字,表示User類沒有被執行個體化。
2. 測試2
public function index(){ $user = $this->user; $user->name = ‘hackcat‘; $user->sayHello(); }顯示new UserHello my name is hackcat。表示已建立User對象,並且容器證明OK。
3. 測試3
public function index(){ $user = $this->user; $user->name = ‘hackcat‘; $user->sayHello(); $user1 = $this->user; echo $user1->name; }再建立一個user1,沒有在此new User,並且名字也是hackcat,說明$user === $user1,是同一個對象,單例模式OK。
Pimple研究及PHP架構搭建