静态延迟绑定的概念

PHP版本5.3起增加了静态延迟绑定,也称迟绑定,主要用于在继承范围内引用静态调用的类。简单地来说:static::不再被解析为当前方法所定义的类,而是在实际运行时计算的。

// 意外的继承
class Person
{
public static $name = 'Person'; public static function say()
{
return self::$name;
}
} class Man extends Person
{
public static $name = 'Man';
} echo Man::say(); // Person

在这个例子中,say()方法使用了 self 关键字,指的是 Person 类而不是 Man 类,所以 Person::say() 方法中无法访问静态变量最终值,但是有了静态延迟绑定,这个问题就可以得到解决了。

静态延迟绑定

class Person2
{
public static $name = 'Person'; public static function say()
{
return static::$name; // 后期静态绑定从这里开始
}
} class Man2 extends Person2
{
public static $name = 'Man';
} echo Man2::say(); // Man

添加了静态延迟绑定后,当 Man2 调用静态方法 say() 时,static:: 会被解析为 Man2,而不是 say() 方法的定义类 Person。

静态延迟绑定转发

如果静态方法调用 parent:: 或者 self::,将转发调用信息。

// 官网示例:
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

当调用 A::foo()时,static::解析到的是 A,

当调用 parent:: 和 self:: 时,因为转发机制,static::被解析为当前实际调用类,也就是 C ,所以 parent::foo() = ‘C’,self::foo() = ‘C’

PHP静态延迟绑定的更多相关文章

  1. PHP静态延迟绑定和普通静态效率简单对比

    只是一个简单的小实验,对比了下 延迟绑定 和 非延迟的效率 延迟绑定主要就是使用 static 关键字来替代原来的 self ,但功能非常强大了 实验代码: class A { protected s ...

  2. PHP静态延迟绑定简单示例

    没怎么用过这个新特性,其实也不算新啦,试试吧,现在静态类的继承很方便了 <?php class A { protected static $def = '123456'; public stat ...

  3. PHP静态延迟绑定简单演示样例

    没怎么用过这个新特性.事实上也不算新啦,试试吧,如今静态类的继承非常方便了 <?php class A { protected static $def = '123456'; public st ...

  4. PHP 面向对象编程和设计模式 (2/5) - 静态变量、属性和方法及延迟绑定

    PHP高级程序设计 学习笔记 2014.06.10 Static(静态)关键字用来定义静态方法和属性,static 也可用于定义静态变量以及后期静态绑定. 1.静态变量 static variable ...

  5. Atitit 延迟绑定架构法attilax总结

    Atitit 延迟绑定架构法attilax总结 配置文件的延迟绑定1 Api属性与方法的回调延迟绑定1 后期绑定和前期绑定2 延迟调用2 用 Java 语言延迟绑定2 什么是推迟绑定 C++3 配置文 ...

  6. python 延迟绑定

    def multipliers(n): funcs = [] for i in range(n): def f(x): return x * i funcs.append(f) return func ...

  7. Scala学习之延迟绑定

    package com.swust.example object TraitDemo2 extends App{ //抽象类 abstract class Writer { def writeMess ...

  8. ELF 文件 动态连接 - 延迟绑定(PLT)

    PLT 全称:Procedure Linkage Table ,直译:过程连接表 由于在动态连接中,程序的模块之间包含了大量的函数引用,所以在程序开始执行前,动态链接会耗费较多的时间用于模块之间函数引 ...

  9. python闭包和延迟绑定

    一.什么是闭包: 1.函数内定义函数. 2.外函数的返回时内函数的引用. 3.内函数使用外函数的局部变量(至少一个). 1 def outfunc(): 2 for num in range(4): ...

随机推荐

  1. How to use VS2012 remote debug Windows Azure Cloud Services

    Background: Windows Azure Cloud Services 可以在本地调试,使用Visual Studio 2012 + 模拟器 Emulator.但是模拟器的工作状态和环境和真 ...

  2. Servlet获取简单验证码

    package com.helloweenvsfei.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Gra ...

  3. Could not open Hibernate Session for transaction;

    javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Co ...

  4. .Net MVC中访问PC网页时,自动切换到移动端对应页面

    随着移动端的流行,越来越的网站,除了提供PC网页之外,也提供了移动端的H5页面,手机在访问www.xxx.com的时候,能自动跳转到mobile.xxx.com.网上很多在实现时也能使用JS直接进行跳 ...

  5. jquery 插件之 点赞“+1” 特效

    一般用户点个赞后,都会有个 +1 的特效飘过,用户已经点过赞了,会有“已点过赞”的特效提示 在这里,我们写了一个点赞的插件 //扩展对象点赞插件.点赞特效 //用法:jQuery('.praisebt ...

  6. JS弹出窗口代码大全(详细整理)

    1.弹启一个全屏窗口 复制代码代码如下: <html> <body http://www.jb51.net','脚本之家','fullscreen');">; < ...

  7. Java编程思想学习(十五) 注解

    注解Annotation又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式.使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Ann ...

  8. POJ2288 Islands and Bridges

    Description Given a map of islands and bridges that connect these islands, a Hamilton path, as we al ...

  9. TYVJ1864 守卫者的挑战

    P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...

  10. javascript显示实时时间

    <html> <script language=Javascript> function time(){ //获得显示时间的div t_div = document.getEl ...