class Container
{
private $binds =[];
public static $instance = null;
public static function getInstace(){
if(static::$instance==null){
static::$instance = new self();
return static::$instance;
}
return static::$instance;
}
public static function bind($name,$class=null){
if($class instanceof Closure){
static::getInstace()->binds['name'] = $class;
}else if(is_object($class)){
static::getInstace()->binds['name'] = $class;
}else{
static::getInstace()->make($name);
}
}
public static function get($name){
return static::getInstace()->make($name);
}
public function make($name){
try{
if(array_key_exists($name,$this->binds)){
return $this->binds[$name];
}
//根据类中得到它的反射
$reflectionClass = new ReflectionClass($name);
//利类反射取构造函数
$constructor = $reflectionClass->getConstructor();
$params = [];
if(!is_null($constructor)){
//获取构造函数参数
$constructorParams = $constructor->getParameters();
var_dump($constructorParams);
foreach ($constructorParams as $constructorParam){
echo $constructorParam->getType().PHP_EOL;
if(!is_null($constructorParam->getType())){
$params[] = $this->make($constructorParam->name,$constructorParam->name);
}else{
$params[] = $constructorParam->name;
}
}
}
$class = $reflectionClass->newInstanceArgs($params);
$this->binds['name'] = $class;
return $class;
}catch (ReflectionException $e){
echo $e->getMessage();
}
}
private function __construct()
{
}
private function __clone()
{
// TODO: Implement __clone() method.
}
}
require_once 'Container.php';
class TestFather{
private $name="TestFather";
public function __construct()
{
}
}
class Test extends TestFather{
private $name="Test";
public function __construct(DI $di,$name,$param_2=[])
{
}
public function sayName(){
echo $this->name;
}
public function sayDI2Name(DI2 $di2){
echo "from test say di2 name.";
echo $di2->sayName();
}
}
class DI{
private $name="DI";
public function __construct(DI2 $di2)
{
}
public function sayName(){
echo $this->name;
}
}
class DI2{
private $name='DI2';
public function __construct()
{
}
public function sayName(){
echo $this->name;
}
}
class DI3{
private $name="DI3";
public function __construct()
{
}
public function sayName(){
echo $this->name;
}
}
class DI4{
private $name="DI4";
public function __construct()
{
}
public function sayName(){
echo $this->name;
}
}
$test = Container::get('test');
$test->sayName();
echo PHP_EOL;
$test->sayDI2Name(new DI2());
echo PHP_EOL;
$di = Container::get('di');
$di->sayName();
echo PHP_EOL;
$di2 = Container::get('di2',new DI2());
$di2->sayName();
echo PHP_EOL;
$di3 = Container::get('di3',function (){ return new DI4();});
$di3->sayName();
class Container{ private $binds =[]; public static $instance = null; public static function getInstace(){ if(static::$instance==null){ static::$instance = new self(); return static::$instance; } .