Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用Container类实现ThinkPHP核心框架_创想鸟

使用Container类实现ThinkPHP核心框架

使用Container类实现ThinkPHP核心框架

相关推荐:thinkphp

thinkphpcontainer 类提供了静态方法 get() ,可以根据类名或类的别名获取实例,会保持创建完成的实例,避免重复创建。下面实现这个方法,修改 container.php ,添加以下代码。

//     * ThinkPHP 5 与 6 在此处参数一致//     * @param string $abstract//     * @param array $vars//     * @param bool $newInstance//     */    public static function get(string $abstract, array $vars = [], bool $newInstance = false)    {        return static::getInstance()->make($abstract, $vars, $newInstance);    }

编写 getInstance() 方法,并新增静态属性 $instance 保存自身实例。

protected static $instance;public static function getInstance()    {        // 创建自身实例        if (is_null(static::$instance)) {            static::$instance = new static;        }        return static::$instance;    }

编写 make() 方法。

public function make (string $abstract, array $vars = [], bool $newInstance = false)    {        // 这里的 $abstract 是包含有命名空间的类名        if (isset($this->bind[$abstract])) {            $abstract = $this->bind[$abstract];        }        // 如果已经实例化直接返回        if (isset($this->instances[$abstract]) && !$newInstance) {            return $this->instances[$abstract];        }        // 如果就创建        $object = $this->invokeClass($abstract, $vars);        // 保存实例        if (!$newInstance) {        $this->instances[$abstract] = $object;        }        return $object;    }

创建保存属性的别名数组 $bind

    protected $bind = [        'app' => App::class,        'config' => Config::class,        'request' => Request::class    ];

编写 invokeClass() 方法

立即学习“PHP免费学习笔记(深入)”;

public function invokeClass (string $class, array $vars = [])    {        // $vars 为构造函数的参数        return new $class();    }

修改入口文件 index.php

require __DIR__ . '/../core/base.php';use thinkRequest;$req = thinkContainer::get('request');var_dump($req instanceof Request);

输出 bool(true) 表示 get() 方法功能正常。

也可以利用魔术方法 __get()__set() ,实现外部对象直接操作容器实例。

    public function __get($abstract)    {        // 返回容器的类实例        return $this->make($abstract);    }public function __set($abstract, $instance)    {        if (isset($this->bind[$abstract])) {            $abstract = $this->bind[$abstract];        }        // 装入容器        $this->instances[$abstract] = $instance;    }

index.php 进行测试

$container = thinkContainer::getInstance();// 获取容器中的实例,输出对象var_dump($container->request);// 装入容器$container->contianerName = $container;var_dump($container->contianerName);

输出 object(thinkRequest) 表示成功

想了解更多编程学习,敬请关注php培训栏目!

以上就是使用Container类实现ThinkPHP核心框架的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/84370.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
怎么管理好客户销售业务
上一篇 2025年11月16日 22:45:43
四川客户管理平台怎么做
下一篇 2025年11月16日 22:45:50

相关推荐

发表回复

登录后才能评论
关注微信