2013-05-28 46 views
0

我想向框架提供的類型添加一些功能,但這種類型是singleton使用私有構造函數擴展類型?

因此,它的構造函數是私人的。我的班級也應該是singleton,但我不知道如何獲得初始化。我無法修改原始類的代碼。

現在我沒有擴展,只是保留一個在我的getInstance中初始化的私有屬性,並使用__call(),但它不夠直觀。我無法傳遞我的對象,其中原始類是預期的。

+0

你介意分享一些可以證明你的問題的代碼? – Passerby

+0

「我的」基類在api.drupal.org上有描述,它對我來說是[down](http://drupal.org/node/2005804),所以我不能將它鏈接到它。目前,我自己的代碼沒什麼可看的。簡單的getInstance調用和私有屬性。 –

回答

0

您將需要保持擴展類中的構造函數爲私有。然而,你既可以做到以下幾點:

class originalClass 
{ 
    private function __construct() 
    { 
     /* Do something */ 
    } 

    public static function init() 
    { 
     self::__construct(); 
    } 
} 


class extendedClass extends originalClass 
{ 
    private function __construct() 
    { 
     parent::init(); 
    } 

    public static function init() 
    { 
     self::__construct(); 
    } 
} 

$var = extendedClass::init(); 

或者,你可以選擇讓你的類作爲一個獨立的,並使用一個神奇的方法來訪問「父」對象:

class pdoExtender 
{ 
    private $someProperty; 

    public function __construct() 
    { 
     $this->someProperty = new PDO(...); 
    } 

    public function __call($name, $args) 
    { 
     if(method_exists(array($this, $someProperty), $name)) 
     { 
      return call_user_func_array(array($this, $someProperty), $args); 
     } 
    } 
} 

// Example function calls: 
    $db = new pdoExtender; 

    // As (obj)pdoExtender doesn't have the method 'prepare()', the __call() method is invoked to check the 'parent' object, PDO 
    $db->prepare(); 
+0

原始類不適合我。如果我即將破解我的框架,我可以放棄繼承,直接添加我的功能 - 但我不想,我想提供插件,而不是黑客。編輯我的問題來反映這一點。 –

+0

使用__call是〜我現在正在做的事情。它有一個很大的缺陷 - 我不能直接將我的對象傳遞給需要基類的函數。沒有辦法定義類型轉換,因爲php聲稱不需要它。因此,沒有真正的繼承,我被卡住了 –

+0

爲什麼你需要放棄繼承呢?你可以不擴展類(即使使用私有構造函數),然後使用'__call()'在你自己的類中加載私有構造函數? –

相關問題