延迟静态绑定:static关键字

延迟静态绑定:static关键字

静态类工厂的实用

这种方法比较麻烦,代码冗余过高

//普通方法
abstract class DomainObject{

}

class User extends DomainObject{

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

class Document extends DomainObject{
    public static function create():Document{
        return new Document();
    }
}

//延迟静态绑定

> 这种静态绑定,比较理想。

abstract class DomainObject{
    public static function create():DomainObject{
        return new static();//这里不能用self
    }
}

class User extends DomainObject{

}

class Document extends DomainObject{

}

self指向的是定义了的create方法的DomainObject,而不是发生调用的Document。php5.3中引用了一个叫做延迟静绑定的概念,最明显的就是static关键字。static和self类似,但是区别在于前者引用的是被调用的类而不是包含类。因此,被例中,调用Document::create()会生成一个新的Document对象,而不是试图实例化一个DomainObject对象。

场景二描述:

假设我打算在DomainObject中引用组group的概念,默认情况下都属于default,但是我希望在类的继承中的分支中能够改变这个值。

代码清单

abstract class DomainObject{
    private $group;

    public function __construct()
    {
        $this->group = static::getGrount();
    }

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

    public function getGrount():string
    {
        return "default";
    }
}

class User extends DomainObject{

}

class Document extends DomainObject{

    public function getGrount():string{
        return "Document";
    }
}

print_r(User::create());
print_r(Document::create());

posted on 2020-08-06 17:58  誓_言  阅读(93)  评论(0)    收藏  举报

导航