經過工廠模式來認識PHP的靜態延遲綁定

經過簡單的工廠模式來認識PHP的靜態延遲綁定php

當咱們須要爲不少類添加實例化本身的成員函數時,能夠用工廠設計模式 + 靜態延遲綁定的特性,在定級類中建立實例化上下文類的方法,繼而讓子類能夠直接調用此方法實例化本身,self()實例化的爲定義本身的類,不會根據上下文去切換,而static()會根據上下文去解析,指向當前調用本身的類。設計模式

<?php
abstract class Demo
{
    public static $name = 'sallency';
    
    //error
    public static function selfInstance() {
        //self是用來解析上下文
        //此處的語境爲調用定義它的類
        //抽象類不可實例化因此會報錯
        return new self();
    }
    
    public static function staticInstance() {
        //static是用來調用上下文
        //此處的語境爲解析調用它的上下文(某個類)
        //如果非抽象類調用的話天然能夠實例化
        return new static ();
    }
}

class StaticDemo extends Demo
{
    public function __construct() {
        echo "i am construct of " . __CLASS__ . '<br/>';
        echo self::$name;
    }
}
var_dump(StaticDemo::staticInstance());
var_dump(Demo::$name);//抽象類只是不能實例化對象
?>

注意抽象類裏的selfInstance方法是錯誤的,內部使用的return new self()是解析上下文,即調用此方法最初定義的地方,最初是在抽象類中,天然實例化報錯函數

在類中 new self() new static()均可以實例化類對象,但self是解析上下文,即實例化定義本身的類,static則是根據當前上下文是哪一類在調用本身而將本身指向此類spa

靜態延遲綁定設計

new self();code

實例化一個本身被定義的類的對象對象

new parent();io

實例化一個本身的父類對象function

new static();class

實例化一個調用本身的當前類的對象

相關文章
相關標籤/搜索