国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP靜態(tài)方法和屬性、延遲靜態(tài)綁定

rubyshen / 1539人閱讀

摘要:靜態(tài)方法和屬性靜態(tài)方法是以類作為作用域的函數(shù)。靜態(tài)方法不能訪問這個類中的普通屬性,因為那些屬性屬于一個對象,但可以訪問靜態(tài)屬性。因此靜態(tài)方法和屬性又被稱為類變量和屬性,也就不能在靜態(tài)方法中使用偽變量。引入了延遲靜態(tài)綁定的概念。

靜態(tài)方法和屬性

靜態(tài)方法是以類作為作用域的函數(shù)。靜態(tài)方法不能訪問這個類中的普通屬性,因為那些屬性屬于一個對象,但可以訪問靜態(tài)屬性。如果修改了一個靜態(tài)屬性,那么這個類的所有實例都能訪問到這個新值。
因為是通過類而不是實例來訪問靜態(tài)元素,所以訪問靜態(tài)元素時不再需要引用對象的變量,而是使用::來連接類名和屬性或類名和方法。

class StaicExample {
    static public $aNum = 0;
    static public function sayHello() {
        print "hello";
    }
}

print StaicExample::$aNum;
StaicExample::sayHello();

一個子類可以使用parent關(guān)鍵字來訪問父類,而不使用其類名。要從當(dāng)前類(不是子類)中訪問靜態(tài)方法或?qū)傩裕梢允褂?b>self關(guān)鍵字。self指向當(dāng)前類,就像偽變量$this指向當(dāng)前對象一樣。因此,在StaticExample類的外部可以使用其類名訪問屬性$aNum:

StaicExample::$aNum;

而在StaicExample類內(nèi)部,可以使用self關(guān)鍵字:

class StaicExample {
    static public $aNum = 0;
    static public function sayHello() {
        self::$aNum++;
        print "hello (".self::$aNum.")
";
    }
}

只有在使用parent關(guān)鍵字調(diào)用方法的時候,才能對一個非靜態(tài)方法進(jìn)行靜態(tài)形式的調(diào)用(使用::)。除非是訪問一個被覆寫的方法,否則永遠(yuǎn)只能使用::訪問被明確聲明為static的方法或?qū)傩浴S袝r看到使用static語法來引用方法或?qū)傩裕赡懿⒉灰馕吨渲械姆椒ɑ驅(qū)傩员仨毷庆o態(tài)的,只不過說明它屬于特定的類。

根據(jù)定義,不能在對象中調(diào)用靜態(tài)方法。因此靜態(tài)方法和屬性又被稱為類變量和屬性,也就不能在靜態(tài)方法中使用偽變量$this

為什么要使用靜態(tài)方法或?qū)傩阅兀?/p>

在代碼中的任何地方都可用(假設(shè)你可以訪問該類)。也就是說,你不需要在對象間傳遞類的實例,也不需要將實例存放在全局變量中,就可以訪問類中方法。

類的每個實例都可以訪問類中定義的靜態(tài)屬性,所以可以利用靜態(tài)屬性來設(shè)置值,該值可以被類的所有對象使用。

不需要實例對象就能訪問靜態(tài)屬性或方法,這樣就不用為了獲取一個簡單的功能而實例化對象。

延遲靜態(tài)綁定:static關(guān)鍵字
靜態(tài)方法可以用作工廠方法,工廠方法是生成包含類的實例的一種方法。
先看下面的重復(fù)代碼:

abstract class DomainObject {
}

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

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

想必大家都不想為每個DomainObject子類都創(chuàng)建與上面代碼類似的標(biāo)準(zhǔn)代碼。如果把create()放在超類呢?

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

這回看起來簡潔多了。現(xiàn)在把常見的代碼放在一個位置,并使用self作為對該類的引用。實際上,self對該類所起的作用與$this對對象所起的作用并不完全相同。self指的不是調(diào)用上下文,而是解析上下文。因此,運(yùn)行剛才上面的代碼會得到:

PHP Fatal error: Cannot instantiate abstract class DomainObject in ...

因此,self被解析為定義create()的DomainObject,而不是解析為調(diào)用self的Document類。PHP5.3之前,在這方面有嚴(yán)格的限制,產(chǎn)生很多笨拙的解決方案。PHP5.3引入了延遲靜態(tài)綁定的概念。該特性最明顯的標(biāo)志就是新關(guān)鍵字static。static類似于self,但它指的是被調(diào)用的類而不是包含類

在本例中,它的意思是調(diào)用Document::create()將生成一個新的Document對象,而不是試圖實例化一個DomainObject對象。
因此,現(xiàn)在在靜態(tài)上下文使用繼承關(guān)系。

abstract class DomainObject {
    public static function create() {
        return new static();
    }
}
    
class User extends DomainObject {
        
}
    
class Document extends DomainObject {
        
}
print_r(Document::create());//Document Object {}

