PHP 常見魔術方法簡介
這裡針對一些比較常見的魔術方法進行說明:
__construct
首先,提到兩個魔術大家都會常用到: __construct
CVT2HUGO: 與 __destruct
CVT2HUGO: 會在物件被實例化時觸發,__destruct
CVT2HUGO: 會在物件被銷毀時觸發
<?php
class User
{
public $name;
//物件初始化時,呼叫建構式
public function __construct($name) {
$this->name = $name;
}
//物件被摧毀時呼叫解構式
public function __desctuct() {
}
}
__autoload
在建構系統時,將你的架構適當的整理好,用有系統的方式命名檔案及資料夾,
透過這種可預測的資料結構,就能搭配 __autoload
CVT2HUGO: 自動加載
CVT2HUGO: 來編寫自動加載規則
<?php
function __autoload($className) {
include strotolower($className).".php";
}
__clone
在 PHP 有一個 clone 的方式,可以用來將物件複製出副本。
魔術方法 __clone
可以在這裡面宣告物件被克隆時,要做什麼?或者進行禁制克隆:
CVT2HUGO: 可以在物件被複製時執行。
<?php
class User
{
..
function __clone(){
print_r("物件被克隆");
}
}
###__get
PHP 所提供的魔術方法 __get
CVT2HUGO: 和 __set
CVT2HUGO: 和 __set
當我們 讀取/寫入 一個物件不存在的屬性時,他們就會被呼叫。
以下是一個範例:
CVT2HUGO: 可在呼叫不存在的屬性時被呼叫,其中 ```__get
<?php
class User{
protected $data = array();
public function __get($property){
return $this->data[$property];
}
public function __set($property, $value){
$this->data[$property] = $value;
return true;
}
}
CVT2HUGO: 主要負責取值,
__set```負責設值。
當我們讀取或寫入不存在的數性,就會觸發:
<?php
$user = new User();
$user->name = "Adam";
echo $user->name;
__call
使用 __call
CVT2HUGO: 與 __callStatic
CVT2HUGO: 可以針對 呼叫不存在的方法時,被呼叫。__callStatic
例如,我們在新舊系統,方法名稱不同時,就可進行兼容設置:
CVT2HUGO: 可以針對 呼叫不存在的靜態方法時,被呼叫。
<?php
class autoCall
{
public $name;
public function __construct($name='index') {
$this->name = $name;
}
public function profile($param){
//設置個人資料
....
return true;
}
public function __call($name, $param) {
//重構系統,針對就方法進行轉倒
if($name=='myProfile') {
return $this->profile($param);
}
return json_encode(['error'=>1, 'message'=>'Failed! Call method name '.$name.' is not isset']);
}
}
__toString
透過 __toString
在預設情況下,對物件執行 echo
CVT2HUGO: 可以在物件被
echo
CVT2HUGO:
僅會得到少數的資料。
CVT2HUGO: 時被執行,可以將物件的訊息打印出來。
因此,可以透過__toString
CVT2HUGO: 來補充一些資訊:
<?php
class User
{
public $name;
public function __construct($name) {
$this->name = $name;
}
...
public function __toString() {
return "Class ".$this->name.' name value is :'.$this->name;
}
}