- 论坛徽章:
- 0
|
最近在写一套开源框架遇到了一个问题:我将框架中的一些核心基类添加了一些自动调用的方法,这些方法需要在其子类中调用方法的时候调用,并获取子类的方法名、参数等信息。比如:
<?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){
$realMethod = base::METHOD_PERFIX . $method;
if(method_exists($this, $realMethod)){
$this->getMethod($method);
return call_user_func_array(
array(
$this,
$realMethod
),
$arguments
);
}
trigger_error(get_class($this) . "::{$method} not exists", E_ERROR);
}
private function getMethod($method){
echo $method;
}
}
class ext extends base{
protected function _method(){
echo "\r\nha";
}
public function foo(){
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 编辑 ] |
|