PHP魔法函数的问题

Aorey 发布于 2013/05/31 16:58
阅读 434
收藏 0
PHP
php里有没有和__call功能相反的函数?就是当类里的某个函数被调用的时候自动执行。
加载中
0
帖子列表
帖子列表

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

Aorey
Aorey
有没有不在内部调用的方法,而是自动触发,我想做一个类似触发器的东西。
0
ErosVshare
ErosVshare
不是有call_user_func之类的函数么。。。
0
南湖船老大
南湖船老大

你思路有问题。

你这种想法属于设计模式了,需要在类的外面再裹一层

南湖船老大
南湖船老大
回复 @Aorey : 代理.
Aorey
Aorey
如何加包裹层啊?
0
泡不烂的凉粉
泡不烂的凉粉
一个无方法的类, 每次调用都会出发 __call 的. 包装一下就可以了.
Aorey
Aorey
我也是这么想的,智能反着用了。
0
leo108
leo108
观察者模式?
0
小小卒子
小小卒子
方法代理
Aorey
Aorey
能写个简单的例子不 ?
0
帖子列表
帖子列表
// 如楼上大牛们所述,利用反射实现代理来实现:
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







返回顶部
顶部