<?php // 事件委託 class Base { public function write(...$args) { printf('方法名: %s(), 參數 [%s]',__METHOD__, implode(', ', $args)); } public static function fetch(...$args) { printf('方法名: %s(), 參數 [%s]',__METHOD__, implode(', ', $args)); } } // 工做類 class Work { // 事件委託時,重定向到的類 private $base; // 將$base初始化 public function __construct(Base $base) { $this->base = $base; } // 方法攔截器,將$this->write()重定向到$this->base->write() public function __call($name, $args) { // 將$this->$name()重 定向到$this->base->$name() if (method_exists($this->base, $name)) // return $this->base->$name($name, $args); //使用call_user_func_array()函數回調對象中的成員方法,第一個參數應該使用數組的方式: [對象引用, '對象中的方法名'] return call_user_func_array([$this->base, 'write'], $args); } // 方法攔截器,將self::fetch()重定向到Base::fetch() public static function __callStatic($name, $args) { if (method_exists('Base', $name)) //使用call_user_func_array()函數回調類中的靜態成員方法,第一個參數應該使用數組的方式: [類名稱, '類中靜態方法名稱'] return call_user_func_array(['Base', 'fetch'], $args); } } $base = new Base(); $work = new Work($base); $work->write(1,2,3); $work::fetch('abc', 'ppp', 'www');