搜索

查看: 3067|回复: 11

[PHP] PHP Laravel门面的实现原理详解

[复制链接]
发表于 2023-5-4 17:03:49 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:03:49 3067 11 看全部
目录
  • 环境
  • 原理
    环境
    Laravel 5.4

    原理
    在Laravel中,门面为应用服务容器中绑定的类提供了一个“静态”接口,使得我们可以不用new这些类出来,就可以直接通过静态接口调用这些类中的方法。
    下面我们先看看一个门面类是怎么定义的:

    门面类都继承自Illuminate\Support\Facades\Facade父类,这个父类中有一个魔术方法:
    /**
         * Handle dynamic, static calls to the object.
         *
         * @param  string  $method
         * @param  array   $args
         * @return mixed
         *
         * @throws \RuntimeException
         */
        public static function __callStatic($method, $args)
        {
            $instance = static::getFacadeRoot();
            if (! $instance) {
                throw new RuntimeException('A facade root has not been set.');
            }
            return $instance->$method(...$args);
        }
    当我们静态调用一个不存在的方法时,例如Player::playOneSong(),这个魔术方法就会被调用。它通过getFacadeRoot()方法创建出一个对象,然后在这个对象上真正执行我们的方法。
    再看看getFacadeRoot()方法:
        /**
         * Get the root object behind the facade.
         *
         * @return mixed
         */
        public static function getFacadeRoot()
        {
            return static::resolveFacadeInstance(static::getFacadeAccessor());
        }
    这里通过我们自定义门面类中的getFacadeAccessor方法,获取到一个service_id(暂且这么叫吧),然后传给resolveFacadeInstance方法。
    再往下看resolveFacadeInstance方法:
        /**
         * Resolve the facade root instance from the container.
         *
         * @param  string|object  $name
         * @return mixed
         */
        protected static function resolveFacadeInstance($name)
        {
            if (is_object($name)) {
                return $name;
            }
            if (isset(static::$resolvedInstance[$name])) {
                return static::$resolvedInstance[$name];
            }
            return static::$resolvedInstance[$name] = static::$app[$name];
        }
    通过static::$app[$name]从服务容器中获取 key 为name的对象,服务容器会帮我们实例化出对应的对象(前提是已经绑定好)。
    服务容器$app是一个对象,但它实现了ArrayAccess接口,所以可以用这种数组的方式访问。
    获取到对象后,放入到static::$resolvedInstance静态变量中,这样下次再获取相同对象时,就不用重复实例化了。
    到此这篇关于PHP Laravel门面的实现原理详解的文章就介绍到这了,更多相关PHP Laravel门面内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-29 01:34:51 | 显示全部楼层
    123456809 2023-6-29 01:34:51 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 21:01:02 | 显示全部楼层
    十二音阶囤 2023-6-29 21:01:02 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 09:32:07 | 显示全部楼层
    丁侦球 2023-6-30 09:32:07 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-30 18:45:51 | 显示全部楼层
    dxf17 2023-6-30 18:45:51 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 21:42:36 | 显示全部楼层
    贰十岁装成熟装s 2023-6-30 21:42:36 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-7-3 11:56:29 | 显示全部楼层
    音乐之家1 2023-7-3 11:56:29 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-7-3 22:01:39 | 显示全部楼层
    Gordon520 2023-7-3 22:01:39 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    回复

    使用道具 举报

    发表于 2023-7-4 11:51:53 | 显示全部楼层
    462710480 2023-7-4 11:51:53 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-4 13:01:08 | 显示全部楼层
    墙和鸡蛋 2023-7-4 13:01:08 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表