php static延迟静态绑定
如果你是一个懒惰的程序员,你看到以下代码可能会恼火
abstract class U{ }
class u1 extends U{
public static function create(){
return new u1();
} } class u2 extends U{
public static function create(){
return new u2();
}
}
这段代码正常工作是没问题,但大量重复的代码会很烦人
我不想在每个子类中添加create方法,如果把create方法放在超类U中,代码可能是
abstract class U{
public static function create(){
return new self();
}
}
class u1 extends U{
function a(){}
} class u2 extends U{ }
u1::create();
看起来很优雅整洁,现在我们把常见代码放在一个位置,并用self作为对该类的引用。但这里我们对self做了一个假设。
实际上,self对该类所起的作用与$this对对象所起的作用并不完全相同。self指的不是调用上下文,他指的是解析上下文,因此如果运行上面的列子,将会得到
Fatal error: Cannot instantiate abstract class U in D:\wamp\www\test\oop\static.php on line 21
因此self被解析为定义create的U,而不是解析为调用self的u1类。
php5.3之前,在这方面都有严格的限制,产生过很多笨拙的解决方案,php5.3引入了延迟静态绑定 及使用 关键字 static
static类似self,但它指的是被调用的类而不是包含类。
在以下例子中u1::create将生成u1对象,而不是实例化U对象
abstract class U{
public static function create(){
return new static();
}
}
class u1 extends U{
} class u2 extends U{ }
u1::create();
static不仅可以用于实例化,和self,parent一样还可以作为静态方法的调用标识符,甚至是从非静态上下文中调用
abstract class U{
private $group;
public function __construct(){
$this->group=static::getGroup();
}
public static function create(){
return new static();
}
static function getGroup(){
return 'default';
}
}
class u1 extends U{
} class u2 extends U{
static function getGroup(){
return 'u2';
}
}
class u3 extends u2{ }
print_r(u1::create());
echo '<br/>';
print_r(u3::create());
u1 Object ( [group:U:private] => default )
u3 Object ( [group:U:private] => u2 )
php static延迟静态绑定的更多相关文章
- PHP "延迟静态绑定" 功能,static
从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法.第二点延迟绑定,这个根据下面代码就可以很好的理解 看一下这个例子: class A{ static $name ...
- PHP延迟静态绑定 static关键字
示例代码1 abstract class Parent { } class Man extends Parent { public static function create(){ return n ...
- PHP延迟静态绑定:static关键字
PHP5.3中引入了延迟静态绑定的概念.该特性最明显的标志就是新关键字static.static类似于self,但它指的是被调用的类而不是包含类.在本例中,它的意思是调用Document::creat ...
- php5.3 延迟静态绑定 static关键字
//传统模式 --这段代码能很好工作,但大量的重复代码很烦人,不想为每个DomainObject子类都创建这段相同代码吧? /* abstract class DomainObject{} class ...
- PHP延迟静态绑定
类可以自下往上调用父类方法,如果需要在父类中根据不同的子类,来调用子类的方法,那么就需要延迟静态绑定.延迟静态绑定用的是保留关键词static. 所谓延迟静态绑定,顾名思义,静态调用时::符号左侧的部 ...
- 父类方法返回子类实例:PHP延迟静态绑定
案例分析 先前的PHP项目中,看到类似于以下的一段代码: <?php class DBHandler { public function get() { } } class MySQLHandl ...
- PHP延迟静态绑定(本文属于转发)
这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来: <?php class DBHandler { function get() {} } class MySQLHand ...
- static后期静态绑定
先说一下__CLASS__,get_class() , get_called_class() 区别: __CLASS__获取当前的类名, get_class()与上面一样,都是获取当前的类名, ge ...
- php Late Static Bindings延迟静态绑定
官网说道: As of PHP 5.3.0, PHP implements a feature called late static bindings which can be used to ref ...
随机推荐
- java记录在线人数小案例
文件目录: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...
- ubuntu 14.04 安装git server
版本信息 ubuntu : 14.04.1 git version 1.9.1 perl v5.10.1 ssh OpenSSH_6.6.1p1 本次安装的git server使用gitolite实现 ...
- poj 1258 Agri-Net 最小生成树 kruskal
点击打开链接 Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33733 Accepted: 13539 ...
- java内部类的继承
1.public class OuterInnerClass extends ClassA.ClassB{ public OuterInnerClass(ClassA a) ...
- Android--ListView显示列表数据
简单的显示 import android.os.Bundle; import android.app.ListActivity; import android.view.View; import an ...
- ASP.net 探针
<%@ Page Language="JScript" ContentType="text/html" ResponseEncoding="gb ...
- java的String类(一)
final类,无子类. 类内定义了char数组value[],私有,不可修改. String的长度,length(). 判空,isEmpty(). 索引index处的字符,charAt(index). ...
- Redis多机功能之复制
复制的目的:创建具有相同数据库的拷贝服务器:扩展系统处理读请求的能力: 复制的定义 Redis的复制(replication)功能允许用户根据一个Redis服务器来创建任意多个该服务器的复制品,其中被 ...
- Android 进阶 Fragment 介绍和使用 (二)
管理fragment 因为FragmentManager的API是在Android 3.0,也即API level 11开始引入的,所以对于之前的版本,需要使用support library中的Fra ...
- xml是什么?
xml Extensible Markup Language 可扩展标记语言 它被设计用来传输和存储数据. 它的内容都是由标签组成,非常有规律.