美文网首页
了解 Laravel - Alias运行机制

了解 Laravel - Alias运行机制

作者: 暮隼 | 来源:发表于2017-11-10 21:02 被阅读0次

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

    相关文章

      网友评论

          本文标题:了解 Laravel - Alias运行机制

          本文链接:https://www.haomeiwen.com/subject/ggqbmxtx.html