美文网首页
php后期静态绑定

php后期静态绑定

作者: winlans | 来源:发表于2017-07-10 23:53 被阅读38次

在观看laravel源码的时候,突然看到了

public static function getInstance()
    {
        if (is_null(static::$instance)) {
            static::$instance = new static;
        }

        return static::$instance;
    }

虽然之前翻看手册的时候看到过,但很少使用,于是仔细看了一下,原来是后期静态绑定。但是后期静态绑定又是什么鬼,还是仔细分析下吧。

由来

PHP在继承体系中,调用分为转发调用和非转发调用。

  • 转发调用(可以使用get_called_class()获取调用类的名称)
    *self::*,*parent::*,*static::* 以及 forward_static_call()属于转发调用
  1. 使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类。
  2. 使用 parent:: 表示对当前类的父类的静态引用。
  3. static:: “后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。
    这是什么意思呢?还是通过代码来说比较好,哈哈
class A{
    public static function call(){
       static::who();
    }
    public static function who(){
        echo __CLASS__,'1<br>';
        echo get_called_class(),'2<br>';
    }
}

class B extends A{
    public static function who(){
        echo __CLASS__.'3<br>';
        echo get_called_class(),'5<br>';
    }
}

class C extends B{

}
$c = new C();
C::call();  //结果是B3,C5
class A{
    public static function call(){
       static::who();
    }
    public static function who(){
        echo __CLASS__,'1<br>';
        echo get_called_class(),'2<br>';
    }
}

class B extends A{
    public static function who(){
        echo __CLASS__.'3<br>';
        echo get_called_class(),'5<br>';
    }
}

class C extends B{
    public static function who(){
        echo __CLASS__.'6<br>';
        echo get_called_class(),'7<br>';
    }
}
$c = new C();
C::call(); //结果是C6,C7。
class A{
   static $instance;
}
class B extends A{
    public static function put(){
       return static::$instance = new static ;
    }
}
class C extends B{

}
var_dump(C::put()); // object(C)#1 (0) { }
var_dump(B::put()); // object(B)#1 (0) { }

不知道大家有没有看懂,我认为,static::类似于thisthis是对当前对象的引用,而static::是对当前调用类的引用。

  • 非转发调用
  1. 直接使用类名:: fun()

相关文章

  • php后期静态绑定

    在观看laravel源码的时候,突然看到了 虽然之前翻看手册的时候看到过,但很少使用,于是仔细看了一下,原来是后期...

  • php 后期静态绑定

    php手册上关于后期静态绑定如下解释:后期静态绑定工作原理是存储了在上一个"非转发调用"的类名。 这里我们先明确什...

  • PHP 后期静态绑定

    自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 准确说,...

  • PHP静态延迟绑定

    1、什么是静态延时绑定 1)自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内...

  • PHP面向对象-后期静态绑定

    说明 准确说,后期静态绑定工作原理是存储了在==上一个==“==非转发调用==”(non-forwarding c...

  • 后期静态绑定

    PHP 有后期静态绑定的功能,用于在继承范围内引用静态调用的类,即在类的继承过程中,使用的类不再是当前类,而是调用...

  • 对于PHP 后期静态绑定的理解

    在学静态方法调用的时候只学了 parent:: self:: 调用静态方法,昨天突然看到一个兄弟的代码,写了一个...

  • 程序语言基础知识

    把一个方法与其所在的类/对象关联起来叫做方法的绑定,绑定分为静态绑定(前期绑定)和动态绑定(后期绑定)。 静态绑定...

  • 「php化整为零系列」六、后期静态绑定

    该系列我只写我的理解,非官方解释,如不够专业请见谅 后期静态绑定说白了就是对于静态方法,在继承过程中引入stati...

  • static 关键字

    静态变量 最基本的知识 连续声明会报错 后期静态绑定 理解继承 复杂的例子 总结,无论在静态绑定前调用的是 sel...

网友评论

      本文标题:php后期静态绑定

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