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

PHP 魔術方法完整解析:__toString、__invoke、__call、__get 等 8 大方法

     編輯:PHP 相關知識

PHP 魔術方法完整解析

PHP 5 起引入魔術方法,雙底線 __ 開頭保留為魔術方法,建議避免自訂同名方法。

1. __toString() 與 __invoke()

<?php
class Magic {
    public function __toString() {
        return "hello world!";
    }
    public function __invoke($x) {
        echo "__invoke called with param $x\n";
    }
}
$obj = new Magic();
echo $obj;        // hello world! (物件當字串用)
$obj(10);         // __invoke called with param 10 (物件當函式呼叫)
?>

2. __call() 與 __callStatic()

<?php
class Magic {
    public function __call($name, $arguments) {
        echo "Calling $name with params: " . implode(", ", $arguments) . "\n";
    }
    public static function __callStatic($name, $arguments) {
        echo "Static call $name with params: " . implode(", ", $arguments) . "\n";
    }
}
$obj = new Magic();
$obj->run("para1", "para2");      // Calling run with params: para1, para2
Magic::staticMethod("arg1");       // Static call staticMethod with params: arg1
?>

3. __get() 與 __set()

<?php
class Magic {
    private $data = array();
    
    public function __get($name) {
        return isset($this->data[$name]) ? $this->data[$name] : "Property $name not found";
    }
    public function __set($name, $value) {
        $this->data[$name] = $value;
        echo "Setting $name to $value\n";
    }
}
$obj = new Magic();
echo $obj->name;    // Property name not found(觸發 __get)
$obj->age = 25;     // Setting age to 25(觸發 __set)
echo $obj->age;     // 25
?>

4. __isset() 與 __unset()

<?php
class Magic {
    private $data = array();
    public function __isset($name) {
        echo "__isset invoked for $name\n";
        return isset($this->data[$name]);
    }
    public function __unset($name) {
        echo "__unset invoked for $name\n";
        unset($this->data[$name]);
    }
}
$obj = new Magic();
isset($obj->name);  // __isset invoked for name
unset($obj->name);  // __unset invoked for name
?>

魔術方法對照表

方法觸發時機回傳值
__toString物件當字串使用string
__invoke物件當函式呼叫任意
__call呼叫不存在的實例方法任意
__callStatic呼叫不存在的靜態方法任意
__get讀取不可存取屬性任意
__set寫入不可存取屬性void
__issetisset()/empty() 檢查不可存取屬性bool
__unsetunset() 不可存取屬性void

應用場景

  • 資料模型屬性代理(__get/__set)
  • 動態方法派發(__call)
  • 領域特定語言(DSL)建構
  • 除錯與日誌記錄
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved