Для простоты предположим, что у меня есть 2 класса, User и UserStatus, используемые в веб-приложении.
<?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 , в противном случае *Метод 1010 * не будет знать, какому пользователю он должен получить данные.Как это должно быть сделано?
Я рассмотрел некоторые интересные вещи по этому вопросу, такие как Фабьена Потенциера «Что такое Dependency Injection?» * и Pimple - контейнер внедрения зависимостей PHP 5.3 , а также некоторые статьи о Proxy Pattern , но для их реализации, похоже, мне приходится много путаться с текущим кодом.Есть ли более простой способ?