|
|
|
| Столкнулся с 2-мя проблемами при написании обертки для класса PDO.
1) Можно ли переписать конструктор? При создании экземпляра класса PDO необходимо в конструктор передать что-то типа
'mysql:host=localhost;dbname=database', 'login', 'pass'
|
а я вот хотел написать конструктор, в который передавался бы массив настроек $settings['db'], из которого бы формировалась бы строка параметров и создавался бы объект верно. Также хотел запихнуть запрос SET NAMES UTF8 прямо в конструктор.
Каким образом это можно реализовать?
2) Как можно сделать возможным доступ к DB::query() без $db->query() и глобального параметра $db, т.е. из любого места в коде. Грубо говоря, чтобы создалость постоянное соединение, видимое отовсюду после создания его. | |
|
|
|
|
|
|
|
для: Sturmvogel
(01.09.2011 в 19:01)
| | проблему номер 1 решил, а вторая осталась. как метод сделать статическим? | |
|
|
|
|
|
|
|
|
для: MHz
(02.09.2011 в 00:04)
| | благодарю | |
|
|
|
|
|
|
|
для: MHz
(02.09.2011 в 00:04)
| | Опять возникли проблемы...
В классе пишу следующее:
class Database extends PDO
{
private static $obj;
public function Database($db)
{
$pdo = PDO::__construct('mysql:host='.$db['location'].';dbname='.$db['name'].'', $db['user'], $db['password']);
PDO::query('SET NAMES UTF8');
$this->obj = $pdo;
return ($pdo);
}
public static function __callStatic($method, $arguments)
{
return call_user_func_array(array($this->obj, $method), $arguments);
}
...
}
|
Но при попытке вызвать Database::query($sql) выдает ошибку:
Fatal error: Non-static method PDO::query() cannot be called statically, assuming $this from incompatible context
|
| |
|
|
|
|
|
|
|
для: Sturmvogel
(02.09.2011 в 18:09)
| | Перегрузить методы PDO как статические у меня не получилось, так сам класс не стоит наследовать от PDO, я создал экземпляр PDO и храню указатель на него в переменной $obj.
Как я понял если имя метода совпадает с именем класса, то этот метод считается конструктором, а конструктор не может быть статическим ,поэтому вместо Database можно использовать например Connect ();
<?php
class Database
{
private static $obj;
// Создаем объект PDO и кладем указатель на него в $obj
public function Connect (array $db)
{
self::$obj = new PDO ('mysql:host='.$db['location'].';dbname='.$db['name'].'', $db['user'], $db['password']);
self::$obj->query('SET NAMES UTF8');
}
public static function __callStatic ($method, $arguments)
{
// С таким конструктором перед вызовом метода нужно обязательно проверять является ли переменная $obj объектом PDO
if (!(self::$obj instanceof PDO)) return NULL;
return method_exists (self::$obj, $method) ? self::$obj->$method (implode (',', $arguments)) : NULL;
}
}
?>
|
Вообще, я думаю что с таким кодом скорее всего будут проблемы, надо все хорошо проверить.
Мне кажется я чего-то не учел =) | |
|
|
|
|
|
|
|
для: MHz
(02.09.2011 в 19:37)
| |
<?php
...
private static $obj;
public function Database($db)
{
$pdo = PDO::__construct('mysql:host='.$db['location'].';dbname='.$db['name'].'', $db['user'], $db['password']);
self::$obj = new PDO('mysql:host='.$db['location'].';dbname='.$db['name'].'', $db['user'], $db['password']);
self::$obj->query('SET NAMES UTF8');
return ($pdo);
}
public function query($sql)
{
return (self::$obj->query($sql));
}
...
?>
|
такой говнокод даже работает | |
|
|
|