DIY 实现 ThinkPHP 核心框架 (十二)Facade 类

ThinkPHP 的 Facade 类为容器中的类提供了一个静态调用接口,可以不用实例化对象而直接通过类实现对方法的调用。在不使用 Facade 类读取配置如下

$config = Container::get('config');
$config->set('num', 5);
return $config->get('num');

使用 Facade 显得更为简洁,如下

Config::set('num', 5);
return Config::get('num');

创建 core/src/think/Config.php

namespace think;

class Config
{
    protected $config = [];

    public function get($name)
    {
        return isset($this->config[$name]) ? $this->config[$name] : null;
    }

    public function set($name, $value = null)
    {
        $this->config[$name] = $value;
    }
}

创建 core/src/think/Facade.php 文件用于静态调用

class Facade
{
    public static function __callStatic($method, $params)
    {
        return call_user_func_array([static::createFacade(), $method], $params);
    }

    protected static function createFacade(string $class = '', array $args = [], bool $newInstance = false)
    {
        $class = $class ?: static::class;

        // 子类返回 config 将被 App 类实例化
        $facadeClass = static::getFacadeClass();

        if ($facadeClass) {
            $class = $facadeClass;
        }

        return Container::getInstance()->make($class, $args, $newInstance);
    }

    protected static function getFacadeClass()
    {}
}

创建 core/src/think/facade/Config.php 文件

<?php
namespace think\facade;

use think\Facade;

class config extends Facade
{
    protected static function getFacadeClasss()
    {
        return 'config';
    }
}

Index.phpindex() 方法中修改代码如下

use think\Config;

public function index()
    {
           Config::set('num', 5);
           return Config::get('num');
    }

访问 diy.tp 成功打印

5
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!