Laravel中运用了别名机制,一开始看的时候,有些摸不清线路。
用老旧的echo、log方式不适合去了解一个框架的运行机制,所以上一篇文章安装了xDebug。
了解别名机制,首先要了解
- 后期静态绑定 《php手册 传送门》
- 类创建别名 《php手册 传送门》
一、后期静态绑定
self
、static
、parent
关键字对比
<?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
创建一个别名
网友评论