PHP5.3: Как использовать одноэлементный класс PDO (косвенно) из основного исходного кода - PullRequest
3 голосов
/ 08 июля 2011

Используя PHP5.3.3, у меня есть 2 класса, которые называются SinglePDO и Manager , оба работают, но мне наверняка понадобятся ваши советы для оптимизации этих неэффективных сценариев кода.Следовательно, у меня есть 2 вопроса, но я предполагаю, что они строго связаны друг с другом:


1) Доступ к SinglePDO методам из Manager объекта восновной код

из основного кода:

$test=new Manager('mydbname', $some_parameters);
$dbfields = $test->getFieldsSummary(false);

В классе Manager , переопределенная функция, если она определена в SinglePDO класс:

public function getFieldsSummary($param)
{
    return $this->_dbh->getFieldsSummary($param);
}

Вопрос:
Как избавиться от необходимости переопределять все SinglePDO методы в Manager учебный класс ?(Я пробовал: менеджер классов расширяет SinglePDO и использует: __ call () , но без успеха)


2) Split SinglePDO на 2 класса
Класс SinglePDO включает множество методов.Я хотел бы распаковать эти методы и выбросить их в другой класс, скажем Tool , перегружающий класс SinglePDO методом 1, method_2 и т. Д. *

Вопрос:
Как этого добиться в предыдущем контексте (еще с классом менеджера)


Вот класс SinglePDO , типичный, нос дополнительными методами.

       class SinglePDO extends PDO {
            private static $_dsn    = 'mysql:host=127.0.0.1;dbname=foobar';
            private static $_dbuser= 'dbuser' ;
            private static $_dbpwd  = 'dbpwd' ;
            private static $_lock = true;

        public function __construct( $dsn , $uname, $upass ) {

           if( self::$lock ) {
            trigger_error( 'Forbidden Class usage (singleton)');
           }
           parent::__construct( $dsn , $uname, $upass  );

        }

    public static function getInstance($dbh) {
        if( self::$instance == NULL ){
            self::$lock= FALSE;
                    self::$instance = new SinglePDO(self::$_dsn, self::$_dbuser, self::$_dbpwd);
                    self::$lock = TRUE;
        }
    return self::$instance;
    }

    /* lots of added methods that I'd like to drop into a Tool class  */
    public function my_method_1($param) {
     // do this and that
    }
} /* end of the uggly class */

EDIT :
В btwn я нашел эту очень интересную ссылку

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Ответ на вопрос № 1: Если вы расширяете класс другим, все методы public и protected будут доступны в подклассе без их повторного определения.

Ответ на вопрос №2 - расширять классы один за другим.

class Tools extends SinglePDO {}

class Manager extends Tools {}

Кстати: странная реализация одноэлементного шаблона в PHP .

1 голос
/ 08 июля 2011

Для первого вопроса вы использовали call в сочетании с call_user_func_array?Потому что это работало для меня в проектах раньше:

function __call( $fname, array $fargs )
{
    return call_user_func_array( array( $this->_dbh, $fname ), $fargs );
}

На второй вопрос: Хорошо, если вы получите ответ на вопрос 1, вы сможете получить ответ и на этот вопрос.Я мог бы иметь что-то вроде:

class PDOTool
{
    /* why does getInstance have a parameter? */
    private static $pdo = SinglePDO::getInstance(NULL);

    public static my_method_1($param) {
       self::$pdo->doSomething($param);
    }
    /**  __callStatic works in PHP >= 5.3.0  */
    public function __callStatic( $fname, array $fargs )
    {
        return call_user_func_array( array( self::$pdo, $fname ), $fargs );
    }
}
...