此文参考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框架搭建的更多相关文章

  1. ABP框架搭建项目系列教程基础版完结篇

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...

  2. 基于mvc结构的前端页面框架搭建

    前端开发一年了,向大家交流下自己实践总结下来的一点点开发心得.人生难免磕磕碰碰,前进的道路很多,在学习工作上我们都得学会如何让自己过的更高效,代码亦是如此. 下面,开始介绍自己总结的前端框架搭建(布局 ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2 ...

  4. (三) Angular2项目框架搭建心得

    前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...

  5. javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之一 基础Struts框架搭建篇

    即将开始着手写这个项目,所以希望通过这篇博客来记录自己学习的过程 今天开学第一天,就上了软件工程实践课,自己也开始着手做这个大作业了.首先我的项目名称叫做智能班车管理系统. 项目的概况: 该软件产品是 ...

  6. Django框架搭建(windows系统)

    Django框架搭建(windows系统) 一.Django简介 开放源代码的Web应用框架,由Python语言编写,一个大而全的框架. 1.web框架介绍 具体介绍Django之前,必须先介绍WEB ...

  7. Unity 游戏框架搭建 (十) QFramework v0.0.2小结

    从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...

  8. Unity 游戏框架搭建 (九) 减少加班利器-QConsole

    为毛要实现这个工具? 在我小时候,每当游戏在真机运行时,我们看到的日志是这样的. 没高亮啊,还有乱七八糟的堆栈信息,好干扰日志查看,好影响心情. 还有就是必须始终连着usb线啊,我想要想躺着测试... ...

  9. go语言实战教程:实战项目资源导入和项目框架搭建

    从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...

随机推荐

  1. 积累js中的一些问题及解决方案

    一.取字符串的第i位不兼容的问题 1.问题:对于字符串str来说,要获取第i位,常见的是str[i],但是在低版本的浏览器中不兼容,例如ie7. 2.解决:使用str.charAt(i); 二.使用定 ...

  2. 【frameset】frameset设置不能拖动

    <frameset rows='20%,*' >           <!--  row 行 col 列    分行列要为rows  cols  --> <frame s ...

  3. 如何改变linux系统的只读文件的权限

    vim 编辑可以在命令模式输入 :wq! 保存退出可以用chmod 命令修改文件权限. chmod命令是非常重要的,用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限.该命令有两种用法.一 ...

  4. 深入理解计算机操作系统——第11章:CS模型,网络

    网络编程: 11.1 客户端-服务器编程模型 (1)一个应用是由一个服务器进程和一个或多个客户端进程组成. (2)服务器管理某种资源,并且操纵这种资源来为客户端服务. CS模型: CS的基本操作是事务 ...

  5. iOS 用cornerstone 创建分支

    第一步:在cornerstone中添加服务器上的代码路径,如下: 第二步:选中服务器路径下的代码,选择“分支”按钮 第三步:开始创建分支 第四步:效果图如下 第五步:选择分支下的路径下载代码并进行修改 ...

  6. 大数c++模板 超级好用

    只用输入用cin 输出  cout  每个数学符号都可以用   超级强大 #include <iostream> #include <queue> #include <c ...

  7. 转:TLV 格式及编解码示例

    TLV是一种可变格式,意思就是: Type类型, Lenght长度,Value值: Type和Length的长度固定,一般那是2.4个字节(这里统一采用4个字节): Value的长度有Length指定 ...

  8. Spring Boot项目错误:Error parsing lifecycle processing instructions

    pom.xml文件错误:Error parsing lifecycle processing instructions 解决方法:清空.m2/repository下的所有依赖文件,重新下载即可解决该问 ...

  9. Visual Studio Visual assistant注释也做拼写检查怎么办

    1 打开Visual Assistant   2 在Advanced中找到Underlines,取消勾选"Underline spelling errors in comments and ...

  10. Android MediaRecorder录音与播放

    上一篇讲到了使用意图录音.这篇文章将使用MediaRecorder类来录音,从而提供很多其它的灵活性. 效果图: 源码奉上: <LinearLayout xmlns:android=" ...