如果你是一个懒惰的程序员,你看到以下代码可能会恼火

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延迟静态绑定的更多相关文章

  1. PHP "延迟静态绑定" 功能,static

    从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法.第二点延迟绑定,这个根据下面代码就可以很好的理解 看一下这个例子: class A{ static $name ...

  2. PHP延迟静态绑定 static关键字

    示例代码1 abstract class Parent { } class Man extends Parent { public static function create(){ return n ...

  3. PHP延迟静态绑定:static关键字

    PHP5.3中引入了延迟静态绑定的概念.该特性最明显的标志就是新关键字static.static类似于self,但它指的是被调用的类而不是包含类.在本例中,它的意思是调用Document::creat ...

  4. php5.3 延迟静态绑定 static关键字

    //传统模式 --这段代码能很好工作,但大量的重复代码很烦人,不想为每个DomainObject子类都创建这段相同代码吧? /* abstract class DomainObject{} class ...

  5. PHP延迟静态绑定

    类可以自下往上调用父类方法,如果需要在父类中根据不同的子类,来调用子类的方法,那么就需要延迟静态绑定.延迟静态绑定用的是保留关键词static. 所谓延迟静态绑定,顾名思义,静态调用时::符号左侧的部 ...

  6. 父类方法返回子类实例:PHP延迟静态绑定

    案例分析 先前的PHP项目中,看到类似于以下的一段代码: <?php class DBHandler { public function get() { } } class MySQLHandl ...

  7. PHP延迟静态绑定(本文属于转发)

    这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来: <?php class DBHandler { function get() {} } class MySQLHand ...

  8. static后期静态绑定

    先说一下__CLASS__,get_class() ,  get_called_class() 区别: __CLASS__获取当前的类名, get_class()与上面一样,都是获取当前的类名, ge ...

  9. php Late Static Bindings延迟静态绑定

    官网说道: As of PHP 5.3.0, PHP implements a feature called late static bindings which can be used to ref ...

随机推荐

  1. (easy)LeetCode 204.Count Primes

    Description: Count the number of prime numbers less than a non-negative number, n. Credits:Special t ...

  2. (转)C# DES

    本文原地址:http://blog.csdn.net/zhoufoxcn/article/details/1497095 作者:周公 , inputByteArray.Length);         ...

  3. oracle rac 日志体系结构!

    告警日志集群节点集群件告警日志:$GRID_HOME/log/<hostname>/alert<hostname>.log数据库实例的告警日志:$DIAG_DESTINATIO ...

  4. oracle 内存结构 share pool sql解析的过程

    1.sql解析的过程 oracle首先将SQL文本转化为ASCII字符,然后根据hash函数计算其对应的hash值(hash_value).根据计算出的hash值到library cache中找到对应 ...

  5. android View 自动 GONE 问题

    首先说一下 view visibility VISIBLE.INVISIBLE.GONE的区别: 可见(visible) XML文件:android:visibility="visible& ...

  6. 支撑5亿用户、1.5亿活跃用户的Twitter最新架构详解及相关实现

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 摘要:Twitter出道之初只是个奋斗在RoR上的小站点,而如今已拥有1.5亿的活跃 ...

  7. 多线程(二)NSThread

    一.NSThread优缺点      优点:NSThread是最轻量级的      缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销   二.NSThread的使用 ...

  8. 二模08day2解题报告

    T1.引爆炸弹(bomb) N个炸弹构成一棵树,引爆一颗叶节点,会一直引爆到根节点.每颗炸弹有一个价值,求引爆k个炸弹的最大价值. 既然是一棵树,那么自然想到dp.所以先树形dp了一遍(由于可能出现多 ...

  9. C#中List集合转换JSON

    #region 将List<>转换为Json public string List2JSON(List<object> objlist, string classname) { ...

  10. 如何用手机维护Mysql数据库

    如何用手机维护网站数据库 身边很多人都在拿ipad或iphone来玩儿游戏或听歌,大多数人认为它们就是个娱乐设备,在我看来它们同样可以帮助我们更加快捷的工作,我用手机遥控单反.用手机控制PPT的播放. ...