TP5.1类调用机制


tp5.1 类调用机制学习

<?php

namespace app\index\controller;

use think\facade\Debug;
class Index 
{
    public function index()
    {
        var_dump(Debug::dump(11));
    }
}

 

在Debug 类中 就一个方法

/**
 * 获取当前Facade对应类名(或者已经绑定的容器对象标识)
 * @access protected
 * @return string
 */
public static function getFacadeClass()
{
    return 'debug';
}

 

​那么他是怎么做到加载Debug 类的呢

在父级类Facade 中使用了PHP的魔术方法__callStaic

当调用的类名不存在时就会调用该方法

// 调用实际类的方法

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

 

其中call_user_func_array() 中的 static::createFacede 返回值是当前要调用的对象(debug)

$method 是当前访问的 方法(dump)

$params 为当前访问所携带的参数数组(11)

createFacade方法具体如下

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

    $facadeClass = static::getFacadeClass();

    if ($facadeClass) {
        $class = $facadeClass;
    } elseif (isset(self::$bind[$class])) {
        $class = self::$bind[$class];
    }
    if (static::$alwaysNewInstance) {
        $newInstance = true;
    }
    return Container::getInstance()->make($class, $args, $newInstance);
}

 

其中的$facadeClass已经通过 Debug类中的唯一的 方法getFacadeClass 返回  debug

return 通过Containner 容器类初始化(getInstance()) 创建(make)该类的实例

实例化之后 通过 call_user_func_array()传入参数 调用

助手函数也是使用了该调用方式

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM