1、了解static的定義和作用
2、掌握static的用法和特點
我們學習一個知識,可以根據3w1h的思路來學習,稍微簡單的介紹一下3w1h
3w1h即
● what(是什麼)
● why(為什麼使用它,它有什麼作用)
● where(使用場景)
● how(具體怎麼使用)
1、被static修飾的屬性或者方法,我們稱之為類的靜態成員
1、讓類的所有範例都能共用某個屬性或者方法
1、當希望某個方法或者屬效能被所有範例共用的時候,可以考慮static
總結:
1、靜態屬性的定義 ,直接在屬性定義前加static 比如 static public $name ;
2、靜態屬性不能用類的範例去獲取,而是通過以下方式獲取:
● 類名::$屬性名稱
● 在類的內部,可以通過self::$屬性名稱
3、靜態方法的定義,直接在方法定義前加static 比如static public function Hello(){ }
4、靜態方法不能用類的範例去獲取,而是通過以下方式獲取:
● 類名::方法名稱
● 在類的內部,可以通過self::方法名稱
5、在php中,不能用static修飾類,只能修飾屬性或者方法
6、靜態方法內部不能呼叫非靜態屬性,只能呼叫靜態屬性
7、靜態方法內部不能呼叫非靜態方法,只能呼叫靜態方法
8、非靜態方法內部,既可以呼叫非靜態屬性,也可以呼叫靜態屬性
9、非靜態方法內部,既可以呼叫非靜態方法,也可以呼叫靜態方法
所有的總結,都是實踐得來的,那麼接下來,我們用實際程式碼來演示上面的每一條總結,看看他們到底是否正確
案例一:
實踐目標:
1、靜態屬性的定義 ,直接在屬性定義前加static 比如 static public $name ;
2、靜態屬性不能用類的範例去獲取,而是通過以下方式獲取:
● 類名::$屬性名稱
● 在類的內部,可以通過self::$屬性名稱
<?php class Human{ static public $name = "人類";//靜態屬性的定義 public function say(){ echo "self::name = ".self::$name ."<br/>"; } } //輸出靜態屬性 echo "名稱為:".Human::$name."<br/>"; $human = new Human(); $human->say(); ?>
執行結果為:
案例二:
實踐目標:
1、靜態方法的定義,直接在方法定義前加static 比如static public function Hello(){ }
2、靜態方法不能用類的範例去獲取,而是通過以下方式獲取:
● 類名::方法名稱
● 在類的內部,可以通過self::方法名稱
<?php class Human{ public function __construct(){ self::staticFun1(); } static public function staticFun1(){ echo "我是靜態方法<br/>"; } } //輸出靜態方法 Human::staticFun1(); //執行建構函式,看是否可以被正常呼叫 $human = new Human(); ?>
執行結果為:
案例三:
實踐目標:
1、在php中,不能用static修飾類,只能修飾屬性或者方法
<?php static class Human{ } ?>
執行結果為:
Parse error: syntax error, unexpected 'class' (T_CLASS), expecting :: (T_PAAMAYIM_NEKUDOTAYIM) in D:E-classclass-codeclassingindex.php on line 2
案例四:
實踐目標:
1、 靜態方法內部不能呼叫非靜態屬性,只能呼叫靜態屬性
<?php class Human{ static public $staticName = "靜態屬性-人類"; public $commonName="非靜態屬性-人類"; //定義靜態方法 靜態方法呼叫非靜態屬性 static public function staticFun1(){ echo $this->commonName."<br/>"; } //測試靜態方法呼叫靜態屬性 static public function staticFun2(){ echo self::$staticName."<br/>"; } } Human::staticFun2();//OK Human::staticFun1();//not OK ?>
執行結果為:
靜態屬性-人類
Fatal error: Uncaught Error: Using $this when not in object context in D:E-classclass-codeclassingindex.php:8 Stack trace: #0 D:E-classclass-codeclassingindex.php(18): Human::staticFun1() #1 {main} thrown in D:E-classclass-codeclassingindex.php on line 8
案例五:
實踐目標:
1、 靜態方法內部不能呼叫非靜態方法,只能呼叫靜態方法
<?php class Human{ //定義靜態方法 //測試靜態方法呼叫 靜態方法 static public function staticFun1(){ self::staticFun2(); $this->commonFun1(); } static public function staticFun2(){ echo "我是靜態方法2<br/>"; } //普通方法 public function commonFun1(){ echo "我是普通方法1<br/>"; } } Human::staticFun1(); ?>
執行結果為:
我是靜態方法2
Fatal error: Uncaught Error: Using $this when not in object context in D:E-classclass-codeclassingindex.php:8 Stack trace: #0 D:E-classclass-codeclassingindex.php(20): Human::staticFun1() #1 {main} thrown in D:E-classclass-codeclassingindex.php on line 8
案例六:
實踐目標:
1、非靜態方法內部,既可以呼叫非靜態屬性也可以呼叫靜態屬性
<?php class Human{ static public $staticName = "靜態屬性-人類"; public $name = "非靜態屬性-人類"; ///普通方法 public function commonFun1(){ echo self::$staticName."<br/>"; echo $this->name."<br/>"; } } $human = new Human(); $human->commonFun1(); ?>
執行結果為:
靜態屬性-人類
非靜態屬性-人類
案例七:
實踐目標:
1、非靜態方法內部,既可以呼叫非靜態方法也可以呼叫靜態方法
<?php class Human{ ///普通方法 public function commonFun1(){ self::staticFun1(); $this->commonFun2(); } //測試靜態方法呼叫 靜態方法 static public function staticFun1(){ echo "我是靜態方法1<br/>"; } public function commonFun2(){ echo "我是普通方法2<br/>"; } } $human = new Human(); $human->commonFun1(); ?>
執行結果為:
我是靜態方法1
我是普通方法2
問題:
1、所有的NBA球員都有一個共同的聯盟總裁,David Stern(大衛*斯特恩)
2、總裁換成了「Adam Silver」 怎麼辦?
大家自己思考一下,再看後面的結果
.........................
答案揭曉:
思路分析:
1、「換」是一個動詞,換總裁,所以是一個方法,而總裁是一個資料,所以是一個屬性
2、換總裁要達到一個目的就是,換了以後,這個物件仍然要被其他所有的NBA球員物件使用到
3、既然 總裁 (屬性) 要被所有的NBA球員物件 共用,那麼我們就可以結合static的作用,將總裁屬性定義為靜態屬性
4、所以根據綜上所述,大概的思路就是定義一個NBA球員類,然後類裡面主要有靜態屬性「總裁」和一個 換總裁 的方法
具體程式碼如下:
<?php //Nba球員類 class NbaPlayer{ public $name = ""; //建構函式初始化物件 public function __construct($name){ $this->name = $name; } //總裁 static public $president = "David Stern"; //換總裁方法 public function changePresident($name){ self::$president = $name; } } $jordon = new NbaPlayer("喬丹"); $kebo = new NbaPlayer("科比"); echo "輸出他們目前共同的總裁,總裁為:".NbaPlayer::$president."<br/>"; echo "現在把喬丹總裁換成Adam Silver<br/>"; $jordon->changePresident("Adam Silver"); echo "輸出科比的總裁是否也和喬丹的一樣,科比總裁為:".NbaPlayer::$president."<br/>"; ?>
執行結果為:
輸出他們目前共同的總裁,總裁為:David Stern
現在把喬丹總裁換成Adam Silver
輸出科比的總裁是否也和喬丹的一樣,科比總裁為:Adam Silver
總結:
1、本文主要是講了static關鍵字的定義和特點
希望本文能給大家帶來一定的幫助,謝謝!!!
以上就是PHP中物件導向之Static關鍵字詳解(程式碼範例)的詳細內容,更多請關注TW511.COM其它相關文章!