面向对象之静态延迟绑定

面向对象之静态延迟绑定

static类似self,但它指的是被调用的类而不是包含类

在说这个"延迟静态绑定"前,我们先温习一个函数get_called_class; get_called_class

  • 获取静态方法调用的类名。
  • 返回值:返回类的名称,如果不是在类中调用则返回 false; 实例代码:
    class domain {
    static public function say() {
        var_dump(get_called_class());
    }
    }
    class www extends domain {
    }
    domain::say();
    www::say();

    输出: string(3) "domain" string(3) "www"


好,开始说延迟静态绑定延迟静态绑定是在PHP5.3中引入了的概念。该特性最明显标志就是使用新关键字static;static类似self,但它指的是被调用的类而不是包含类; 列子1:

abstract class GoodMan
{
    public static function create(){
        return new self();
    }    
}
class Jack extends GoodMan{}
Jack::create();

报错:Fatal error: Cannot instantiate abstract class GoodMan in /mnt/hgfs/blog/web/object.php on line 9

其实,我们使用Jack::create(),是想生成一个新的jack对象;而不是想实例化抽象类GoodMan。所以我们这里使用延迟静态绑定特性。 例子2:

abstract class GoodMan
{
    public static function create(){
        return new static();
    }    
}
class Jack extends GoodMan{}
Jack::create();

下面是模仿《深入PHP...》中的一个例子;static 关键字不仅用于实例化。和self和parent一样。static还可以作为静态方法调用的标示符。甚至是从非静态上下文调用;下面为GoodMan引入组的概念:

abstract class GoodMan
{
    private $group;
    public function __construct(){
        $this->group = static::getGroup();
    }
    public static function create(){
        return new static();
    }
    static function getGroup(){
        return "demo";
    }
}
class Yushi extends GoodMan{}
class Jack extends GoodMan{
    static function getGroup(){
        return "admin";
    }
}
var_dump(Jack::create());
echo '<br/>';
var_dump(Yushi::create());

输出: object(Jack)#1 (1) { ["group":"GoodMan":private]=> string(5) "admin" } object(Yushi)#1 (1) { ["group":"GoodMan":private]=> string(4) "demo" }

默认所有类都属于demo组,但是Jack重写类别成了admin组。





posted @ 2021-09-05 20:09  成文的博客  阅读(55)  评论(0编辑  收藏  举报