为简单起见,假设我有 2 个类,User 和 UserStatus,用于 Web 应用程序。
<?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()
呼叫并即时创建该对象?
一个重要的注意事项是我需要$user_id
在 UserStatus 类中可用,否则该fetchDataFromDB()
方法将不知道它应该向哪个用户获取数据。这应该怎么做?
我看过一些关于这个问题的有趣的东西,比如 Fabien Potencier 的什么是依赖注入?和Pimple - 一个 PHP 5.3 依赖注入容器以及一些关于代理模式的文章,但要实现它们,看起来我必须对当前代码进行很多处理。有没有更简单的方法?