關於重複投票:這個問題是關於這種方法的缺點,而不是如何做到這一點;你可以通過這種方式看到它:這個問題問如何做某事,答案說有用,但是,我問了答案的缺點。以這種方式使用Ghost Lazy Loading模式有什麼不足嗎?
TL; DR:稍後使用這個包裝類會遇到任何技術難題嗎?爲什麼我以前沒有見過這樣的事情?
我一直在
實驗
最近的分析學習技術,我發現創建PDO實例是一個可以優化(〜5ms)的地方。我不需要在每次調用中都使用它,但是我在來自代碼結構的每次調用中都創建了它。所以,我剛纔提出這個小班起來:
<?php
namespace Library;
// Wrapper for \PDO. It only creates the rather expensive instance when needed.
// Use it exactly as you'd use the normal PDO object, except for the creation.
// In that case simply do "new \Library\PDO($args);" with the normal args
class PDO
{
// The actual instance of PDO
private $db;
public function __construct() {
$this->args = func_get_args();
}
public function __call($method, $args)
{
if (empty($this->db))
{
$Ref = new \ReflectionClass('\PDO');
$this->db = $Ref->newInstanceArgs($this->args);
}
return call_user_func_array(array($this->db, $method), $args);
}
}
要調用它,你只需要修改這一行:
$DB = new \Library\PDO(/* normal arguments */);
而且如果你用它來(\Library\PDO $DB)
的提示類型。
它完美地工作。當不使用PDO對象時,它也快速(〜0.2ms),並且在使用時只引入那些〜0.2ms的延遲(完全可以忽略)。現在,我仍然在學習正確的面向對象,命名空間和一般的代碼結構,所以我認爲我沒有足夠的資格回答我自己的問題:
我會遇到任何技術困難,使用此包裝類稍後的?爲什麼我以前沒見過這樣的東西?因此,爲什麼這不是更常見甚至是默認的PDO行爲?
注:我打算通過增加更多的方法來擴展它。
對我來說看起來像一個基本的單例模式,但是使用反射來實例化你的工廠模式 –
@MarkBaker,它不完全是工廠模式,因爲只有一個類正在創建。 –
@MarkBaker大聲笑,評論的激進變化很有趣。它也不是單身人士,因爲我傳遞它(不是全局的),並且允許存在多個'\ Library \ PDO'實例(而不是** single ** ton)。 –