首先是这样一组代码:
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的方法是不可行的。
不过不用气馁,php 5.3引入了延迟静态绑定的概念,用static关键字标明,它与self关键字类似,不同的是,static会被解析为被调用的类而不是被定义的类。现在代码变成这样:
abstract class User{ public static function create(){ return new static(); } public static function getGroup(){ return static::getGroup(); } }
是不是方便了许多呢?
。。。。。