美文网首页
手写一个laravel(三)门面实现

手写一个laravel(三)门面实现

作者: mafa1993 | 来源:发表于2020-11-21 21:04 被阅读0次

手写一个laravel(三)门面实现

  1. 在application中调用setFacadeApplication,用于门面的注册绑定
  2. 在Support中添加Facades文件夹,然后创建Facade.php

源码见个人git https://github.com/mafa1993/slaravel

<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/11/14 0014
 * Time: 19:38
 */
//门面类, 将类转换为静态调用
namespace Slaravel\Support\Facades;

class Facade
{
    //用于保存已经实例化过的门面,防止多次实例化
    protected static $resolvedInstance = [];
    protected static $app;

    /**
     * 静态调用找不到的方法时
     * @param $method
     * @param $arguments
     * @return mixed
     */
    public static function __callStatic($method, $arguments)
    {
        //创建实例
        //static 和 self区别: static如果是子调用,static代表子,self永远指向Facade
        $instance = static::getFacadeRoot();

        //var_dump($method);
        return $instance->$method($arguments);

    }

    /**
     * 获取实例
     * @return mixed
     */
    public function getFacadeRoot(){
        //调用getFacadeAccessor获取子类重写的方法返回的要解析的类,进行实例化
        return static::resolveFacadeInstance(static::getFacadeAccessor());
    }

    public static function getFacadeAccessor(){}

    /**
     * 解析实例
     * @param mixed $obj
     * @return object
     */
    public static function resolveFacadeInstance($obj){
        if (is_object($obj)){
            return $obj;
        }

        if(isset(static::$resolvedInstance[$obj])){
            return static::$resolvedInstance[$obj];
        }
        //var_dump($obj);
        //门面也是使用容器的make方法进行解析
        return static::$resolvedInstance[$obj] = static::$app->make($obj);
    }


    /**
     * 注入application类到Facade类中
     * @param $app Slaravel\Foundation\Application
     */
    public static function setFacadeApplication($app){
        static::$app = $app;
    }

}

相关文章

网友评论

      本文标题:手写一个laravel(三)门面实现

      本文链接:https://www.haomeiwen.com/subject/lxoeiktx.html