本文目標(biāo):
1、了解static的定義和作用
2、掌握static的用法和特點(diǎn)
我們學(xué)習(xí)一個(gè)知識,可以根據(jù)3w1h的思路來學(xué)習(xí),稍微簡單的介紹一下3w1h
3w1h即
● what(是什么)
● why(為什么使用它,它有什么作用)
● where(使用場景)
● how(具體怎么使用)
(一)、static關(guān)鍵字的定義(what)
1、被static修飾的屬性或者方法,我們稱之為類的靜態(tài)成員
(二)、static關(guān)鍵字的作用(why)
1、讓類的所有實(shí)例都能共享某個(gè)屬性或者方法
(三)、static使用場景(where)
1、當(dāng)希望某個(gè)方法或者屬性能被所有實(shí)例共享的時(shí)候,可以考慮static
(四)、static的使用詳解(how)
總結(jié):
1、靜態(tài)屬性的定義 ,直接在屬性定義前加static 比如 static public $name ;
2、靜態(tài)屬性不能用類的實(shí)例去獲取,而是通過以下方式獲取:
● 類名::$屬性名稱
● 在類的內(nèi)部,可以通過self::$屬性名稱
3、靜態(tài)方法的定義,直接在方法定義前加static 比如static public function Hello(){ }
4、靜態(tài)方法不能用類的實(shí)例去獲取,而是通過以下方式獲取:
● 類名::方法名稱
● 在類的內(nèi)部,可以通過self::方法名稱
5、在php中,不能用static修飾類,只能修飾屬性或者方法
6、靜態(tài)方法內(nèi)部不能調(diào)用非靜態(tài)屬性,只能調(diào)用靜態(tài)屬性
7、靜態(tài)方法內(nèi)部不能調(diào)用非靜態(tài)方法,只能調(diào)用靜態(tài)方法
8、非靜態(tài)方法內(nèi)部,既可以調(diào)用非靜態(tài)屬性,也可以調(diào)用靜態(tài)屬性
9、非靜態(tài)方法內(nèi)部,既可以調(diào)用非靜態(tài)方法,也可以調(diào)用靜態(tài)方法
所有的總結(jié),都是實(shí)踐得來的,那么接下來,我們用實(shí)際代碼來演示上面的每一條總結(jié),看看他們到底是否正確
(四)、具體代碼
案例一:
實(shí)踐目標(biāo):
1、靜態(tài)屬性的定義 ,直接在屬性定義前加static 比如 static public $name ;
2、靜態(tài)屬性不能用類的實(shí)例去獲取,而是通過以下方式獲?。?/p>
● 類名::$屬性名稱
● 在類的內(nèi)部,可以通過self::$屬性名稱
<?php class Human{ static public $name = "人類";//靜態(tài)屬性的定義 public function say(){ echo "self::name = ".self::$name ."<br/>"; } } //輸出靜態(tài)屬性 echo "名稱為:".Human::$name."<br/>"; $human = new Human(); $human->say(); ?>
運(yùn)行結(jié)果為:
案例二:
實(shí)踐目標(biāo):
1、靜態(tài)方法的定義,直接在方法定義前加static 比如static public function Hello(){ }
2、靜態(tài)方法不能用類的實(shí)例去獲取,而是通過以下方式獲取:
● 類名::方法名稱
● 在類的內(nèi)部,可以通過self::方法名稱
<?php class Human{ public function __construct(){ self::staticFun1(); } static public function staticFun1(){ echo "我是靜態(tài)方法<br/>"; } } //輸出靜態(tài)方法 Human::staticFun1(); //運(yùn)行構(gòu)造函數(shù),看是否可以被正常調(diào)用 $human = new Human(); ?>
運(yùn)行結(jié)果為:
案例三:
實(shí)踐目標(biāo):
1、在php中,不能用static修飾類,只能修飾屬性或者方法
<?php static class Human{ } ?>
運(yùn)行結(jié)果為:
Parse error: syntax error, unexpected 'class' (T_CLASS), expecting :: (T_PAAMAYIM_NEKUDOTAYIM) in D:E-classclass-codeclassingindex.php on line 2
案例四:
實(shí)踐目標(biāo):
1、 靜態(tài)方法內(nèi)部不能調(diào)用非靜態(tài)屬性,只能調(diào)用靜態(tài)屬性
<?php class Human{ static public $staticName = "靜態(tài)屬性-人類"; public $commonName="非靜態(tài)屬性-人類"; //定義靜態(tài)方法 靜態(tài)方法調(diào)用非靜態(tài)屬性 static public function staticFun1(){ echo $this->commonName."<br/>"; } //測試靜態(tài)方法調(diào)用靜態(tài)屬性 static public function staticFun2(){ echo self::$staticName."<br/>"; } } Human::staticFun2();//OK Human::staticFun1();//not OK ?>
運(yùn)行結(jié)果為:
靜態(tài)屬性-人類
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
案例五:
實(shí)踐目標(biāo):
1、 靜態(tài)方法內(nèi)部不能調(diào)用非靜態(tài)方法,只能調(diào)用靜態(tài)方法
<?php class Human{ //定義靜態(tài)方法 //測試靜態(tài)方法調(diào)用 靜態(tài)方法 static public function staticFun1(){ self::staticFun2(); $this->commonFun1(); } static public function staticFun2(){ echo "我是靜態(tài)方法2<br/>"; } //普通方法 public function commonFun1(){ echo "我是普通方法1<br/>"; } } Human::staticFun1(); ?>
運(yùn)行結(jié)果為:
我是靜態(tài)方法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
案例六:
實(shí)踐目標(biāo):
1、非靜態(tài)方法內(nèi)部,既可以調(diào)用非靜態(tài)屬性也可以調(diào)用靜態(tài)屬性
<?php class Human{ static public $staticName = "靜態(tài)屬性-人類"; public $name = "非靜態(tài)屬性-人類"; ///普通方法 public function commonFun1(){ echo self::$staticName."<br/>"; echo $this->name."<br/>"; } } $human = new Human(); $human->commonFun1(); ?>
運(yùn)行結(jié)果為:
靜態(tài)屬性-人類
非靜態(tài)屬性-人類
案例七:
實(shí)踐目標(biāo):
1、非靜態(tài)方法內(nèi)部,既可以調(diào)用非靜態(tài)方法也可以調(diào)用靜態(tài)方法
<?php class Human{ ///普通方法 public function commonFun1(){ self::staticFun1(); $this->commonFun2(); } //測試靜態(tài)方法調(diào)用 靜態(tài)方法 static public function staticFun1(){ echo "我是靜態(tài)方法1<br/>"; } public function commonFun2(){ echo "我是普通方法2<br/>"; } } $human = new Human(); $human->commonFun1(); ?>
運(yùn)行結(jié)果為:
我是靜態(tài)方法1
我是普通方法2
(五)、學(xué)以致用
問題:
1、所有的NBA球員都有一個(gè)共同的聯(lián)盟總裁,David Stern(大衛(wèi)*斯特恩)
2、總裁換成了“Adam Silver” 怎么辦?
大家自己思考一下,再看后面的結(jié)果
…………………….
答案揭曉:
思路分析:
1、“換”是一個(gè)動(dòng)詞,換總裁,所以是一個(gè)方法,而總裁是一個(gè)數(shù)據(jù),所以是一個(gè)屬性
2、換總裁要達(dá)到一個(gè)目的就是,換了以后,這個(gè)對象仍然要被其他所有的NBA球員對象使用到
3、既然 總裁 (屬性) 要被所有的NBA球員對象 共享,那么我們就可以結(jié)合static的作用,將總裁屬性定義為靜態(tài)屬性
4、所以根據(jù)綜上所述,大概的思路就是定義一個(gè)NBA球員類,然后類里面主要有靜態(tài)屬性“總裁”和一個(gè) 換總裁 的方法
具體代碼如下:
<?php //Nba球員類 class NbaPlayer{ public $name = ""; //構(gòu)造函數(shù)初始化對象 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 "現(xiàn)在把喬丹總裁換成Adam Silver<br/>"; $jordon->changePresident("Adam Silver"); echo "輸出科比的總裁是否也和喬丹的一樣,科比總裁為:".NbaPlayer::$president."<br/>"; ?>
運(yùn)行結(jié)果為:
輸出他們目前共同的總裁,總裁為:David Stern
現(xiàn)在把喬丹總裁換成Adam Silver
輸出科比的總裁是否也和喬丹的一樣,科比總裁為:Adam Silver
總結(jié):
1、本文主要是講了static關(guān)鍵字的定義和特點(diǎn)
希望本文能給大家?guī)硪欢ǖ膸椭?,謝謝?。?!