免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1874 | 回复: 1
打印 上一主题 下一主题

关于PHP中调用对象方法响应事件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-19 09:40 |只看该作者 |倒序浏览
最近在写一套开源框架遇到了一个问题:我将框架中的一些核心基类添加了一些自动调用的方法,这些方法需要在其子类中调用方法的时候调用,并获取子类的方法名、参数等信息。比如:
<?php

class base{

protected function getMethod($method){

list($class, $method) = explode('::', $method);

echo $method;

}

}



class ext extends base{

public function method(){

$this->getMethod(__METHOD__);

echo "\r\nha";

}



public function foo(){

echo "\r\nfoo";

}

}



$object = new ext;

$object->method();

$object->foo();

?>


但是我希望能在项目中少写这些代码,目的在于方便框架的使用者,减少手误,也让项目代码看起来与框架无关。所以想在用户调用子类方法的时候自动调用基类的方法。我目前的做法是让子类需要自动调用的方法前加上前缀,这样在不使用前缀调用这些方法的时候就会触发基类的__call魔术方法,再由__call方法进行方法的重定向:

<?php
class base{
const  METHOD_PERFIX = '_';
public  function __call($method, $arguments){
&nbsp;&nbsp;$realMethod = base::METHOD_PERFIX . $method;
&nbsp;&nbsp;if(method_exists($this, $realMethod)){
&nbsp;&nbsp;&nbsp;$this->getMethod($method);
&nbsp;&nbsp;&nbsp;return call_user_func_array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$realMethod
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arguments
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;}
&nbsp;&nbsp;trigger_error(get_class($this) . "::{$method} not exists", E_ERROR);
}
private  function getMethod($method){
&nbsp;&nbsp;echo $method;
}
}
class ext extends base{
protected function _method(){
&nbsp;&nbsp;echo "\r\nha";
}
public  function foo(){
&nbsp;&nbsp;echo "\r\nfoo";
}
}
$object = new ext;
$object->method();
$object->foo();
?>


但是也存在问题,就是方法的前缀让人看起来很不舒服,我想让项目的代码可以自由命名方法。一个朋友告诉我这样使用也存在一定的效率问题,他说php解释器会搜索进程中所有的方法之后才会调用__call()方法,这样比较影响效率。于是我想到使用protected之类的修饰符来区分需要自动调用的方法,但是直接使用protected属性的方法会引发一个fatal error,程序会中断。不知道有没有在fatal error的时候让程序触发一个错误句柄继续走下的方法,我曾经试过set_error_handler,但是拿fatal error没有办法。

想问问大家有没有解决方案,先谢了

[ 本帖最后由 sanders_yao 于 2009-2-19 09:42 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-19 13:41 |只看该作者
php5有自己的反射方法啊,搞不明白楼主到底想干嘛:

<pre>
<?php

class myClass {
    // constructor

    function myclass()
    {
        return(true);
    }
   
    // method 1

    function myfunc1()
    {
        return(true);
    }

    // method 2

    function myfunc2()
    {
        return(true);
    }
}
class mySubClass extends myClass{
    // method 3

    function myfunc3()
    {
        return(true);
    }
}

$class_methods = get_class_methods('myClass');
// or

$class_methods = get_class_methods(new myClass());

foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}

echo "----------------------------\n";

Reflection::export(new ReflectionClass('myClass'));

echo "=============================\n";

$class_methods = get_class_methods('mySubClass');
// or

$class_methods = get_class_methods(new mySubClass());

foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}

echo "----------------------------\n";

Reflection::export(new ReflectionClass('mySubClass'));
?>
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP