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。
Pimple研究及PHP框架搭建的更多相关文章
- ABP框架搭建项目系列教程基础版完结篇
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...
- 基于mvc结构的前端页面框架搭建
前端开发一年了,向大家交流下自己实践总结下来的一点点开发心得.人生难免磕磕碰碰,前进的道路很多,在学习工作上我们都得学会如何让自己过的更高效,代码亦是如此. 下面,开始介绍自己总结的前端框架搭建(布局 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- (三) Angular2项目框架搭建心得
前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...
- javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之一 基础Struts框架搭建篇
即将开始着手写这个项目,所以希望通过这篇博客来记录自己学习的过程 今天开学第一天,就上了软件工程实践课,自己也开始着手做这个大作业了.首先我的项目名称叫做智能班车管理系统. 项目的概况: 该软件产品是 ...
- Django框架搭建(windows系统)
Django框架搭建(windows系统) 一.Django简介 开放源代码的Web应用框架,由Python语言编写,一个大而全的框架. 1.web框架介绍 具体介绍Django之前,必须先介绍WEB ...
- Unity 游戏框架搭建 (十) QFramework v0.0.2小结
从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...
- Unity 游戏框架搭建 (九) 减少加班利器-QConsole
为毛要实现这个工具? 在我小时候,每当游戏在真机运行时,我们看到的日志是这样的. 没高亮啊,还有乱七八糟的堆栈信息,好干扰日志查看,好影响心情. 还有就是必须始终连着usb线啊,我想要想躺着测试... ...
- go语言实战教程:实战项目资源导入和项目框架搭建
从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...
随机推荐
- 为docker容器设置独立ip
docker 1.12使用新版macvlan设置与宿主机同网段ip ****************************************** 由于开发的一些特殊需求,需要将容器部署在与宿主 ...
- 2016 Multi-University Training Contest 4 solutions BY FZU
1001 Another Meaning 对于这个问题,显然可以进行DP: 令dp[i]表示到i结尾的字符串可以表示的不同含义数,那么考虑两种转移: 末尾不替换含义:dp[i - 1] 末尾替换含义: ...
- Swift--错误集:Class controller has not initializers
bug错误图 解决方法: 如下图所示,visitor这个属性并没有拆包处理,及将UIViewController的子类中的变量全部进行拆包处理,就是在变量声明的时候加一个?号,在使用的时候拆包处理,加 ...
- 网络安全法与LogSec日志安全大数据审计平台
https://blog.csdn.net/chengpeng1144/article/details/73555331 https://blog.csdn.net/dcbeyond/article/ ...
- SQL SERVER 2008破解加密存储过程(修正存储过程过长解密出来是空白的问题)
SQLServer2005里使用with encryption选项创建的存储过程仍然和sqlserver2000里一样,都是使用XOR进行了的加密.和2000不一样的是,在2005的系统表syscom ...
- Match the string--hdu1797(模拟)
http://acm.hdu.edu.cn/showproblem.php?pid=1797 就是模拟 我的思路是标记aba 和h的位置 然后就判断是否正确 就行了 还有就是 最后 fkfkfkf ...
- Android 学习路线图(转载自https://blog.csdn.net/lixuce1234/article/details/77947405)
程序设计 一.java (a)基本语法(如继承.异常.引用.泛型等) Java核心技术 卷I(适合入门) 进阶 Effective Java中文版(如何写好的Java代码) Java解惑 (介绍烂Ja ...
- weblogic负载分发
博客分类: weblogic 负载均衡的实现方式有很多种,这里只介绍三种相对来说成本较低的方案(维护成本以及费用成本)weblogic自带的proxy.apache.nginx 1.weblogic自 ...
- LoadRunner系列之—-02 基于webservice协议的接口测试(脚本实例)
Loadrunner 基于webservice协议的接口压力测试(脚本实例) 接口功能如下:请求接口,报文只有一个参数为证件号码:返回报文中,有证件号码是否能查到对应数据,查到几条数据. 思路:请求w ...
- HDU 1824 Let's go home (2-SAT判定)
Let's go home Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...