關於網路那些事...

網路行銷,SEO,網路趨勢,教學文章,網頁設計,生活時事

介紹 PHP 常見魔術方法

PHP 常見魔術方法簡介

這裡針對一些比較常見的魔術方法進行說明:

__construct__destruct

首先,提到兩個魔術大家都會常用到: __construct 會在物件被實例化時觸發,__destruct 會在物件被銷毀時觸發

<?php
  class User
{
  public $name;
  //物件初始化時,呼叫建構式
  public function __construct($name) {
    $this->name = $name;
  }
  //物件被摧毀時呼叫解構式
  public function __desctuct() {
    
  }
}

__autoload 自動加載

在建構系統時,將你的架構適當的整理好,用有系統的方式命名檔案及資料夾,

透過這種可預測的資料結構,就能搭配 __autoload 來編寫自動加載規則

<?php
  function __autoload($className) {
      include strotolower($className).".php";
    }

__clone

在 PHP 有一個 clone 的方式,可以用來將物件複製出副本。

魔術方法 __clone 可以在物件被複製時執行。

可以在這裡面宣告物件被克隆時,要做什麼?或者進行禁制克隆:

<?php 
  class User
{
  ..
    function __clone(){
        print_r("物件被克隆");
    }
}

__get__set

PHP 所提供的魔術方法 __get__set 可在呼叫不存在的屬性時被呼叫,其中 __get主要負責取值,__set負責設值。

當我們 讀取/寫入 一個物件不存在的屬性時,他們就會被呼叫。

以下是一個範例:

<?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;
    }
  }

當我們讀取或寫入不存在的數性,就會觸發:

<?php
  $user = new User();
    $user->name = "Adam";
    echo $user->name;

__call__callStatic

使用 __call 可以針對 呼叫不存在的方法時,被呼叫。__callStatic 可以針對 呼叫不存在的靜態方法時,被呼叫。

例如,我們在新舊系統,方法名稱不同時,就可進行兼容設置:

<?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 時被執行,可以將物件的訊息打印出來。

在預設情況下,對物件執行 echo 僅會得到少數的資料。

因此,可以透過__toString 來補充一些資訊:

<?php 
  class User
{
  public $name;
  
  public function __construct($name) {
    $this->name = $name;
  }
  ...
    public function __toString() {
    return "Class ".$this->name.' name value is :'.$this->name;
  }
}

最後,如果你喜歡這篇文章,請幫忙點個讚



最新文章推薦