__call,__callStatic 方法攔截器事件委託

<?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');
相關文章
相關標籤/搜索