PHP中物件導向之Static關鍵字詳解(程式碼範例)

2020-07-16 10:05:51

本文目標:

1、了解static的定義和作用

2、掌握static的用法和特點

我們學習一個知識,可以根據3w1h的思路來學習,稍微簡單的介紹一下3w1h

3w1h即

● what(是什麼)

● why(為什麼使用它,它有什麼作用)

● where(使用場景)

● how(具體怎麼使用)

(一)、static關鍵字的定義(what)

1、被static修飾的屬性或者方法,我們稱之為類的靜態成員

(二)、static關鍵字的作用(why)

1、讓類的所有範例都能共用某個屬性或者方法

(三)、static使用場景(where)

1、當希望某個方法或者屬效能被所有範例共用的時候,可以考慮static

(四)、static的使用詳解(how)

總結:

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.png

案例二:

實踐目標:

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();

?>

執行結果為:

2.png

案例三:

實踐目標:

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其它相關文章!