7
回答
PHP魔法函数的问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
php里有没有和__call功能相反的函数?就是当类里的某个函数被调用的时候自动执行。
PHP
举报
Aorey
发帖于5年前 7回/418阅
共有7个答案 最后回答: 5年前

function methodOne(){
  self::methodTwo();
  // your code here
}

--- 共有 1 条评论 ---
Aorey有没有不在内部调用的方法,而是自动触发,我想做一个类似触发器的东西。 5年前 回复
一个无方法的类, 每次调用都会出发 __call 的. 包装一下就可以了.
--- 共有 1 条评论 ---
Aorey我也是这么想的,智能反着用了。 5年前 回复
// 如楼上大牛们所述,利用反射实现代理来实现:
class myClass{  
    function iLove($name){  
        echo 'I love '.$name[0] .'<br />';  
    }  
}  
  
class myClassProxy{  
    private $target;  
    function __construct($tar){  
        $this->target[] = new $tar();  
    }  
  
    function __call($name, $args){  
        foreach ($this->target as $obj) {  
            $r = new ReflectionClass($obj);  
            if ($method = $r->getMethod($name)) {  
                if($method->isPublic() && !$method->isAbstract()){  
                    // before fall in love
                    echo 'I am a boy'.'<br />';
					
                    $method->invoke($obj, $args);  
                    
                    // after fall in love
                    echo 'I am a man'.'<br />';
                }  
            }  
        }  
    }  
}  
 
$obj = new myClassProxy('myClass');  
$obj->iLove('Wujiamin');



// 还能使用模板方法模式实现
// 抽象模板角色
abstract class AbstractClass {
    public function templateMethod() {
        echo '1';
        $this->primitiveOperation1();
        $this->primitiveOperation2();
        echo '4';
    }

    abstract protected function primitiveOperation1();
    abstract protected function primitiveOperation2();
}

class ConcreteClass extends AbstractClass{
    protected function primitiveOperation1() {
        echo '2';
    }

    protected function primitiveOperation2(){
        echo '3';
    }
}

class Client {
    public static function main() {
        $class = new ConcreteClass();
        $class->templateMethod();
    }
}

Client::main(); // 输出:1234







顶部