php中延迟绑定,PHP静态延迟绑定

静态延迟绑定的概念

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静态延迟绑定和普通静态效率简单对比

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

PHP静态延迟绑定简单示例

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

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

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

PHP 面向对象编程和设计模式 &lpar;2&sol;5&rpar; - 静态变量、属性和方法及延迟绑定

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

Atitit 延迟绑定架构法attilax总结

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

python 延迟绑定

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

Scala学习之延迟绑定

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

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

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

python闭包和延迟绑定

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

随机推荐

MySql 中文乱码排查解决方案

MySQL会出现中文乱码的原因不外乎下列几点: server本身设定问题,例如还停留在latin1 table的语系设定问题(包含character与collation) 客户端程式(例如php)的连 ...

重新想象 Windows 8 Store Apps &lpar;59&rpar; - 锁屏

[源码下载] 重新想象 Windows 8 Store Apps (59) - 锁屏 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 锁屏 登录锁屏,获取当前程序的锁 ...

java poi导入EXCEL xls文件代码

/** * */ package com.bn.car.common.report.excel; import java.io.FileInputStream; import java.io.IOEx ...

关于国际化中的&dollar;NON-NLS-1&dollar;

百度百科解释: 这实际与eclipse中支持i18n的一种方式,eclipse的标准结构,将所有string常量定义到·properties中,例如下面程序段中的TestRef.hello实际上是·p ...

&lbrack;开发环境&rsqb; Ubuntu12&period;04 Telnet服务设置

Ubuntu12.04默认未启用Telnet服务,配置Telnet服务步骤如下: 1. 安装和配置 安装openbsd-inetd: #sudo apt-get install openbsd-ine ...

BitmapFactory&period;decodeResource&lpar;res&comma; id&rpar;&semi; 第一个参数跟第二个参数有什么关系?

BitmapFactory.decodeResource(res, id); res= getResources();activity的方法 id = R.drawable.x

&lbrack; SSH框架 &rsqb; Hibernate框架学习之二

一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...

实战ELK(5) Logstash 入门

Logstash 是一个开源的数据收集引擎,它具有备实时数据传输能力.它可以统一过滤来自不同源的数据,并按照开发者的制定的规范输出到目的地. 一.原理 Logstash 通过管道进行运作,管道有两个必 ...

centos静态绑定IP地址

Centos7 /etc/sysconfig/network-scripts/ifcfg-ens33

自定义服务与调用--------factory

自定义服务: angular.module('myApp').factory('UserService',['$http','$q',function ($http,$q) { // 定义一个方法工厂 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值