了解 Laravel - Alias运行机制

Laravel中运用了别名机制,一开始看的时候,有些摸不清线路。
用老旧的echo、log方式不适合去了解一个框架的运行机制,所以上一篇文章安装了xDebug。

了解别名机制,首先要了解

一、后期静态绑定

selfstaticparent 关键字对比
<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
?> 

输出结果

A
C
C

1、第一个结果
A::foo();
这个语句是可以在任何地方执行的,它表示使用A去调用静态方法foo()得到’A’,固定的指向A的foo();

2、第二个结果
parent::foo();
C的parent是B,B的parent是A,回溯找到了A的foo方法;
static::who();
语句中的static::调用的方法会被子类覆盖,所以优先调用C的who()方法,如果C的who方法不存在会调用B的who方法,如果B的who方法不存在会调用A的who方法。所以,输出结果是’C’。

3、第三个结果
self::foo();
这个self::是在B中使用的,所以self::等价于B::,但是B没有实现foo方法,B又继承自A,所以我们实际上调用了A::foo()这个方法。foo方法使用了static::who()语句,导致我们又调用了C的who函数。

再来看看new的情况
class Father {
    
    public function getNewFather() {
        return new self();
    }

    public function getNewCaller() {
        return new static();
    }
}

class Sun1 extends Father {
}

class Sun2 extends Father {
}

$f = new Father();
$sun1 = new Sun1();
$sun2 = new Sun2();

echo get_class($f->getNewFather())."<br />";
echo get_class($f->getNewCaller())."<br />";
echo get_class($sun1->getNewFather())."<br />";
echo get_class($sun1->getNewCaller())."<br />";
echo get_class($sun2->getNewFather())."<br />";
echo get_class($sun2->getNewCaller())."<br />";

以上输出为:

Father
Father
Father
Sun1
Father
Sun2

从这里可以看出
self本身,无论在什么地方调用,都是取到Father本身。
static,只有在出现继承的时候才会有区别。就是返回真正的调用者。

二、class_alias — 为一个类创建别名

// 官方例子
class foo { }

class_alias('foo', 'bar');

$a = new foo;
$b = new bar;

其实就是取了一个别名,让你也能够调用。

三、Laravel

Laravel 内存占用,从index.php入口到路由结束
begin: 364.83 kb
end: 5.83 mb
耗时0.246秒

Laravel 通过 AliasLoader 先去判断是不是 alias 别名,如果是则用 class_alias 创建一个别名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,314评论 19 139
  • 把当前目录作为Root Document只需要这条命令即可:php -S localhost:3300 也可以指定...
    绚烂的时光阅读 4,026评论 0 1
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,805评论 0 9
  • PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来...
    梦幻_78af阅读 6,377评论 1 10
  • 我感觉我好像是对正经的事不太上心,其他的事却挺上心,比如本该拿着教师资格证的书在看才对,而我反倒借了一本课外书在翻...
    爱生活的折耳猫阅读 3,587评论 0 0