Как превратить публичный конструктор в защищенный в дочернем классе? - PullRequest
1 голос
/ 27 марта 2011

Я пытаюсь расширить класс PDO, а также превратить его в одноэлементный. Единственная проблема заключается в том, что конструктор PDO является общедоступным, и PHP не позволит мне переопределить его как защищенный метод. Есть ли какой-нибудь образный способ обойти это? Буду ли я застрял с этим свободным концом навсегда, если я попытаюсь это? Альтернативой может быть не расширение PDO, а удержание его в статическом свойстве и выполнение операций с ним, но я хотел, чтобы мой класс сохранил всю функциональность PDO, если это возможно.

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Попробуйте это:

class MyPdoSingleton {

    protected $pdo;

    // Your own constructor called the first time if the singleton
    // instance does not exist
    protected function __construct() {
    }

    // Always returns the same instance (singleton)
    public static function getInstance() {
        static $instance;
        return (is_object($instance)) ? $instance : $instance = new self();
    }

    // Redirect any non static methods calls made to this class to the contained
    // PDO object.
    public function __call($method, $args) {
        return call_user_func_array(array($this->pdo, $method), $args);
    }

    // 5.3+
    public function __callStatic($method, $args) {
        $inst = self::getInstance();
        return call_user_func_array(array($inst, $method), $args);
    }

    // Or if you intend to have other classes inherit from this one
    /*public function __callStatic($method, $args) {
        $class = get_called_class();
        $inst = call_user_func(array($class, 'getInstance'));
        return call_user_func_array(array($inst, $method), $args);
    }*/

    public function myOtherMethod($arg) {
         // __call would not get called when requesting this method
    }
}

// Pre 5.3 use
$db = MyPdoSingleton::getInstance();
$db->myOtherMethod();

// Post 5.3 use
MyPdoSingleton::myOtherMethod();

Ops.Я полностью испортил это.Вот что я получаю, отвечая на вопросы первым делом утром.

1 голос
/ 27 марта 2011

Вы можете просто обернуть класс PDO в свой собственный объект "Singleton Factory". По сути, вы реализуете свой собственный синглтон, который содержит (один) экземпляр PDO. (Обратите внимание, что я не знаю синтаксис PHP, так что это Java, но вы должны быть в состоянии понять идею)

MySingletonFactory.getInstance().getPDO();

Более подробное объяснение можно найти здесь: http://www.wikijava.org/wiki/Singleton_Factory_patterns_example

(Опять же, Java ... извините, но я верю, что это приведет вас туда, куда вы хотите)

...