此文参考利用 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接口
\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。
|
请发表评论