Observer パターン

<?php
class Log {
    public function message($sender, $messageType, $data) {
        print $messageType." - ".$data."\n";
    }
}

class SubscriptionList {
    var $list = array();

    public function add($obj, $method) {
        $this->list[] = array($obj, $method);
    }

    public function invoke() {
        $args = func_get_args();
        foreach($this->list as $l){
                call_user_func_array($l, $args);
        }
    }
}

class CustomerList {
    public $listeners;

    public function CustomerList() {
        $this->listeners = new SubscriptionList();
    }

    public function addUser($user) {
        $this->listeners->invoke($this, "追加", "$user");
    }
}

$l = new Log();
$cl = new CustomerList();
$cl->listeners->add($l, 'message');
$cl->addUser("starbuck");
?>

「$cl->listeners->add($l, 'message');」でやることを指定している。