iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0
Software Development

PHP 語法通關系列 第 24

Day24 類別與物件--魔術方法3、trait

這裡連結上一天說的內容,上一天沒有舉例,因為有點篇幅太多了,所以直接在今天的開頭寫個例子~~

<?php
//寫一個熊生活
class BearLife
{
    //成員屬性	
    public $type = 'Animal';
    public $memory = 'I\'m cute.';
    public $food = 'Fish';
    static public $habit = '看動漫';
    static public $color = 'Brown';
    //成員方法
    function playGame()
    {
        echo '玩~玩起來~好想玩桌遊><';
    }
    function seeMovie()
    {
        echo $this->food . '怕又愛看鬼片,嚇嚇自己身體壯';
    }
    static function slogan()
    {
        echo '能走就不要坐,能坐就不要躺......的相反 ';
    }
    static function music()
    {
        echo '超愛聽說唱!';
    }
    function test()
    {
        //兩種訪問方式
        //類名方式
        //echo BearLife::$habit;
        //self關鍵
        echo self::$habit;
    }
}

// echo BearLife::$color;
BearLife::music();
// BearLife::slogan();
$one = new BearLife;
	//BearLife::seeMovie();
	//$one->test();
	//調用靜態成員方法
	//$one->music();
	//無法調用
	//echo $one->habit;
	///echo BearLife::$habit;

其他尚未介紹到的魔術方法

  1. __sleep()

    • 觸發時機:物件進行串行化操作時自動觸發
    • 功能:指定需要串行化的成員屬性
    • 參數:無
    • 返回值:需要返回一個數組類型,每個元素都是需要串行化的成員屬性名
  2. __wakeup()

    • 觸發時機:物件反串行化操作時自動觸發
    • 功能:反串行化操作時修改部分成員屬性
    • 參數:無
    • 返回值:無
  3. __clone()

    • 觸發時機:對物件進行克隆操作時自動觸發
    • 功能:修改克隆之後的物件的部分成員屬性
    • 參數:無
    • 返回值:無
      12. 魔術方法 __autoload()
    • 觸發時機:當頁面中需要一個類,而該類不存在時自動觸發
    • 功能:實現類的自動加載
    • 參數:1個 不存在的類名
    • 返回值:沒有

trait的聲明及使用

  • trait聲明在名子前加trait關鍵字即可
    • 格式:trait 名字{
      //成員方法
      //成員屬性
      }
  1. trait裡面可以包含成員方法、成員屬性
  2. 支持關鍵字及其他修飾詞(final\static\abstract)
  3. trait不能通過new關鍵字來實例化,可以在類中通過use關鍵字後面加trait聲明的名字進行引入到當前類中
  4. use引入trait可以同時引入多個trait,使用英文逗號進行分割。
  5. 如果兩個trait都插入了一個同名的方法,如果沒有明確解決衝突將會產生錯誤,為了解決多個trait在同一個類中的命名衝突,需使用insteadof操作符,明確指定使用衝突方法中的哪一個
  6. as操作符可以為某個方法引入別名,但是as操作符不會對方法進行重命名,也不會影響其方法
  7. 單個Trait也可由多個trait組成。
  8. trait支持抽象的使用,也支持靜態方法的使用。
  9. trait會覆蓋調用類繼承的父類方法

命名空間

命名空間用來解決重名問題,將代碼劃分不同的區域,每個區域的常量、函數和類的名字互補影響

定義命名空間使用namespace關鍵字聲明:

  1. namepsance需要寫在PHP腳本的頂部,必須是第一個PHP指令,不要在namespance前面出現非PHP代碼,HTML或者空格。
  2. 從定義namespace出現開始,到下一個namespace出現之前或者腳本運行結束時都是一個獨立的空間。
    • 注意:如果為相同代碼定義多個命名空間是不可能的,只能被最後一個包含。
  3. 在同一文件中可以定義不同的命名空間
  4. define方式定義的常量歸公共空間所有,不歸命名空間所有。
    歸命名空間所有的常量只能用const來聲明。
    PS. 公共空間:
    • 沒有定義命名空間的函數、類、常量都是歸屬於公共空間
    • 公共空間的代碼被引入到某個命名空間下以後,該公共空間中的代碼不屬於任何命名空間內。

上一篇
Day23 類別與物件--繼承、常見關鍵字
下一篇
Day25 來人上菜! 給我來點Cookie and Session
系列文
PHP 語法通關30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言