DI php寫乙個輕量級的容器

2021-07-31 22:40:39 字數 2639 閱讀 1930

摘要: 理解什麼是di/ioc,依賴注入/控制反轉。兩者說的是乙個東西,是當下流行的一種設計模式。大致的意思就是,準備乙個盒子(容器),事先將專案中可能用到的類扔進去,在專案中直接從容器中拿,也就是避免了直接在專案中到處new,造成大量耦合。取而代之的是在專案類裡面增設 setdi()和getdi()方法,通過di同一管理類。 當然,以上內容並不是重點,詳細的概念推薦參考這篇文章: 中文版:

直接上**吧.

di容器類:

class di implements \arrayaccess

//檢測有沒有註冊該服務

if(!isset($this->_bindings[$name]))

$concrete = $this->_bindings[$name]['class'];//物件具體註冊內容

$obj = null;

//匿名函式方式

if($concrete instanceof \closure)elseif(is_string($concrete))else

}//如果是共享服務,則寫入_instances列表,下次直接取回

if($this->_bindings[$name]['shared'] == true && $obj)

return $obj;

}//檢測是否已經繫結

public function has($name)

//解除安裝服務

public function remove($name)

//設定服務

public function set($name,$class)

//設定共享服務

public function setshared($name,$class)

//註冊服務

private function _registerservice($name,$class,$shared=false)else

}//arrayaccess介面,檢測服務是否存在

public function offsetexists($offset)

//arrayaccess介面,以$di[$name]方式獲取服務

public function offsetget($offset)

//arrayaccess介面,以$di[$name]=$value方式註冊服務,非共享

public function offsetset($offset, $value)

//arrayaccess介面,以unset($di[$name])方式解除安裝服務

public function offsetunset($offset)

}

演示:

<?php

header("content-type:text/html;charset=utf8");

class a

}include "di.class.php";

$di = new di();

//匿名函式方式註冊乙個名為a1的服務

$di->setshared('a1',function($name=""));

//直接以類名方式註冊

$di->set('a2','a');

//直接傳入例項化的物件

$di->set('a3',new a("小唐"));

$a1 = $di->get('a1',array("小李"));

echo $a1->name."

";//小李

$a1_1 = $di->get('a1',array("小王"));

echo $a1->name."

";//小李

echo $a1_1->name."

";//小李

$a2 = $di->get('a2',array("小張"));

echo $a2->name."

";//小張

$a2_1 = $di->get('a2',array("小徐"));

echo $a2->name."

";//小張

echo $a2_1->name."

";//小徐

$a3 = $di['a3'];//可以直接通過陣列方式獲取服務物件

echo $a3->name."

";//小唐

通過set和setshared方式註冊服務,支援 匿名函式,類名字串,已經例項化的物件.

兩者的區別是:

set方式註冊的,每次獲取的時候都會重新例項化

setshared方式的,則只例項化一次,也就是所謂的單例模式

當然,對於直接註冊已經例項化的物件,如上**中的a3服務,set和setshared效果是一樣的。

通過$di->get()獲取服務,可接受兩個引數,第乙個引數是服務名,比如a1,a2,a3是必須的,第二個引數是乙個陣列,第二個引數會被當作匿名函式中的引數或者類建構函式裡的引數傳進去,參考call_user_func_array()。

刪除服務則可以通過

unset($di['a1']);

or$di->remove('a1');

判斷是否包含乙個服務可以通過

isset($di['a1']);

or$di->has('a1');

就這麼多了。

peewee 乙個輕量級的ORM 四

class database last insert id cursor,model parameters return type 最後乙個插入的記錄的那行的主鍵,不一定非得叫 id rows affected cursor return type 受影響的行數 create table model...

乙個輕量級AOP的實現(開源)

事先宣告,本專案參考aop in c 和園內大神張逸的文章,思路神馬的都不是自己的!為了讓專案的 看起來更乾淨,需要乙個aop!於是就實現了乙個非常簡單的,非常輕量級,有多輕量級呢?實現的aop叫做earthworm 蚯蚓,為什麼叫這個?因為它小,它會疏通!專案的本意也是這樣,所以就叫這個!命名空間...

乙個輕量級的後台管理系統

單模組應用 開源 適合小型軟體後台 功能描述 1.使用者管理 使用者是系統操作者,該功能主要完成系統使用者配置。2.部門管理 配置系統組織機構 公司 部門 小組 樹結構展現支援資料許可權。3.崗位管理 配置系統使用者所屬擔任職務。4.選單管理 配置系統選單,操作許可權,按鈕許可權標識等。5.角色管理...