PHP Class self 與 static 異同與使用詳解
對于大多數(shù) PHPer 來說,self 與 static 兩個 PHP 關(guān)鍵詞都不算陌生。我們學(xué)會通過self::xxxx這種方式來調(diào)用當(dāng)前類的靜態(tài)屬性和方法。而 static 呢?想必很多人只知道它是用于定義一個靜態(tài)方法和類屬性關(guān)鍵詞。
這也是我之前的認(rèn)知。
現(xiàn)在我們來回顧一下這兩個關(guān)鍵詞的一些常見用法:
// self 用法 1 :調(diào)用靜態(tài)成員屬性
class Person
{
protected static $maxAddressCount = 5; // 收獲地址創(chuàng)建最大數(shù)量。
public function test()
{
echo self::$maxAddressCount;
}
}
$person = new Person();
$person->test();
// self 用法 2 :調(diào)用靜態(tài)方法
class Person
{
protected static $maxAddressCount = 5; // 收獲地址創(chuàng)建最大數(shù)量。
protected static function getMaxAddressCount()
{
return self::$maxAddressCount;
}
public function test()
{
echo self::getMaxAddressCount();
}
}
$person = new Person();
$person->test();
// self 用法 3 :創(chuàng)建一個當(dāng)前對象
// 單例示例
class Person
{
private static $instance = null;
private function __construct() {}
final public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new self;
}
return self::$instance;
}
public function test()
{
echo "hello world!";
}
}
$person = Person::getInstance();
$person->test();
關(guān)于 static 關(guān)鍵詞的常見用法也在上面 3 個示例中得到綜合體現(xiàn)
我深信上面的用法,任何一個入門的 PHPer 都是非常熟悉的?,F(xiàn)在我要講的是以下兩種方式:
new self() 與 new static() 的區(qū)別?
我相信很多人都知道new self()創(chuàng)建一個當(dāng)前類的對象,并不知道new static()也能創(chuàng)建一個當(dāng)前類的對象。
關(guān)于new static()這種用法呢,在官方文檔有說明。地址:https://www.php.net/manual/zh/language.oop5.late-static-bindings.php
PHP 官方把這種方式稱為:后期靜態(tài)綁定。
官方示例 1:
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
因?yàn)?Class B 繼承了 Class A。 A 與 B 都有一個靜態(tài)方法who()。此時通過B::test()的時候,調(diào)用的實(shí)際上是 Class A 的who()方法。
因?yàn)樽宇?Class B 的靜態(tài)方法who()屬于在 Class A 之后的子類里面才定義的。而 PHP 的默認(rèn)特性只允許調(diào)用最先定義的。
就這引出了后期靜態(tài)綁定的概念。
官方示例 2:
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // 后期靜態(tài)綁定從這里開始
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
我們把 Class A 里面的test()方法體的self更改為static之后,static 代表的永遠(yuǎn)是指向調(diào)用類。也就是說雖然在 Class A 父類里面定義的方法與子類有同名沖突的情況。但是,當(dāng)子類調(diào)用的時候,那么自動切換到子類的靜態(tài)同名方法。取決于調(diào)用者。
大家可以通過運(yùn)行以上兩個示例進(jìn)行理解。
之所以會有本篇小節(jié)內(nèi)容。是因?yàn)槲以趯?shí)際運(yùn)行當(dāng)中要繼承單例方法導(dǎo)致了這個問題。所以,才牽扯出這個特性。
到此這篇關(guān)于PHP Class self 與 static 異同與使用詳解的文章就介紹到這了,更多相關(guān)PHP Class self 與 static 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php實(shí)現(xiàn)把數(shù)組按指定的個數(shù)分隔
這篇文章主要介紹了php實(shí)現(xiàn)把數(shù)組按指定的個數(shù)分隔。需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02
PHP中preg_match函數(shù)正則匹配的字符串長度問題
這篇文章主要介紹了PHP中preg_match函數(shù)正則匹配的字符串長度問題,如果你也遇到了preg_match正則提取內(nèi)容時總是空白或提取不到的話,那就可能是遇到了這個問題啦,需要的朋友可以參考下2015-05-05
學(xué)習(xí)php設(shè)計模式 php實(shí)現(xiàn)備忘錄模式(Memento)
這篇文章主要介紹了php設(shè)計模式中的備忘錄模式,使用php實(shí)現(xiàn)備忘錄模式,感興趣的小伙伴們可以參考一下2015-12-12
給初學(xué)者的30條PHP最佳實(shí)踐(荒野無燈)
給初學(xué)者的30條PHP最佳實(shí)踐,需要的朋友可以參考下。2011-08-08

