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 )

时间: 2024-12-11 07:36:22

php static延迟静态绑定的相关文章

PHP Static延迟静态绑定用法分析_php技巧

本文实例讲述了PHP Static延迟静态绑定用法.分享给大家供大家参考,具体如下: PHP5.3以后引入了延迟静态绑定static,它是为了解决什么问题呢?php的继承模型中有一个存在已久的问题,那就是在父类中引用扩展类的最终状态比较困难.来看一个例子. class A { public static function echoClass(){ echo __CLASS__; } public static function test(){ self::echoClass(); } } cla

php延迟静态绑定实例分析

 这篇文章主要介绍了php延迟静态绑定,实例分析了延迟静态绑定的原理与实现技巧,需要的朋友可以参考下     本文实例讲述了php延迟静态绑定的方法.分享给大家供大家参考.具体分析如下: php延迟静态绑定:指类的self,不是以定义时为准,而是以计算时的运行结果为准.先看一个实例 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php header("content-type:text/html;charset=utf-

简单谈谈php延迟静态绑定_php实例

使用场景 先来观察以下代码: abstract class base { //do sth } class aClass extends base{ public static function create(){ return new aClass(); } } class bClass extends base{ public static function create(){ return new bClass(); } } var_dump(aClass::create()); var_

php延迟静态绑定实例分析_php技巧

本文实例讲述了php延迟静态绑定的方法.分享给大家供大家参考.具体分析如下: php延迟静态绑定:指类的self,不是以定义时为准,而是以计算时的运行结果为准.先看一个实例 <?php header("content-type:text/html;charset=utf-8"); class Human{ public static function hei(){ echo "我是父类的hei()方法"; } public function say(){//如

深入php面向对象、模式与实践_javascript技巧

1 语法 1.1 基础语法 clone 需要操作原对象,但又不想影响原对象. 复制代码 代码如下: $K_back = clone $K; 基本数据类型和数组都为真复制,即为真副本,当属性为对象时,为假复制,改变副本仍会影响原对象.解决方案: //在原对象中添加 function __clone(){ $this->对象 = clone $this->对象 } __clone在clone前自动触发,可以执行一些在备份前的属性操作. 2.&传递引用 方法引用传递,改变源对象 复制代码 代

PHP&gt;5.3版本部分新功能

[PHP5.3的新增.改进]匿名函数 也叫闭包(Closures), 经常被用来临时性地创建一个无名函数,用于回调函数等用途. Java代码   $func = function ($arg) {       print $arg;   };   $func("Hello World");    匿名函数还可以用 use 关键字来捕捉外部变量: Java代码   function arrayPlus($array, $num)   {       array_walk($array, 

利用好PHP5.3的新特性,实现单例模式

5.3以前也可实现,但代码较繁琐, 如下: class MOrder extends SModel{ protected static $handle; //单例句柄 private function __construct(){ //something } /** * 获取本类单例的方法,公开 * * @return MOrder */ public static function instance() { if(self::$handle){ return self::$handle; }

PHP5.3之后的新特性

  从PHP4到PHP5,实现了由个人开发语言到专业互联网的发展,见证着PHP从山寨走上正规大军的发展.PHP6还在酝酿中,相信PHP5会作为PHP6小试牛刀的场地. PHP5.3是PHP5的一个里程碑,加入了大量新特性.PHP功能是越来越多了,但是PHP的语法却越来越丑陋,有时加入了新功能,而新功能又带来了新问题,为了修复问题又要加入新的语法来修复.没有PHP的基础的朋友也不用担心,先对PHP5.3有个基本的了解.等学完后面知识再回过头来看PHP5.3的新特性你会有个全新的理解和感悟. 1.首

静态类的原罪

黑格尔有句名言:存在即合理.以此为论据的话,静态类的使用必然有其合理性.不过物极必反,一旦代码过于依赖静态类,其劣化的解决则不可避免.这就好比罂粟作为一种草本植物,有其在药理上的价值,但如果肆无忌惮的大量使用,它就变成了毒品. 什么是静态类 所谓静态类指的是无需实例化成对象,直接通过静态方式调用的类.代码如下: class Math{    public static function ceil($value)    {        return ceil($value);    }