だから、これは私のミックスインクラスです:
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
そして、ミックスインクラスを介してインスタンス化されているクラスで使用できるようにするには、何を変更または修正する必要がありますか?