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: 可以在物件被 echoCVT2HUGO: 僅會得到少數的資料。 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;
  }
}