【学习点滴-php】static关键字---延迟静态绑定

首先是这样一组代码:

abstract class User{

}

class Admin extends User{

    private $group;

    public  static function create(){
        return new Admin(); 
    } 

   public static function getGroup(){
         return "admin";
   }

   //.......其他更多函数。。

}


class    NormalUser extends User{

    private $group;

    public  static function create(){
        return new NormalUser(); 
    } 

   public static function getGroup(){
         return "normaluser";
   }

   //其他函数。

}

    首先是定义了一个抽象的类,然后创建了两个子类admin和normalUser,并且这两个类中都包含了两个静态方法create和getgroup.这样的代码几乎没有什么问题,然而却有很多的冗余。现在只有两个子类,如果子类增多的话,就需要增加与之类似的代码。这样我们不得不思考,如果把这段通用的代码提取放到父类中是不是可以呢。

很多人可能都想到了用self关键字。废话少说,我们开始行动。

abstract class User{

    public  static function create(){
        return new self(); 
   } 
   

   public static function getGroup(){
         return self::getGroup();
   }

}
class    Admin extends User{

}

class    NormalUser extends User{

}

Admin :: create();

代码看起来规整了许多。然而不幸的是,运行这段代码,给出了这样的错误提示:

--------------------------------------------------------------
PHP Fatal error: Cannot instance abstract class User in...
--------------------------------------------------------------
出现这段错误的原因是什么呢?原因就是:self被解析为定义create的Object对象(User),而不是解析为调用self的Object对象(Admin).因此,self的方法是不可行的。

sigh....

不过不用气馁,php 5.3引入了延迟静态绑定的概念,用static关键字标明,它与self关键字类似,不同的是,static会被解析为被调用的类而不是被定义的类。现在代码变成这样:

abstract class User{

    public  static function create(){
        return new static(); 
	}  

	public static function getGroup(){
        return static::getGroup();
	}

}

是不是方便了许多呢?

。。。。。

 
 

你可能感兴趣的:(【学习点滴-php】static关键字---延迟静态绑定)