Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Обертка для PDO
 
 автор: Sturmvogel   (01.09.2011 в 19:01)   письмо автору
 
 

Столкнулся с 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 в 23:05)   письмо автору
 
   для: Sturmvogel   (01.09.2011 в 19:01)
 

проблему номер 1 решил, а вторая осталась. как метод сделать статическим?

  Ответить  
 
 автор: MHz   (02.09.2011 в 00:04)   письмо автору
 
   для: Sturmvogel   (01.09.2011 в 23:05)
 

mixed __callStatic ( string $name , array $arguments )

  Ответить  
 
 автор: Sturmvogel   (02.09.2011 в 00:55)   письмо автору
 
   для: MHz   (02.09.2011 в 00:04)
 

благодарю

  Ответить  
 
 автор: Sturmvogel   (02.09.2011 в 18:09)   письмо автору
 
   для: 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

  Ответить  
 
 автор: MHz   (02.09.2011 в 19:37)   письмо автору
 
   для: 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
    }  
}

?>

Вообще, я думаю что с таким кодом скорее всего будут проблемы, надо все хорошо проверить.
Мне кажется я чего-то не учел =)

  Ответить  
 
 автор: Sturmvogel   (02.09.2011 в 23:13)   письмо автору
 
   для: 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));
    }
...
?>


такой говнокод даже работает

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования