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。
时间: 2024-11-01 07:29:54

Pimple研究及PHP框架搭建的相关文章

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

前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2.*版本的面目全非,不过宽容点来看这个强大的框架,升级到ng2肯定是一件好事情,虽然截至目前ng2还存在或多或少需要完善的地方,但是ng2做到了留下并强化ng1好的部分,移除或改善其不好的部分,并且基于许多较新Web技术来开发,不去看从ng1迁移到ng2的门槛和工作量的话,ng2的编程体验是很酷炫的. 目前n

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

前端开发一年了,向大家交流下自己实践总结下来的一点点开发心得.人生难免磕磕碰碰,前进的道路很多,在学习工作上我们都得学会如何让自己过的更高效,代码亦是如此. 下面,开始介绍自己总结的前端框架搭建(布局搭建). 1,项目文件结构. 2,index.html页面内容 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <ti

Unity 游戏框架搭建 2018(八)小结

Unity 游戏框架搭建 2018,是笔者在 gitchat 平台发布的 2018 年版本的框架搭建. 在 2018 年的时候 QFramework 已经集成了 UI Kit 和 Res Kit 这两个强大且好用的套件. 可以说 框架搭建 2018 版本是 对 2017 年版本的一个补充,主要补充的内容这是 UI Kit.Res Kit.和一个关于变量命名的讨论. 而在 2018 年,笔者首次发表了对变量命名的一个看法,其实在这一年,笔者从变量的命名研究中收益颇多,远大于 UI Kit 和 Re

Spring MVC 框架搭建及详解

一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.commons-logging.jar.cglib-nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar.hibernate-jpa-2.0-api-1.0.1.Final.jar.antlr-2.7.6.jar.commons-collections-3

spring-websocket框架搭建遇到的问题解决方案汇总

问题1 org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server 严重: Servlet.service() for servlet [SpringMVC] in context with path [/ZHDM] threw exception [Request processing failed; nested exception is org.springfra

[CI] 使用CodeIgniter框架搭建RESTful API服务

在2011年8月的时候,我写了一篇博客<使用CodeIgniter框架搭建RESTful API服务>,介绍了RESTful的设计概念,以及使用CodeIgniter框架实现RESTful API的方法.转眼两年过去了,REST在这两年里有了很大的改进.我对于前一篇博客中的某些方面不是很满意,所以希望能利用这次机会写一个更加完善的版本.我的项目基于Phil Sturgeon的CodeIgniter REST Server,遵循他自己的DBAD协议.Phil的这个项目很棒,干净利落,简单实用,并

今天研究Unity Ioc 框架

今天研究Unity Ioc 框架,被自己坑了两个多小时. 运行就报错,反反复复检查了很多次,配置文件,代码都没有问题,也从新写了好几遍. 最后仔细看报错消息才知道,config文件没有生成到目录----  -_- 各路大神,引以为鉴呀!

ssm框架搭建(上)

前言 之前也说过,工作做的开发都是基于公司现有的框架,心里很没底.所以一直想自己能够搭建出ssm框架.经过多次尝试,终于成功了.这边文章将从两个方面进行,一是框架搭建,二是简单的增删查改. 正文 1.环境搭建 这里采用现在流行的maven方式,而是将需要的jar放在web_inf\lib下面了. 直接贴了一张图,有点任性了...整个工程的结构如下图所示 在conf子包中,是配置文件.mapper下对应mybatis的映射文件,里面包含了相应的sql语句.(mvcLearn\conf\mapper

SSH(Struts2+Spring+Hibernate)框架搭建流程&lt;注解的方式创建Bean&gt;

此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblogs.com/wkrbky/p/5912810.html 一.Hibernate(数据层)的搭建: 实现流程 二.Spring(注入实例)的使用: 实现流程 三.Struts2(MVC)的搭建: 实现流程 这里注意一点问题: Struts2与Hibernate在一起搭建,antlr包,有冲突.MyE