2013-05-28 2 views
0

Я хочу добавить некоторые функции к типу, предоставленному каркасом, но этот тип является singleton.Расширение типа с помощью частного конструктора?

Таким образом, это Конструктор закрыт. Мой класс также должен быть singleton, но я не знаю, как его инициализировать. Я не могу изменить код исходного класса.

Теперь я не продлеваю, просто сохраняю частную собственность, которая инициализируется в моем getInstance, и используйте __call(), но этого недостаточно и не интуитивно понятно использовать. Я не могу передать свои объекты, где ожидается исходный класс.

+0

бы вы ум, разделяющий какой-то код, который может продемонстрировать ваш вопрос? – Passerby

+0

«Мой» базовый класс описан на api.drupal.org, и это [для меня] (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 - это то, что я сейчас делаю. У этого есть один большой недостаток - я не могу передать свой объект непосредственно функциям, которые требуют базового класса. Невозможно определить тип casting, поскольку php утверждает, что он не нужен. Таким образом, без реального наследования, я застрял –

+0

Почему вам нужно отказаться от наследства? Не могли бы вы расширить класс (даже с помощью частного конструктора), а затем использовать '__call()' для загрузки частного конструктора в свой собственный класс? –

Смежные вопросы