PHP之后期静态绑定
PHP后期静态绑定的(late static bindings)
理解PHP延迟静态绑定
static::中的static其实是运行时所在类的别名,并不是定义类时所在的那个类名。这个东西可以实现在父类中能够调用子类的方法和属性。
使用(static)关键字来表示这个别名,和静态方法,静态类没有半毛钱的关系,static::不仅支持静态类,还支持对象(动态类)。
转发调用:
所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用,self::,parent::,static::以及forward_static_call()。
非转发调用
那么非转发调用其实就是明确指定类名的静态调用(foo::bar())和非静态调用($foo->bar())
后期静态绑定原理
后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。
例子1,简单实用static
class A
{
public static function who()
{
echo CLASS;
}
public static function test()
{
static::who();// 后期静态绑定从这里开始
}
}
class B extends A{
public static function who()
{
echo CLASS;
}
}
B::test();
以上程序会输出:
B
例子2,区分转发和非转发调用
class A
{
public static function foo()
{
static::who();
}
public static function who()
{
echo __CLASS__;
}
}
class B extends A
{
public static function test()
{
A::foo();
parent::foo();
self::foo();
}
public static function who()
{
echo __CLASS__;
}
}
class C extends B
{
public static function who()
{
echo CLASS;
}
}
C::test();
以上程序会输出:
A C C
在这里主要分析下例子2。
1、C::test(),这是一个非转发调用,因为::前面有类名C。
2、进入test()方法,有三个静态调用A::foo(),parent::foo(),self::foo(),对于这三个静态调用来说,它们的非转发调用类就是C。
3、现在执行A::foo(),这是一个非转发调用。A::foo()中的代码是static::who(),这是一个转发调用,对于这个转发调用来说他的非转发调用类就是不再
是C而是A(因为之前执行了A::foo())。因此执行的结果为A。
4、现在执行parent::foo(),这是一个转发调用,转发到哪里呢?就是它的上一个非转发调用的类,也就是C
(在步骤2中提到的)。在这里一定要注意虽然在这之前执行了A::foo(),但是parent::foo()的上一个非转发调用的类任然是类C,
因此执行的结果是C。
5、现在执行self::foo(),这个和parent::foo()一样都是转发调用,因此也输出C。
使用后期静态绑定的好处
后期静态绑定目前我看到家多的是用于对象实例化中,在实例化对象时,static会根据运行时调用的类来决定实例化对象,
而self则是分局所在位置的类来决定实例化对象。当我们只想实例化子类,并且不希望后续再对子类的使用中由于父类的变化对
子类产生了影响时,后期静态绑定就能发挥它的作用了。
PHP之后期静态绑定的更多相关文章
- PHP的后期静态绑定
self 是个孝子 不管后来 谁是它的领导(调用它) 谁生了它 它就听谁的 子类调用父类的方法 self 的生存空间是父类 不管是不是子类调用 我生在哪 我就在哪个类里面找属性/方法 static ...
- php中的后期静态绑定
后期静态绑定PHP手册 使用的保留关键字: static 定义: static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的.也可以称之为"静态绑定",因为它可以用 ...
- php后期静态绑定
php后期静态绑定 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类. 虽然也可以调用非静态方法,但是不会在运行时绑定. static 不再只是简 ...
- static后期静态绑定
先说一下__CLASS__,get_class() , get_called_class() 区别: __CLASS__获取当前的类名, get_class()与上面一样,都是获取当前的类名, ge ...
- 139-PHP static后期静态绑定(二)
<?php class test{ //创建test类 public function __construct(){ static::getinfo(); //后期静态绑定 } public s ...
- 138-PHP static后期静态绑定(一)
<?php class test{ //创建test类 public function __construct(){ self::getinfo(); //后期静态绑定 } public sta ...
- php中的后期静态绑定("Late Static Binding")
在我们以往中,在类中使用self关键字的时候都是指向了被调用方法定义时的类,而非原始的调用类. 例如: class Animal{ static $IQ_lv_avg = 1; public stat ...
- 父类方法返回子类实例:PHP延迟静态绑定
案例分析 先前的PHP项目中,看到类似于以下的一段代码: <?php class DBHandler { public function get() { } } class MySQLHandl ...
- 静态绑定 self 和 static的区别
后期静态绑定 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类. 准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwar ...
随机推荐
- 如何取消Visual Studio Browser Link
VS2013.2015新建MVC网站并浏览后,页面默认自动启用Browser Link功能 解决方法,只需要在web.config中添加配置节点即可 <appSettings> <a ...
- 【iCore4 双核心板_ARM】例程二十:LWIP_TCP_CLIENT实验——以太网数据传输
实验现象: 核心代码: int main(void) { system_clock.initialize(); //ϵͳʱÖÓ³õʼ»¯ led.initialize(); //LED³õʼ ...
- win7(64bit)+python3.5+pyinstaller3.2安装和测试
最近因为做项目需要,需要在win7中安装pyinstaller用于将.py文件生成脱离python平台的可执行程序*.exe文件. 安装步骤 第一步:安装python3.5 [下载python3.5的 ...
- 树莓派设置静态IP地址
树莓派设置静态IP地址http://www.jianshu.com/p/b0e6d066d6b6 ——————————————————————————————————————————————————— ...
- 移除input在type="number"时的上下箭头
网页在有些情况下,会需要input的输入的为单纯数字的文本框,此时type=number,但使用type=number时,输入框后面会有一个上下箭头,那么如何去掉上下箭头呢? <input ty ...
- 《精通Python网络爬虫》
抓包工具 Fiddler 爬虫的浏览器伪装技术 Python Scrapy 框架
- mysql格式化小数保留小数点后两位(小数点格式化)
格式化浮点数的问题,用format(col,2)保留两位小数点,出现一个问题,例如下面的语句,后面我们给出解决方法 SELECT FORMAT(12562.6655,2); 结果:12,562.67 ...
- vue 本地开发时使用localhost与ip访问
修改config文件夹下面的index.js配置,将localhost改为0.0.0.0就可以了.用ip,127.0.0.1,localhost均行 host: '0.0.0.0', // can b ...
- svn st 状态详解
svn st status (stat, st): 显示工作副本中目录与文件的状态.用法: status [PATH...] 未指定参数时,只显示本地修改的条目(没有网络访问). 使用 -q 时, ...
- db first和code first
1. db first 是现有数据库,再写代码.根据数据库的表生成类. django里面:python manage.py inspectdb 2. code first 是先写代码,后创建数据库. ...