$registry = new Registry();//启动注册机
$load = new load($registry);//load类引用注册机 ->指向reg
$registry->set('load', $load);//注册机注册load类
$co = new co($registry);//控制器引用注册机 ->指向reg
$co->action();//方法中通过load类向注册机里注册了model类,注意:这时控制器里的注册机被改变,因为他们用的是同一个实例$registry
/*注册机*/
final class Registry {
private $data = array();
public function get($key) {
return (isset($this->data[$key]) ? $this->data[$key] : null);
}
public function set($key, $value) {
$this->data[$key] = $value;
}
public function has($key) {
return isset($this->data[$key]);
}
}
//model
class modelcampaignhelp{
}
//控制器
class co {
protected $registry;
function __construct($Registry){
$this->registry = $Registry;
}
public function __get($key) {
return $this->registry->get($key);
}
public function __set($key, $value) {
$this->registry->set($key, $value);
}
function action(){
//print_r($this);
$this->load->model('modelcampaignhelp');
print_r($this);
exit;
}
}
//load
class load{
function __construct($Registry){
$this->registry = $Registry;
}
function model($class){
print_r($this->registry);
$this->registry->set($class, new $class);
}
}
exit;
简化版:
class a {
private $v = array();
public function set($v){
$this->v= $v;
}
}
class b1 {
function __construct($a){
$this->a = $a;
$a->set('b1');
}
}
class b2 {
function __construct($a){
$this->a = $a;
$a->set('b2');
}
}
$a = new a();
$b1 = new b1($a);
$b2 = new b2($a);//由于b2类中改变了注册机$a,所以b1的结果随之改变。
print_r($b1);
exit;