0

だから、これは私のミックスインクラスです:

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);
            $object_name = get_class($object);
            $this->_class_objects[$object->name] = $object->newInstanceArgs($params);
        }
    }

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

        return $this->_methods;
    }

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

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

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

クラスのセットをロードし、それらの関数を呼び出せるようにするなど、非常に単純なことですが、新しい問題があります。これに渡されたクラスは静的としてインスタンス化されているようです。したがって、それらのメソッドは使用できず、$this->どちらを使用することに頼ってself::いますか。

これがどのように機能するかの例を見てみましょう:

class BaseBridge extends AisisCore_Loader_Mixins{

    public function __construct(){ 
        parent::construct();

        $this->setup(array('ClassB' => array()));
    }
}

定義しようClassB

class ClassB{

    public function __construct(){}

    public function some_method(){
        $this->_some_private_method();
    }

    private function _some_private_method(){}
}

かなり基本的なものなので、すべてを接続しましょうClassA

class ClassA extends BaseBridge{

    public function __construct(){ 
        parent::__construct(); 
        $this->some_method();
    }
} 

クイック レビュー:拡張するコア クラスがClassAあります。これは、拡張BaseBridgeする 1 つ以上の (複数で使用することを意図した) クラス間のブリッジ クラスClassAです。この場合ClassB、簡単にするために から拡張しただけです。

問題は何ですか?がどのようにClassBやっていたかを参照してください$this->_some_private_method();なんで?エラーが発生するため:Using $this when not in object context混乱するので、次のように変更します:self::$_some_private_method();すると、魅力的に機能します。

なんで?$thisそして、ミックスインクラスを介してインスタンス化されているクラスで使用できるようにするには、何を変更または修正する必要がありますか?

4

1 に答える 1

0

そのため、いくつかのわずかな変更を加えて、この作業を行うことができました。複数の引数を持つ関数が機能するとは信じていませんが、フィードバックをいただければ幸いです。

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->name] = $object->newInstanceArgs($params);
        }
    }

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

        return $this->_methods;
    }

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

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

    private function _is_param($class_name, $method, $param){
        if($param != null){
            $this->_param_is_array($class_name, $method, $param);
        }else{
            call_user_func(array($this->_class_objects[$class_name], $method));
        }        
    }

    private function _param_is_array($class_name, $method, $param){
        if(is_array($param)){
            call_user_func_array(array($this->_class_objects[$class_name], $method), $param);
        }else{
          call_user_func(array($this->_class_objects[$class_name], $method, $param));  
        }        
    }
}

このクラスによって登録されたクラス内の関数は、 を使用できるようになり$this->ました。

問題は、複数のパラメーター ベースの関数が実際に機能するかどうかわからないことです。

于 2013-10-09T17:06:01.790 に答える