2014-01-11 49 views
1

關於重複投票:這個問題是關於這種方法的缺點,而不是如何做到這一點;你可以通過這種方式看到它:這個問題問如何做某事,答案說有用,但是,我問了答案的缺點。以這種方式使用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行爲?

注:我打算通過增加更多的方法來擴展它。

+1

對我來說看起來像一個基本的單例模式,但是使用反射來實例化你的工廠模式 –

+0

@MarkBaker,它不完全是工廠模式,因爲只有一個類正在創建。 –

+0

@MarkBaker大聲笑,評論的激進變化很有趣。它也不是單身人士,因爲我傳遞它(不是全局的),並且允許存在多個'\ Library \ PDO'實例(而不是** single ** ton)。 –

回答

2

回答你的問題:這沒有什麼錯。這是一種常見的優化模式,稱爲lazy loading,正如您在評論中也提到的那樣。

雖然它可以用不同於你在這裏完成的方式來實現,但你的方法對我來說看起來非常好。

+0

)我說惰性負載認爲它通常只是通過不做任何事情來完成,而不是像我那樣把*問題*給予另一個類,我實際上並沒有意識到這是延遲加載直到在閱讀[維基百科的文章部分](https://en.wikipedia.org/wiki/Lazy_loading#Ghost)和[This SO answer](http://stackoverflow.com/a/9911787)之後,我做了什麼實際上被稱爲Ghost。 –

+0

以前沒有聽說過「幽靈」,但是,是的,這確實是你正在做的鬼魂:) –