最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • pimple 学习

    正文概述 转载于:掘金(firaga)   2021-01-19   330

    pimple是一个实现了ArrayAccess接口的容器,实现ArrayAccess接口的容器可以通过访问数组的方式访问对象

    前置知识

    ArrayAccess容器

    Interface to provide accessing objects as arrays.

    官方文档

    接口定义:

    ArrayAccess {
    /* Methods */
    abstract public offsetExists (mixed $offset ): bool
    abstract public offsetGet (mixed $offset ): mixed
    abstract public offsetSet (mixed $offset , mixed $value ): void
    abstract public offsetUnset (mixed $offset ): void
    }
    

    实现例子:

    <?php
    class Obj implements ArrayAccess {
        private $container = array();
    
        public function __construct() {
            $this->container = array(
                "one"   => 1,
                "two"   => 2,
                "three" => 3,
            );
        }
    
        public function offsetSet($offset, $value) {
            if (is_null($offset)) {
                $this->container[] = $value;
            } else {
                $this->container[$offset] = $value;
            }
        }
    
        public function offsetExists($offset) {
            return isset($this->container[$offset]);
        }
    
        public function offsetUnset($offset) {
            unset($this->container[$offset]);
        }
    
        public function offsetGet($offset) {
            return isset($this->container[$offset]) ? $this->container[$offset] : null;
        }
    }
    
    $obj = new Obj;
    
    var_dump(isset($obj["two"]));
    var_dump($obj["two"]);
    unset($obj["two"]);
    var_dump(isset($obj["two"]));
    $obj["two"] = "A value";
    var_dump($obj["two"]);
    $obj[] = 'Append 1';
    $obj[] = 'Append 2';
    $obj[] = 'Append 3';
    print_r($obj);
    ?>
    

    魔术方法__invoke

    实现_invoke方法的对象可以像访问函数一样使用

    class ShowProfile2
    {
        public function __invoke($c)
        {
            echo "ShowProfile2" . chr(10);
    //        return $c;
            return new stdClass();
        }
    }
    $a = new ShowProfile2();
    var_dump($a(3));
    

    SplObjectStorage

    Standed php Library 对象存储,实现以下接口Countable, Iterator, Serializable, ArrayAccess.

    自身主要实现了对象唯一性存储

    官方解释

    The SplObjectStorage class provides a map from objects to data or, by ignoring data, an object set. This dual purpose can be useful in many cases involving the need to uniquely identify objects.
    
    

    官方文档

    官方实例:

    <?php
    // As an object set
    $s = new SplObjectStorage();
    
    $o1 = new StdClass;
    $o2 = new StdClass;
    $o3 = new StdClass;
    
    $s->attach($o1);
    $s->attach($o2);
    
    var_dump($s->contains($o1));
    var_dump($s->contains($o2));
    var_dump($s->contains($o3));
    
    $s->detach($o2);
    
    var_dump($s->contains($o1));
    var_dump($s->contains($o2));
    var_dump($s->contains($o3));
    ?>
    

    PHP 之 SplObjectStorage对象存储

    pimple使用

    silexphp/pimple

    使用方法参看官方README.

    容器代码实现很少,阅读很容易

    属性

        private $values = []; //id=>value键值对
        private $factories; // 对象工厂
        private $protected; // 受保护对象,这里的对象不会执行,可以返回作为参数使用
        private $frozen = [];  //防止对象取出后被重新定义
        private $raw = []; //原始格式的对象,对象被取出执行后这里保存原始定制
        private $keys = []; // 保存键值
    

    方法

    前置类

    header.php

    <?php
    require_once "vendor/autoload.php";
    
    use Pimple\Container;
    
    /**
     * @property string str
     */
    class SessionStorage
    {
        private string $msg = 'SessionStorageClass';
    
        public function __construct(string $str)
        {
            $this->str = $str;
        }
    }
    
    /**
     * @property SessionStorage st
     */
    class Session
    {
        private string $msg = 'SessionClass';
        private int $rand;
    
        public function __construct(SessionStorage $st, int $rand = null)
        {
            $this->st = $st;
            if ($rand != null)
                $this->rand = $rand;
        }
    }
    

    offsetSet offsetGet offsetExists offsetUnset

    ArrayAccess接口实现

    赋值时调用offsetSet方法,取值时调用offsetGet方法

    <?php
    require_once "header.php";
    
    use Pimple\Container;
    
    $container = new Container();
    
    // define some parameters
    $container['cookie_name'] = 'SESSION_ID';
    $container['session_storage_class'] = 'SessionStorage';
    //var_dump($container['cookie_name'],$container['session_storage_class']);
    //exit;xx
    
    $container['session_storage'] = function ($c) {
        //$c 为null或者offsetGet传值后为container
        return new $c['session_storage_class']($c['cookie_name']);
    };
    
    var_dump($container['session_storage']);
    //$container['session_storage'] = function ($c) {
    //
    //};
    //var_dump($container['session_storage']);
    exit;
    

    factory

    保存到factories变量,offsetGet存在时执行并返回,和普通的offsetGet返回区别是少了raw的保存,且没有frozen赋值为true,每次get重新执行对象

    <?php
    
    require_once "header.php";
    
    use \Pimple\Container;
    
    $container = new Container();
    // define some parameters
    $container['cookie_name'] = 'SESSION_ID';
    $container['session_storage_class'] = 'SessionStorage';
    //var_dump($container['cookie_name'],$container['session_storage_class']);
    //exit;
    
    $container['session_storage'] = function ($c) {
        //$c 为null或者offsetGet传值后为container
        return new $c['session_storage_class']($c['cookie_name']);
    };
    //var_dump($container['session_storage']);
    //exit;
    
    $container['session'] = $container->factory(function ($c) {
        return new Session($c['session_storage'], rand(0, 10000));
    });
    
    var_dump($container['session']);
    var_dump($container['session']);
    
    $container['session2'] = function ($c) {
        return new Session($c['session_storage'], rand(0, 1000));
    };
    var_dump($container['session2']);
    var_dump($container['session2']);
    

    protect

    保存到protected变量,offsetGet时直接返回不执行,可作为变量

    <?php
    require_once "header.php";
    
    use \Pimple\Container;
    
    $container = new Container();
    $container['random_func'] = $container->protect(function () {
    return rand();
    });
    var_dump($container['random_func']);
    
    $container['random_func2'] = function () {
    return rand();
    };
    var_dump($container['random_func2']);
    

    raw

    <?php
    require_once "header.php";
    
    use \Pimple\Container;
    
    $container = new Container();
    $container['session'] = function ($c) {
        return new Session($c['session_storage']);
    };
    
    $sessionFunction = $container->raw('session');
    var_dump($sessionFunction);
    

    extend

    <?php
    require_once "header.php";
    
    use Pimple\Container;
    
    $container = new Container();
    
    // define some parameters
    $container['cookie_name'] = 'SESSION_ID';
    $container['session_storage_class'] = 'SessionStorage';
    //var_dump($container['cookie_name'],$container['session_storage_class']);
    //exit;
    
    $container['session_storage'] = function ($c) {
        //$c 为null或者offsetGet传值后为container
        return new $c['session_storage_class']($c['cookie_name']);
    };
    $storage = "hello";
    $container->extend('session_storage', function ($storage, $c) {
        echo "hello".chr(10);
        return $storage;
    });
    var_dump($container['session_storage']);
    

    keys

    没啥可说的

    register

    <?php
    require_once "header.php";
    
    use Pimple\Container;
    
    class FooProvider implements Pimple\ServiceProviderInterface
    {
        public function register(Container $pimple)
        {
            echo "register func" . chr(10);
            // register some services and parameters
            // on $pimple
        }
    }
    
    class ShowProfile
    {
        public function __invoke($id)
        {
            return "I'm showProfile " . $id;
        }
    }
    
    class ShowProfile2
    {
        public function __invoke($c)
        {
            echo "ShowProfile2" . chr(10);
    //        return $c;
            return new stdClass();
        }
    }
    
    $a = new ShowProfile2();
    var_dump($a(3));
    
    //test register and raw
    $pimple = new Container();
    $pimple->register(new FooProvider(), ['a' => new ShowProfile2()]);
    
    $newA = $pimple->offsetGet('a');
    var_dump($newA);
    var_dump($pimple->raw('a'));
    

    pimple源码解析

    pimple 源码很少,上面已经串着说完了...

    代码来源

    初始代码来自以下来源,经过自己加工理解

    1. php官方文档(文中有)
    2. pimple README

    起源地下载网 » pimple 学习

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元