static關(guān)鍵字不僅僅可以用于實例化。和self和parent一樣,static還可以作為靜態(tài)方法調(diào)用的標(biāo)識符,甚至是從非靜態(tài)上下文中調(diào)用。

如果想為DomainObject引入組(group)的概念。默認(rèn)情況下,所有類都屬于default類別,但想可以為繼承層次結(jié)構(gòu)的某些分支重寫類別。

abstract class DomainObject {
    private $group;
    
    public function __construct() {
        $this->group = static::getGroup();
    }
    
    public static function create() {
        return new static();
    }
    
    static function getGroup() {
        return "default";
    }
}
    
class User extends DomainObject {
        
}
    
class Document extends DomainObject {
    static function getGroup() {
        return "document";
    }
} 

class SpreadSheet extends Document {

}

print_r(User::create());
print_r(SpreadSheet::create());

在DomainObject類中定義了構(gòu)造函數(shù)。該構(gòu)造函數(shù)使用static關(guān)鍵字調(diào)用靜態(tài)方法getGroup()。DomainObject提供了默認(rèn)實現(xiàn),但Document將其覆蓋了。創(chuàng)建的SpreadSheet新類擴(kuò)展了Document類。下面是打印結(jié)果:

User Object
(
    [group:DomainObject:private] =>  default
)
SpreadSheet Object
(
    [group:DomainObject:private] => document
)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28389.html

相關(guān)文章

  • php: static keyword

    摘要:函數(shù)內(nèi)的變量靜態(tài)變量的理解靜態(tài)變量類型說明符是。靜態(tài)變量雖在程序的整個執(zhí)行過程中始終存在,但是在它作用域之外不能使用。靜態(tài)變量并不是說其就不能改變值,不能改變值的量叫常量。 函數(shù)內(nèi)的static變量 static靜態(tài)變量的理解 靜態(tài)變量 類型說明符是static。靜態(tài)變量屬于靜態(tài)存儲方式,其存儲空間為內(nèi)存中的靜態(tài)數(shù)據(jù)區(qū)(在 靜態(tài)存儲區(qū)內(nèi)分配存儲單元),該區(qū)域中的數(shù)據(jù)在整個程序的運(yùn)行期間...

    Astrian 評論0 收藏0
  • 【Laravel】Laravel 框架關(guān)鍵技術(shù)解析·讀書筆記(一)

    摘要:判斷是否存在構(gòu)造函數(shù),不存在直接實例化,存在則通過來獲取輸入函數(shù),并有相應(yīng)的方法解決依賴參數(shù)問題,實現(xiàn)依賴注入。 Laravel 框架關(guān)鍵技術(shù)解析·讀書筆記(一) 第一章 入口文件 請求訪問的入口文件,主要完成幾部分工作,分別是: 自動加載函數(shù)的添加 服務(wù)器實例化與服務(wù)注冊 路由加載 請求實例化與路由分發(fā) 相應(yīng)生成與發(fā)送 其中,自動加載函數(shù)用于包含引用文件,改文件是composer...

    CocoaChina 評論0 收藏0
  • PHP學(xué)習(xí)筆記——延遲靜態(tài)綁定

    摘要:于是為了解決這個問題,中引入了延遲靜態(tài)綁定這個概念。延遲靜態(tài)綁定這個代碼與之前的幾乎一致,不同點(diǎn)在于將換成了這個關(guān)鍵字,會解析為子類,而非父類,這樣就可以解決上面遇到的問題,這就是的延遲靜態(tài)綁定。 使用場景 先來觀察以下代碼: abstract class base { //do sth } class aClass extends base{ public stat...

    whjin 評論0 收藏0
  • Laravel 中的一個后期靜態(tài)綁定

    摘要:實驗一個抽象類,有個方法,通過延遲靜態(tài)綁定實例化并返回。這里如果把注釋打開,打印的就是重寫的值如果把抽象類改成普通類,改成的方式實例化,結(jié)果就不同了,打印的屬性都是各自類的屬性。 (原文地址,內(nèi)容以原文為準(zhǔn),可能修改或者補(bǔ)充:https://blog.tanteng.me/2017/...) 關(guān)于 PHP 的 new static 延遲靜態(tài)綁定,或者叫后期靜態(tài)綁定,在 Laravel...

    30e8336b8229 評論0 收藏0
  • PHP的self關(guān)鍵字

    摘要:有了的靜態(tài)延遲綁定功能,可以在運(yùn)行時動態(tài)確定歸屬的類。與是被討論最多,也是最容易引起誤用的組合。的用途看完與上述三個關(guān)鍵字的區(qū)別,的用途是不是呼之即出一句話總結(jié),那就是總是指向當(dāng)前類及類實例。 轉(zhuǎn)載請注明文章出處:https://tlanyan.me/self-in-php/ PHP群里有人詢問self關(guān)鍵字的用法,答案是比較明顯的:靜態(tài)成員函數(shù)內(nèi)不能用this調(diào)用非成員函數(shù),但可以用...

    morgan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<