爲了簡單起見,假設我在Web應用程序中使用了2個類User和UserStatus。根據需要將實例化對象定義爲PHP類中的屬性(延遲加載)
<?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()
方法將不知道哪個用戶應該獲取數據。這應該怎麼做?
我看了一些有趣的東西,在這個問題上像小煜Potencier的What is Dependency Injection?和Pimple - a PHP 5.3 dependency injection container,還有一些關於代理模式文章,但實現它們看起來像我有亂七八糟很多與當前的代碼。有一種更簡單的方法嗎?
這確實是一種方法,但UserStatus類提供了幾種方法,其中之一是如上所示的getIcon()。使用你的建議,我必須在兩個步驟中調用圖標方法:`$ user-> getStatus(); $用戶>狀態 - >調用getIcon()`。我試圖讓它更聰明,但嘿,它很有用。謝謝。 – noisebleed 2011-02-06 14:33:54