interface IObserver{
	public function update($data);
}

class LogObserver implements IObserver{
	
	public function update($data){
		echo 'ログ出力を行いました。(ダミー)'.$data['date1'].'<br>';
	}
}

class MailObserver implements IObserver{
	
	public function update($data){
		echo 'メール送信を行いました。(ダミー)'.$data['date1'].'<br>';
	}
}

class TwitterObserver implements IObserver{
	
	public function update($data){
		echo 'Twitterへ投稿しました。(ダミー)'.$data['date1'].'<br>';
	}
}

class SubjectBase{
	
	public $observers = array();
	
	public function addObserver(IObserver $observer){
		$this->observers[] = $observer;
	}
	
	public function notifyObservers($data){
		for($i=0; $i<count($this->observers); $i++){
			$observer = $this->observers[$i];
			$observer->update($data);
		}
	}
}

class AnimalSubject extends SubjectBase{
	
	public function __construct(){
		$this->addObserver(new LogObserver());
		$this->addObserver(new MailObserver());
		$this->addObserver(new TwitterObserver());
	}
	
	public function action(){
		
		$data = array('date1' => date('Y-m-d H:i:s'));
		
		$this->notifyObservers($data);
	}
}


// 検証
$animal = new AnimalSubject();
$animal->action();

出力

ログ出力を行いました。(ダミー)2024-11-23 21:43:42
メール送信を行いました。(ダミー)2024-11-23 21:43:42
Twitterへ投稿しました。(ダミー)2024-11-23 21:43:42