如何在php类中执行某方法的时候自动执行另一个方法?比如我执行数据插入的时候自动运行数据过滤的方法?

比如数据插入方法insert();在执行该方法的时候自动进行数据检查方法fileter()?有点类似于条件触发... 比如数据插入方法insert();在执行该方法的时候自动进行数据检查方法fileter()?有点类似于条件触发 展开
 我来答
nbyh2012
2013-06-24 · TA获得超过3278个赞
知道小有建树答主
回答量:483
采纳率:100%
帮助的人:802万
展开全部

PHP没有事件机制。有一些模拟事件的方法,但我觉得代码太繁琐了,不实用。这里我向你推荐PHP的魔术方法。


魔术方法会在调用一个不存在或是非公有的方法之前,自动根据某种规则调用另外一个方法。比如下面的类就是了这样:在调用insert方法时,判断类中是否有before_insert方法。如果有则先调用before_insert方法,并检查它的返回值,决定是否继续调用insert。如果before_insert是一个过滤函数,如果验证失败就会返回false,insert插入就不会进行了。


如果不明白可以阅读PHP手册中介绍魔术方法的部分。

<?php
class MyClass{
    // 如果使用类的实例调用$method,但$method方法不是公有的,就会触发此函数。
    public function __call($method, $args) {
        // 检查是否存在方法$method
        if (method_exists($this, $method)) {
            $before_method = 'before_' + $method;
            // 检查是否存在方法$before_method
            if (method_exists($this, $before_method)) {
                // 调用$before_method,检查其返回值,决定是否跳过函数执行
                if (call_user_func_array(array($this, $before_method), $args)) {
                    retrun call_user_func_array(array($this, $method), $args)
                }
            } else {
                // $before_method不存在,直接执行函数
                retrun call_user_func_array(array($this, $method), $args)
            }
        } else {
            throw new Exception('no such method ' . $method);
        }
    }
    
    // 注意这里不要写成public
    private function insert() {}
    
    // 低调!不要写出公有的
    private function before_insert() {}
}

$myobj = MyClass;
$myobj->insert('mytable', array('name'=>'2012'));
更多追问追答
追问
我试了貌似不行,仍然提示Call to private method User::add() from context 'UserLogin' in C:\wamp\www\new\action\userlogin.php on line 12
追答

上面的代码中有一点笔误,现重新贴一遍。我已经测试过,没有问题。请仔细检查你写的代码。

class MyClass{
    // 如果使用类的实例调用$method,但$method方法不是公有的,就会触发此函数。
    public function __call($method, $args) {
        // 检查是否存在方法$method
        if (method_exists($this, $method)) {
            $before_method = 'before_' + $method;
            // 检查是否存在方法$before_method
            if (method_exists($this, $before_method)) {
                // 调用$before_method,检查其返回值,决定是否跳过函数执行
                if (call_user_func_array(array($this, $before_method), $args)) {
                    return call_user_func_array(array($this, $method), $args);
                }
            } else {
                // $before_method不存在,直接执行函数
                return call_user_func_array(array($this, $method), $args);
            }
        } else {
            throw new Exception('no such method ' . $method);
        }
    }
}

$myobj = new MyClass;
$myobj->insert('mytable', array('name'=>'2012'));
百度网友a75a762
2013-06-24 · TA获得超过110个赞
知道小有建树答主
回答量:175
采纳率:0%
帮助的人:160万
展开全部
在写一个自定义函数,在执行方法的时候$this->自定义函数名
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
上官元恒zsd
2013-06-24 · TA获得超过1770个赞
知道小有建树答主
回答量:3799
采纳率:28%
帮助的人:1179万
展开全部
执行该方法的时候调用另一个方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式