首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 5 多載機制:__get、__set、__call 實現屬性與方法攔截

     編輯:PHP 綜合知識

PHP 4 vs PHP 5 多載差異

PHP 4 僅支援對外部物件模型(Java/COM)的映射多載。PHP 5 引入使用者層級多載,允許自定義屬性存取與方法呼叫行為。

三大魔術方法

方法觸發時機參數回傳值
__get($name)讀取不可見/不存在屬性屬性名稱屬性值(或 null)
__set($name, $value)寫入不可見/不存在屬性屬性名稱、值無
__call($name, $args)呼叫不可見/不存在方法方法名稱、參數陣列方法回傳值

完整範例:動態屬性容器

<?php
class Overloader {
    private $properties = array();

    function __get($property_name) {
        if (isset($this->properties[$property_name])) {
            return $this->properties[$property_name];
        }
        return NULL;
    }

    function __set($property_name, $value) {
        $this->properties[$property_name] = $value;
    }

    function __call($function_name, $args) {
        print("Invoking $function_name()<br>\n");
        print("Arguments: ");
        print_r($args);
        return TRUE;
    }
}

$o = new Overloader();

// 觸發 __set()
$o->dynaProp = "Dynamic Content";

// 觸發 __get()
print($o->dynaProp . "<br>\n");

// 觸發 __call()
$o->dynaMethod("Leon", "Zeev");
?>

輸出結果

Dynamic Content
Invoking dynaMethod()
Arguments: Array ( [0] => Leon [1] => Zeev )

進階應用場景

  • 屬性驗證/過濾:__set 中檢查型別、長度、權限,拒絕非法寫入
  • 虛擬屬性:__get 動態計算衍生屬性(如 $user->fullName 由 first+last 組合)
  • 資料庫 ORM 映射:__get/__set 透明映射資料表欄位,__call 代理查詢方法
  • 遠端代理:__call 將方法呼叫轉發至 SOAP/REST/XML-RPC 服務
  • 除錯/日誌:記錄所有動態存取與呼叫

注意事項

  • 多載僅對不可見屬性/方法生效(private、protected 或不存在)
  • __get 必須有回傳值,否則無法用於表達式中
  • __call 參數 $args 為數值索引陣列,非關聯陣列
  • 遞迴呼叫風險:__get/__set 內部存取同名屬性會無限遞迴,需用內部儲存陣列(如範例 $properties)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved