我想向框架提供的類型添加一些功能,但這種類型是singleton
。使用私有構造函數擴展類型?
因此,它的構造函數是私人的。我的班級也應該是singleton
,但我不知道如何獲得初始化。我無法修改原始類的代碼。
現在我沒有擴展,只是保留一個在我的getInstance
中初始化的私有屬性,並使用__call(),但它不夠直觀。我無法傳遞我的對象,其中原始類是預期的。
我想向框架提供的類型添加一些功能,但這種類型是singleton
。使用私有構造函數擴展類型?
因此,它的構造函數是私人的。我的班級也應該是singleton
,但我不知道如何獲得初始化。我無法修改原始類的代碼。
現在我沒有擴展,只是保留一個在我的getInstance
中初始化的私有屬性,並使用__call(),但它不夠直觀。我無法傳遞我的對象,其中原始類是預期的。
您將需要保持擴展類中的構造函數爲私有。然而,你既可以做到以下幾點:
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();
原始類不適合我。如果我即將破解我的框架,我可以放棄繼承,直接添加我的功能 - 但我不想,我想提供插件,而不是黑客。編輯我的問題來反映這一點。 –
使用__call是〜我現在正在做的事情。它有一個很大的缺陷 - 我不能直接將我的對象傳遞給需要基類的函數。沒有辦法定義類型轉換,因爲php聲稱不需要它。因此,沒有真正的繼承,我被卡住了 –
爲什麼你需要放棄繼承呢?你可以不擴展類(即使使用私有構造函數),然後使用'__call()'在你自己的類中加載私有構造函數? –
你介意分享一些可以證明你的問題的代碼? – Passerby
「我的」基類在api.drupal.org上有描述,它對我來說是[down](http://drupal.org/node/2005804),所以我不能將它鏈接到它。目前,我自己的代碼沒什麼可看的。簡單的getInstance調用和私有屬性。 –