• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Pimple研究及PHP框架搭建

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

此文参考利用 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。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
java反序列化php序列化的对象发布时间:2022-07-10
下一篇:
php通过数组存取mysql查询语句的返回值发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap