class TestClass{
private $prop1;
private $prop2;
public function __construct($pr1,$pr2){
$this->prop1 = $pr1;
$this->prop2 = $pr2;
print_r("TestClass Inited<br>".PHP_EOL);
}
public function hello($pr3){
print_r("pr1: {$this->prop1} <br>".PHP_EOL);
print_r("pr2: {$this->prop2} <br>".PHP_EOL);
print_r("pr3: {$pr3} <br>".PHP_EOL);
}
}
class ClassWrapper /*implements ArrayAccess, Iterator*/{//TODO реализовать интерфейсы самостоятельно
private $inst = null;
private $className;
private $constructorArgs;
public function __construct($className, $args = []){
$this->constructorArgs = $args;
$this->className = $className;
}
public function instance(){
if(empty($this->inst)){
$reflector = new ReflectionClass($this->className);
$this->inst = $reflector->newInstanceArgs($this->constructorArgs);
}
return $this->inst;
}
public function __call ( $fnName , $arguments ){
return call_user_func_array(array($this->instance(), $fnName), $arguments);
}
//TODO реализовать самостоятельно
/*public __set ( $name , $value ){}
public __get ( $name ){}
public __isset ( $name ){}
public __unset ( $name ){}*/
//TODO при желании реализовать оставшиеся магические методы кроме __callStatic https://secure.php.net/manual/ru/language.oop5.magic.php
}
class ClassesContainer{
private $clDictionary = [];
public function set($alias, $className){
$nArgs = func_num_args();
if($nArgs == 2){
$this->clDictionary[$alias] = new ClassWrapper($className);
}else if($nArgs > 2){
$this->clDictionary[$alias] = new ClassWrapper($className, array_slice(func_get_args(),2));
}
}
public function get($alias){
return $this->clDictionary[$alias];
}
}
$container = new ClassesContainer();
$container->set('test','TestClass', 'variable1','variable2');
$container->get('test');
print_r('=====================<br>');
$container->get('test')->hello('world');
print_r('=====================<br>');
$container->get('test');