簡単にするために、Web アプリケーションで使用される User と UserStatus の 2 つのクラスがあるとします。
<?php
// library code:
class UserStatus {
protected $_status = NULL;
private function fetchDataFromDB() {
// regular DB stuff
$this->_status = ...
// result will be something like 'online', 'away', etc.
}
public function getIcon() {
global $icon_array;
if (is_null($this->_status)) {
$this->fetchDataFromDB()
}
return $icon_array[$this->_status];
}
}
class User {
protected $user_id;
public $user_name;
protected $status;
public function __construct() {}
public static function getAll() {
// some DB stuff
return $users;
}
}
// and now, in index.php:
$users = User::getAll();
// echoes the icon to use to reflect the current user status
foreach ($users as $user) {
echo <img src="$user->status->getIcon()"/>;
}
?>
ほとんどの HTTP リクエストでは、ステータス オブジェクトは使用されないため、必要に応じてのみインスタンス化する方法を探しています (遅延読み込みと呼びます)。status->method()
呼び出しをインターセプトしてそのオブジェクトをオンザフライで作成するにはどうすればよいですか?
重要な注意点は、 UserStatus クラスで利用できる必要$user_id
があることです。そうしないと、fetchDataFromDB()
メソッドはどのユーザーにデータを取得する必要があるかわかりません。これはどのように行うべきですか?
Fabien Potencier のWhat is Dependency Injection?のようなこの問題に関する興味深いものを見てきました。Pimple - PHP 5.3 の依存性注入コンテナとProxy Patternに関するいくつかの記事がありますが、それらを実装するには、現在のコードをかなりいじる必要があるようです。もっと簡単な方法はありますか?