<?php
class Container{
public $binding = [];
public function bind($key,$value){
$this->binding[$key] = $value;
}
public function make($str,$param=[]){
return call_user_func($this->binding[$str],[$param]);
}
}
abstract class Subject{
public $observe = [];
public function dealstate(){}
}
abstract class Observe{
public function update(){}
}
class A extends Observe{
public function update(){
echo 'A:我知道他变了<br>';
}
}
class B extends Observe{
public function update(){
echo 'B:我也知道他变了<br>';
}
}
class Dsub extends Subject{
public function doObserve(Observe $ob){
$this->observe[] = $ob;
}
public function dealstate(){
$this->doNotify();
}
private function doNotify(){
foreach ($this->observe as $obj) {
$obj->update();
}
}
}
$container = new Container;
$container->bind('a',function(){
return new A;
});
$container->bind('b',function(){
return new B;
});
$dsub = new Dsub;
$dsub->doObserve($container->make('a'));
$dsub->doObserve($container->make('b'));
$dsub->dealstate();