DIY 實現 ThinkPHP 核心框架 (十二)Facade 類

cn-five發表於2020-09-07

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 協議》,轉載必須註明作者和本文連結

相關文章