Расширить класс PDO

Я хочу начать использовать PDO (переход от расширения MySQL), и я хотел бы добавить некоторые методы, но все еще иметь всю функциональность PDO. Я хотел бы реализовать такую ​​функцию:

$db->getAll("SELECT * FROM table WHERE field1=:foo AND field2=:baz", array('foo'=>$foo, 'baz'=>$baz)); 

Я думаю, что лучший способ – расширить класс PDO, но в этом случае у меня не будет экземпляра класса, который сможет использовать его внутри класса. Есть идеи?

Я бы посоветовал не расширять PDO, а скорее создавать библиотеку / обертку вокруг нее, которую делают другие ORM.

Для объяснения я построю ваш примерный код в простой класс.

 class MyDB { private $pdo; public function __construct(PDO $pdo) { $this->pdo = $pdo; } public function getAll($query, array $params) { $statement = $this->pdo->prepare($query); $statement->execute($params); return $statement->fetchAll(); } public function getPdo() { return $this->pdo; } /** * This is called if the method cannot be found. * Pass it to PDO to handle. * * @param $name * @param $arguments */ public function __call($name, $arguments) { return call_user_func(array($this->pdo, $name), $arguments) } } 

Если вы действительно хотите напрямую обращаться к PDO, я включил магический метод, но я не рекомендую вам пройти этот маршрут. См. http://www.php.net/manual/en/language.oop5.magic.php

Делать подобные вещи – это удовольствие для обучения, но если вы хотите серьезный ORM, тогда взгляните на этот SO-вопрос. Хорошая библиотека PHP ORM? а также исследовать себя.

Как раз перед тем, как вы углубитесь в свой проект, вам посоветуйте. Сделайте это с библиотекой ORM.

Например, я делаю то же самое, что вам нужно с библиотекой ORM (в данном случае называется db.php) следующим образом:

 $database->path->to->table->handler->load (\db\by('field1',$value1)->by('field2',$field2)); 

С ORM сложной задачей является то, что им нужны определения классов для работы с таблицами, и многие разработчики PHP боятся определения классов для своих объектов данных. Для приведенного выше примера работы вам должно потребоваться определение класса примерно так:

 namespace \path\to; class table { public $field1; public $field2; } 

И инициализация базы данных в случае библиотеки ORM db.php, например:

 $database = new \db\database ('mysql:host=127.0.0.1', 'test_db', 'root', '1234'); 

И класс, привязанный к объекту базы данных, обрабатывается следующим образом:

 $database->add ('\path\to\table'); 

Кроме того, у многих ORM есть волшебный метод, позволяющий автоматически создавать или генерировать таблицы согласно вашим определениям классов, например, метод db.php ( http://dbphp.net ):

 $database->update(); 

Создает таблицу path_to_table в вашей фактической базе данных mysql с двумя полями field1 и field2.

Я не уверен, почему люди должны бояться ORM в развитии PHP, они делают жизнь проще для всех и дают возможность не путаться в вашем собственном коде, когда вы работаете над крупномасштабными проектами.

Я считаю, что иногда этот ответ спасет по меньшей мере 1 человека от будущих страданий.

: D

один пример:

 class DB { protected static $instance = null; final private function __construct() {} final private function __clone() {} public static function instance() { if (self::$instance === null) { $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME; self::$instance = new PDO($dsn, DB_USER, DB_PASS); self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } return self::$instance; } public static function __callStatic($method, $args) { return call_user_func_array(array(self::instance(), $method), $args); } public static function getAll($sql, $data = NULL, $mode = PDO::FETCH_ASSOC) { $stmt = self::instance()->prepare($sql); $stmt->execute($data); return $stmt->fetchAll($mode); } } $sql = "SELECT * FROM table WHERE field1=:foo AND field2=:baz"; $data = DB::getAll($sql, array('foo'=>$foo, 'baz'=>$baz));