7.11 重載

PHP中的重載是指 動態的創建屬性或方法,傳統的重載是指定義多個參數不同的同名方法。

當實例調用對象中不存在的屬性或方法時,PHP會先去該對象中尋找對應的魔術方法進行處理,如果處理不成功,則拋出異常,而此時的魔術方法,其實就是重載方法。

需要注意的是,這些重載方法必須是公開的,而且參數不能為引用傳遞。

最基本的例子是對象屬性的讀取和賦值。

__set:當給對象中不存在的屬性進行賦值時調用
__get:當訪問對象中不存在的屬性時進行調用

// 定義類
class Example{
    // 公共屬性
    public $property = [];
    // 設置屬性
    public function __set($name, $value){
        echo "<p>__set: </p>";
        $this->property[$name] = $value;
    }
    // 獲取屬性
    public function __get($name){
        echo "<p>__get: </p>";
        return isset($this->property[$name]) ? $this->property[$name] : NULL;
    }
}

// 實例化
$exam = new Example();
// 打印屬性、返回 NULL
echo $exam->name . "<br />";
// 屬性賦值
$exam->name = 10;
// 訪問屬性、返回 10
echo $exam->name . "<br />";


/*
最終輸出
__get:


__set:

__get:

10
*/

對一個屬性進行判斷的時候,也可以使用重載方法。

__isset:當對一個不存在的屬性進行 isset()判斷時調用
__empty:同上,但最好配合__get一起使用

// 定義類
class Example{
    public $property = ['foo' => 123, 'bar' => 'abc'];
    public function __get($name){
        echo "<p>__get: $name</p>";
        return $this->property[$name] ? $this->property[$name] : NULL;
    }
    public function __isset($name){
        echo "<p>__isset: $name</p>";
        return isset($this->property[$name]);
    }
}

// 實例化
$exam = new Example();
// isset
var_dump(isset($exam->property));
var_dump(isset($exam->foo));
var_dump(isset($exam->abc));
echo "<hr />";
// empty
var_dump(empty($exam->property));
var_dump(empty($exam->bar));
var_dump(empty($exam->abc));

/*
最終輸出:
bool(true)
__isset: foo

bool(true)
__isset: abc

bool(false)



bool(false)
__isset: bar

__get: bar

bool(false)
__isset: abc

bool(true)
*/

刪除一個屬性的時候

__unset:試圖刪除一個不存在的屬性時調用

// 定義類
class Example{
    public $property = ['foo' => 123, 'bar' => 'abc'];
    public function __unset($name){
        echo "<p>__unset: $name</p>";
        unset($this->property[$name]);
    }
}

// 實例化
$exam = new Example();
// unset
unset($exam->foo);
unset($exam->abc);
// 結果
var_dump($exam->property);


/*
最終輸出:
__unset: foo

__unset: abc

array(1) { ["bar"]=> string(3) "abc" }
*/

類的方法也可以通過重載來訪問

// 定義類
class Example{
    // 普通方法重載
    public function __call(string $name, array $arguments){
        echo "function $name(): <br />";
        var_dump($arguments);
        echo "<br />";
    }
    // 靜態方法重載
    public static function __callStatic(string $name, array $arguments){
        echo "static function $name(): <br />";
        var_dump($arguments);
        echo "<br />";
    }
}

// 實例化
$exam = new Example();

// 調用不存在的普通方法
$exam->fn1(123, '456');

// 調用不存在的靜態方法
Example::fn2(123, '456');
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、數組 1、數組定義 數組就是一個鍵值對組成的語言結構,鍵類似于酒店的房間號,值類似于酒店房間里存儲的東西。 $...
    空谷悠閱讀 815評論 4 11
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,184評論 6 13
  • 一、數組 1、數組的聲明:$arr = array(); 2、數組的初始化:PHP有兩種數組:索引數組、關聯數組。...
    yzw12138閱讀 1,225評論 2 2
  • 托爾斯泰說過,愛孩子是老母雞都會做的事,關鍵是如何教育。 每次帶崽崽出去,我總是給他一臺平板電腦,...
    9f867c0ed88a閱讀 319評論 0 0
  • 其實有時間還是需要多補充下基礎知識的,畢竟步子跨太大會扯到襠。 - load Invoked whenever a...
    KentonYu閱讀 2,643評論 3 12