后期静态绑定


后期静态绑定

从PHP 5.3.0开始,PHP增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。

该功能从语言内部角度考虑被命名为”后期静态绑定“。”后期绑定“的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为”静态绑定“,因为它可以用于(但不限于)静态方法的调用。

self:: 的限制

使用self:: 或者 __CLASS__对当前类的静态引用,取决于定义当前方法所在的类:

Example #1 self:: 用法

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        
self::who();
    }
}

class 
extends {
    public static function 
who() {
        echo 
__CLASS__;
    }
}

B::test();
?>

以上例程会输出:

A

后期静态绑定的用法

后期静态绑定试图通过引入一个关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用test()时引用的类是B而不是A。最终决定不引入新的关键字,而是使用已经预留的static关键字。

Example #2 static:: 简单用法

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        static::
who(); // 后期静态绑定从这里开始
    
}
}

class 
extends {
    public static function 
who() {
        echo 
__CLASS__;
    }
}

B::test();
?>

以上例程会输出:

B

Note:

static:: 在处理静态方法时与 $this 是不同的。 $this-> 会遵循继承规则,但是 static:: 不会。该差异将稍后在本手册中详细说明。

Example #3 static:: 用于非静态引用

<?php
class TestChild extends TestParent {
    public function 
__construct() {
        static::
who();
    }

    public function 
test() {
        
$o = new TestParent();
    }

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

class 
TestParent {
    public function 
__construct() {
        static::
who();
    }

    public static function 
who() {
        echo 
__CLASS__." ";
    }
}
$o = new TestChild;
$o->test();

?>

以上例程会输出:

TestChild
TestParent

Note:

后期静态绑定的处理方式解决了以往完全没有办法解决的静态调用。另外一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。

Example #4 转发和非转发调用

<?php
class {
    public static function 
foo() {
        static::
who();
    }

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

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

    public static function 
who() {
        echo 
__CLASS__." ";
    }
}
class 
extends {
    public static function 
who() {
        echo 
__CLASS__." ";
    }
}

C::test();
?>

以上例程会输出:

A
C
C

特殊情况

在PHP中有很多方式来触发一个方法的调用,例如回调函数或者魔术方法。因为后期静态绑定取决于运行时的信息,因此在特殊情况下可能会得到意想不到的结果。

Example #5 在魔术方法中使用后期静态绑定

<?php
class {

   protected static function 
who() {
        echo 
__CLASS__." ";
   }

   public function 
__get($var) {
       return static::
who();
   }
}

class 
extends {

   protected static function 
who() {
        echo 
__CLASS__." ";
   }
}

$b = new B;
$b->foo;
?>

以上例程会输出:

B

«  类型约束
» 对象和引用
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 学习贯彻十七大精神:推动科学发展 促进社会和谐 四月春午给爱的十封情书 清明节作文:清明节想说的话 小狗“皮皮” 歇后语大全及答案六年级 请不要让妈妈知道 送征衣·过韶阳 游厦门科技馆 健康无价作文500字 夸美女的俏皮话 中队干部竞选自荐书 细水长流、我们才承诺! 《魔法师的帽子》读后感作文800字 暑假家教的实践报告 我的夏令营生活(1)400字 六年一班的那些娃儿(1) 喜迎建国60周年,文明交通我参与作文1200字 读《辉煌共和国》有感作文800字 双十一学生活动策划书 狂风不会永远咆哮,怒涛不会永远卷积着波浪 轮回作文750字 你为我碟舞翩跹,我为你低吟浅唱 小学四年级作文300字:梨园一游 书之旅700字 在你的生命中,有没有被你忽视的那个人? 加强新时期工商系统党建工作的思考 高中高二作文1000字:粉色世界(五) 盐的味道 2017高考作文预测及范文:美丽生活不可欺 七律立夏 别背时间的债作文 多彩的夏天 流逝的美好 骨干教师个人工作总结范文 讲党性重品行个人自我剖析材料 大班科学教案:树皮的作用 护士实习报告结尾 恋曲 天使恶魔。倒霉命运。不间断作文2400字 黄亚非。你的一切还是那么熟悉 国际贸易专业自荐信参考 2015解除劳动合同协议书范文 我的人生价值观作文 今天我值日作文700字 笙笙如歌 我的陀螺100字 论宪法的司法化 感觉很不错的佛经语句 “十大慈善家”颁奖词 电信营业员自我评价

Copyright © 2016 phpStudy |