Pimple研究及PHP框架搭建


此文參考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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM