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

PHP 魔術方法大全實戰:__get/__set、__call/__callStatic、__toString、__invoke 完整範例

     編輯:PHP 綜合知識

1. __get / __set:屬性存取攔截

class Object {
    protected $data = [];
    public function __set($key, $value) {
        var_dump(__METHOD__);
        $this->data[$key] = $value;
    }
    public function __get($key) {
        var_dump(__METHOD__);
        return $this->data[$key] ?? null;
    }
}

$obj = new Object();
$obj->title = 'hello'; // 觸發 __set
echo $obj->title;      // 觸發 __get

輸出: Object::__set、Object::__get、hello

2. __call / __callStatic:方法呼叫攔截

class Object {
    public function __call($method, $args) {
        var_dump($method, $args);
        return "magic function\n";
    }
    static function __callStatic($method, $args) {
        var_dump($method, $args);
        return "static magic\n";
    }
}

$obj = new Object();
echo $obj->test('hello', 123);      // 觸發 __call
echo Object::test('hello', 1234);   // 觸發 __callStatic

輸出: 方法名、參數陣列、返回字串

3. __toString:物件轉字串

class Object {
    public function __toString() {
        return __CLASS__;
    }
}
$obj = new Object();
echo $obj; // 輸出 "Object"(否則會報 Catchable fatal error)

4. __invoke:物件當函數呼叫

class Object {
    public function __invoke($param) {
        var_dump($param);
        return 'invoked';
    }
}
$obj = new Object();
echo $obj("test"); // 輸出 string(4) "test" 然後 "invoked"

魔術方法速查表

方法觸發時機典型用途
__constructnew 實例化初始化
__destruct物件銷毀資源釋放
__get/__set存取不可見屬性動態屬性、資料代理
__isset/__unsetisset()/unset() 不可見屬性配合 __get/__set
__call/__callStatic呼叫不可見方法動態方法、委派模式
__toStringecho $obj / (string)$obj物件字串表示
__invoke$obj() 呼叫可呼叫物件、策略模式
__cloneclone $obj深拷貝控制
__sleep/__wakeupserialize()/unserialize()序列化控制
__debugInfovar_dump($obj)自訂除錯輸出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved