本文小編為大家詳細介紹“php的static靜態方法怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“php的static靜態方法怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
php static靜態方法中的“靜態”指的是無需對類進行實例化,就可以直接調用這些屬性和方法;而static就是一個關鍵字,用來修飾類的屬性及方法,其使用語法如“class Foo {public static $my_static = 'hello';}”。
PHP static靜態詳解
PHP 類屬性和方法都需要在類實例化后才能調用(常量屬性除外),但是,PHP 還提供了靜態屬性和靜態方法,所謂「靜態」指的是無需對類進行實例化,就可以直接調用這些屬性和方法。靜態類不是不可以實例化,而是不需要實例化就可以用。
用static關鍵字來修飾類的屬性、方法,稱這些屬性、方法為靜態屬性、靜態方法。
語法:
static 屬性名
實例:
<?php class Foo { public static $my_static = 'hello'; } ?>
語法:
static function 方法名{ //代碼 }
實例:
<?php class Foo { public static function staticValue() { return 'hello'; } } ?>
注:靜態屬性和方法與對象屬性和方法一樣,支持設置 private
、protected
、public
三種可見性級別。
通過 類名::屬性/方法
的方式調用。
<?php class Mystatic { public static $staticvalue = 'zhangsan'; public static function staticMethod() { $a = 'hello'; return $a; } } echo '$staticvalue: '.Mystatic::$staticvalue.PHP_EOL; echo '$a: '.Mystatic::staticMethod().PHP_EOL; ?>
注:預定義常量 PHP_EOL
表示系統換行符。
結果:
$staticvalue: zhangsan $a: hello
通過 對象名::屬性/方法
的方式調用。
<?php class Mystatic { public static $staticvalue = 'zhangsan'; public static function staticMethod() { $a = 'hello'; return $a; } } $obj = new Mystatic(); echo '$staticvalue: '.$obj::$staticvalue.PHP_EOL; echo '$a: '.$obj::staticMethod(); ?>
結果:
$staticvalue: zhangsan $a: hello
通過對象名 -> 方法
調用、對象名 -> 屬性
會失敗。
<?php error_reporting(0); class Mystatic { public static $staticvalue = 'zhangsan'; public static function staticMethod() { $a = 'hello'; return $a; } } $obj = new Mystatic(); echo '$staticvalue: '.$obj -> staticvalue.PHP_EOL; echo '$a: '.$obj -> staticMethod(); ?>
結果:
$staticvalue: $a: hello
通過 self::屬性/方法
的方式調用,self 指向當前類,就像 $this 指向當前對象一樣;而在沒有實例化的情況下,$this
指針指向的是空對象,所以不能動過它引用靜態屬性和方法。
<?php class Mystatic { public static $staticvalue = 'zhangsan'; public static function staticMethod() { $a = 'hello'; return $a; } public function noStatic(){ echo '$staticvalue: '.self::$staticvalue.PHP_EOL; echo '$a: '.self::staticMethod(); } } $obj = new Mystatic(); $obj -> noStatic(); ?>
結果:
$staticvalue: zhangsan $a: hello
與在非靜態方法中調用靜態屬性/方法一樣。
<?php class Mystatic { public static $staticvalue = 'zhangsan'; public static function staticMethod1() { $a = 'hello'; return $a; } public static function staticMethod2(){ echo '$staticvalue: '.self::$staticvalue.PHP_EOL; echo '$a: '.self::staticMethod1().PHP_EOL; } } Mystatic::staticMethod2(); $obj = new Mystatic(); $obj -> staticMethod2(); ?>
結果:
$staticvalue: zhangsan $a: hello $staticvalue: zhangsan $a: hello
如果在一個類中調用其他類的靜態屬性和方法,需要通過 完整類名::
進行引用。
<?php class Mystatic1 { public static $staticvalue1 = 'xiaomin'; } class Mystatic2 { public static $staticvalue2 = 'zhangsan'; public static function staticMethod() { echo '$staticvalue1: '.Mystatic1::$staticvalue1.PHP_EOL; echo '$staticvalue2: '.self::$staticvalue2.PHP_EOL; } } Mystatic2::staticMethod(); $obj = new Mystatic2(); $obj -> staticMethod(); ?>
結果:
$staticvalue1: xiaomin $staticvalue2: zhangsan $staticvalue1: xiaomin $staticvalue2: zhangsan
private
、protected
可見性級別的靜態屬性/方法由于private
、protected
屬性的限制只在類內調用,想在類外調用,需為外部提供一個public
的方法,方法訪問private
、protected
屬性。術語:類對外提供接口。
<?php class Mystatic { public static $staticvalue1 = 'zhangsan'; private static $staticvalue2 = 20; protected static $staticvalue3 = 'student'; private static function staticMethod() { $a = 'hello'; return $a; } public function port1() { echo '$staticvalue1: '.self::$staticvalue1.PHP_EOL; echo '$staticvalue2: '.self::$staticvalue2.PHP_EOL; echo '$staticvalue3: '.self::$staticvalue3.PHP_EOL; echo '$a: '.self::staticMethod().PHP_EOL; } public static function port2() { echo '$staticvalue1: '.self::$staticvalue1.PHP_EOL; echo '$staticvalue2: '.self::$staticvalue2.PHP_EOL; echo '$staticvalue3: '.self::$staticvalue3.PHP_EOL; echo '$a: '.self::staticMethod().PHP_EOL; } } $obj = new Mystatic(); $obj -> port1(); echo "\r\n"; Mystatic::port2(); ?>
結果:
$staticvalue1: zhangsan $staticvalue2: 20 $staticvalue3: student $a: hello $staticvalue1: zhangsan $staticvalue2: 20 $staticvalue3: student $a: hello
在實際應用中會有一個類的多個對象,可能會共享一份數據。類常量和靜態屬性都可以實現。靜態屬性與類常量相似(相同),唯一的區分是類常量不可以更改,靜態屬性可以更改。訪問方法是一樣的,都可以使用::
訪問。 靜態屬性需要加$,常量名前沒有$,所以訪問類常量時根本不需要加。
<?php class Myconst { const A = 1234; } $obj1 = new Myconst(); echo 'A: '.$obj1::A.PHP_EOL; $obj1->A='aaa'; //$obj1::A='aaa';會報錯 echo "\r\n"; $obj2 = new Myconst(); echo 'A: '.$obj2::A.PHP_EOL; ?>
結果:
A: 1234 A: 1234
<?php class Mystatic { public static $A = 1234; } echo '$A: '.Mystatic::$A.PHP_EOL; Mystatic::$A = 6666; echo '$A: '.Mystatic::$A.PHP_EOL; $obj1 = new Mystatic(); echo '$A: '.$obj1::$A.PHP_EOL; Mystatic::$A = 5555; $obj2 = new Mystatic(); echo '$A: '.$obj2::$A.PHP_EOL; echo '$A: '.$obj1::$A.PHP_EOL; ?>
登錄后復制
結果:
$A: 1234 $A: 6666 $A: 6666 $A: 5555 $A: 5555
和非靜態屬性/方法一樣,靜態屬性和方法也可以被子類繼承,靜態屬性和方法還可以被子類重寫。
子類可以重寫父類的靜態成員變量, 但父類的靜態變量依然存在, 這兩個靜態成員變量是獨立的. 會根據調用的類名分別進行訪問。
<?php class Mystatic { static public $a; //定義一個靜態變量 static function test() //定義靜態方法來操作并輸出靜態變量 { self::$a++; return self::$a; } } class Mystatic2 extends Mystatic //定義一個子類 { static function test() //定義子類的靜態方法 { self::$a++; //訪問并操作父類的靜態變量 return self::$a; } } $obj1=new Mystatic; //新建父類對象 echo '此時$a的值為: '.$obj1->test().PHP_EOL; //通過對象調用靜態方法test,靜態屬性$a的值+1 $obj2=new Mystatic; //新建另一個父類對象 echo '此時$a的值為: '.$obj2->test().PHP_EOL; //新父類對象調用靜態方法test,靜態屬性$a的值+1+1 $obj3=new Mystatic2; //新建子類對象 echo '此時$a的值為: '.$obj3->test().PHP_EOL; //子類對象調用同名靜態方法test, 靜態屬性$a的值+1+1+1 echo Mystatic::$a.PHP_EOL; //通過父類::直接訪問靜態成員$a變量 echo $obj1::$a.PHP_EOL; //通過對象名::可以直接訪問靜態成員$a變量 ?>
結果:
此時$a的值為: 1 此時$a的值為: 2 此時$a的值為: 3 3 3
子類可以重寫父類的靜態方法。
<?php class Mystatic1 { public static function getclassName() { return __CLASS__; } public static function whoclassName() { echo self::getclassName().PHP_EOL; } } class Mystatic2 extends Mystatic1{ public static function getclassName() { return __CLASS__; } } echo Mystatic1::getclassName().PHP_EOL; echo Mystatic2::getclassName().PHP_EOL; ?>
通過 __CLASS__
可以獲取當前類的類名,我們分別調用兩個類的 getClassName
方法:
結果:
Mystatic1 Mystatic2
說明子類重寫了父類的同名靜態方法,同樣我們在子類上也可以調用父類中的 whoclassName
方法:
<?php class Mystatic1 { public static function getclassName() { return __CLASS__; } public static function whoclassName() { echo self::getclassName().PHP_EOL; } } class Mystatic2 extends Mystatic1{ public static function getclassName() { return __CLASS__; } } echo Mystatic1::whoclassName(); echo Mystatic2::whoclassName(); ?>
結果:
Mystatic1 Mystatic1
為什么第二個打印的結果是父類名 Mystatic1
而不是子類名 Mystatic2
?這是因為, $this
指針始終指向持有它的引用對象,而self
指向的是定義時持有它的類
而不是調用時的類
,為了解決這個問題,從 PHP 5.3 開始,新增了一個叫做延遲靜態綁定的特性。
延遲靜態綁定(Late Static Bindings)針對的是靜態方法的調用,使用該特性時不再通過 self::
引用靜態方法,而是通過 static::
,如果是在定義它的類中調用,則指向當前類
,此時和 self
功能一樣,如果是在子類或者其他類中調用,則指向調用該方法所在的類
。
<?php class Mystatic1 { public static function getclassName() { return __CLASS__; } public static function whoclassName() { echo static::getclassName().PHP_EOL; } } class Mystatic2 extends Mystatic1{ //self改為static public static function getclassName() { return __CLASS__; } } echo Mystatic1::whoclassName(); echo Mystatic2::whoclassName(); ?>
結果:
Mystatic1 Mystatic2
表明后期靜態綁定生效,即 static
指向的是調用它的方法所在的類,而不是定義時,所以稱之為延遲靜態綁定。
此外,還可以通過 static::class
來指向當前調用類的類名,例如我們可以通過它來替代 __CLASS__
,這樣上述子類就沒有必要重寫 getClassName
方法了:
<?php class Mystatic1 { public static function getclassName() { return static::class; } public static function whoclassName() { echo static::getclassName().PHP_EOL; } } class Mystatic2 extends Mystatic1{} echo Mystatic1::getclassName().PHP_EOL; echo Mystatic2::getclassName().PHP_EOL; echo Mystatic1::whoclassName(); echo Mystatic2::whoclassName(); ?>
結果:
Mystatic1 Mystatic2 Mystatic1 Mystatic2
同理,self::class
則始終指向的是定義它的類。
靜態屬性和方法可以直接通過類引用,所以又被稱作類屬性和類方法。非靜態屬性和非靜態方法需要實例化后通過對象引用,因此被稱作對象屬性和對象方法。
靜態屬性保存在類空間,非靜態屬性保存在對象空間。非靜態方法可以訪問類中的任何成員(包括靜態),靜態方法只能訪問類中的靜態成員。
靜態方法可以直接調用,類名調用和對象調用(類名或self::
調用),但是非靜態方法只能通過對象調用(對象名或$this->
調用)。
一個類的所有實例對象,共用類中的靜態屬性。如果修改了這個類靜態屬性,那么這個類的所有對象都能訪問到這個新值。
靜態方法和屬性的生命周期跟相應的類一樣長,靜態方法和靜態屬性會隨著類的定義而被分配和裝載入內存中。一直到線程結束,靜態屬性和方法才會被銷毀。 非靜態方法和屬性的生命周期和類的實例化對象一樣長,只有當類實例化了一個對象,非靜態方法和屬性才會被創建,而當這個對象被銷毀時,非靜態方法也馬上被銷毀。靜態方法和靜態變量創建后始終使用同一塊內存,而使用實例的方式會創建多個內存。但靜態方法效率上要比實例化高,靜態方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。
靜態方法最適合工具類中方法的定義;比如文件操作,日期處理方法等.
靜態變量適合全局變量的定義.
php是一個嵌套的縮寫名稱,是英文超級文本預處理語言,它的語法混合了C、Java、Perl以及php自創新的語法,主要用來做網站開發,許多小型網站都用php開發,因為php是開源的,從而使得php經久不衰。
讀到這里,這篇“php的static靜態方法怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。