Pimple研究及PHP架構搭建

來源:互聯網
上載者:User

標籤: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架構搭建

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.