了解 Laravel - Alias运行机制

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

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

  • 后期静态绑定 《php手册 传送门》
  • 类创建别名 《php手册 传送门》

一、后期静态绑定

selfstaticparent 关键字对比
 

输出结果

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())."
"; echo get_class($f->getNewCaller())."
"; echo get_class($sun1->getNewFather())."
"; echo get_class($sun1->getNewCaller())."
"; echo get_class($sun2->getNewFather())."
"; echo get_class($sun2->getNewCaller())."
";

以上输出为:

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 创建一个别名

你可能感兴趣的:(了解 Laravel - Alias运行机制)