class car
{
public function pay(){
return 100;
}
}
class person
{
public $obj;
public $name;
public function __construct(car $obj,$name = '张三')
{
$this->obj =$obj;
$this->name =$name;
}
public function buy(){
return $this->name.' 支付了:'.$this->obj->pay();
}
}
class container
{
protected static $instance = null;
public $instances = [];
private function __construct(){}
public static function getInstance(){
if(!self::$instance){
self::$instance = new self();
}
return self::$instance;
}
public function set($key,$value){
$this->instances[$key] = $value;
}
public function get($key,$arr=[]){
if(isset($this->instances[$key])){
$key = $this->instances[$key];
}
//反射类
$reflect = new \ReflectionClass($key);
//获取构造函数
$c = $reflect->getConstructor();
if(!$c){
return new $key();
}
//获取构造函数的参数
$params = $c->getParameters();
if(empty($params)){
return new $key();
}
$args = [];
foreach ($params as $key => $param){
//获取参数的类名
$class = $param->getClass();
if(!$class && isset($arr[$key])){
$args[] = $arr[$key];
}else{
$args[] = $this->get($class->name);
}
}
return $reflect->newInstanceArgs($args);
}
//index.php
require 'container.php';
require 'person.php';
require 'car.php';
container::getInstance()->set('person','\person');
container::getInstance()->set('car','\car');
$args = [null,'王五'];
echo container::getInstance()->get('person',$args)->buy();//王五 支付了:100