0

所以我有一个类,旨在通过我所谓的“桥”类“混合”其他类。所以你有你的示例类,例如:

class A{
    public function __construct(){}

    public function hello_a(){ echo "hello A"; }
}

class B{
    public function __construct(){}

    public function hello_b(){ echo "hello B"; }
}

您可能还有一个名为 C 的类 - 它需要从 A 和 B 继承,但由于 PHP 没有多重继承,我们有以下内容:

class C extends Bridge{
    public function __construct(){
        parent::__construct();
    }

    public function hello_C(){ 
        $this->hello_a(); // Freaks out*
    }
}

class Bridge extends AisisCore_Loader_Mixins{
    public function construct(){
        parent::construct();

        $this->setup(array(
            'A' => array(),
            'B' => array()
        ));
    }
}

现在终于有了我们的混合类,它允许所有这些工作。注意:此代码假定您有一个使用梨命名标准的自动加载器来为您加载类。

class AisisCore_Loader_Mixins {

    private $_classes;

    private $_class_objects = array();

    private $_methods = array();

    public function __construct(){
        $this->init();
    }

    public function init(){}

    public function setup($class){
        if(!is_array($class)){
            throw new AisisCore_Loader_LoaderException('Object passed in must be of type $class_name=>$params.');
        }

        $this->_classes = $class;
        $this->get_class_objects();
        $this->get_methods();    
    }

    public function get_class_objects(){
        foreach($this->_classes as $class_name=>$params){
            $object = new ReflectionClass($class_name);
            $this->_class_objects[] = $object->newInstanceArgs($params);
        }
    }

    public function get_methods(){

        foreach($this->_class_objects as $class_object){
            $this->_methods[] = get_class_methods($class_object);
        }

        return $this->_methods;
    }

    public function __call($name, $param = null){
        foreach($this->_methods as $key=>$methods){
            foreach($methods as $method){
                if($name === $method){
                    return $this->isParam($method, $param);
                }
            }
        }

        throw new AisisCore_Loader_LoaderException("Method: " .$name. 
                            " does not exist or it's access is not public");
    }

    private function isParam($method, $param){
        if($param != null){
            call_user_func($method, $param);
        }else{
            call_user_func($method);
        }        
    }
}

您可以在课堂上看到C上面的类是如何使用的,我们只需调用hello_a. 到目前为止一切都很好,直到它尝试call_user_func()并吓坏了说:

Warning: call_user_func() expects parameter 1 to be a valid callback, function 'hello_a' not found or invalid function name 

有什么特殊原因找不到这个吗?加载类,方法存储在数组中,显然在方法数组中找到了方法,该方法是公共的。这是怎么回事?

4

1 回答 1

0

您的调用call_user_func只是传递方法名称,因此它正在寻找一个全局函数。您必须传递您的类名或实例:

$a = new A();  // Or however you plan to get your instance of A
call_user_func(array($a, $method));
于 2013-10-08T19:07:35.760 回答