Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > ООП и либы для баз данных


Автор: mark2011 11.9.2011, 09:16
Здравствуйте!

Пишу библиотеки доступа для баз данных, используя пространства имён и все возможности ООП. Имеем следующую структуру классов:

Database (абстрактный класс с общими методами для всех наследуемых классов)
MySQL (потомок Database)
MySQL_StoredProcs (потомок MySQL)

Вот код конструктора класса MySQL:

Код

public function __construct($host, $user, $password, $dbname)
    {    
        parent::__construct();
        $this->setHost($host);
        $this->setUser($user);
        $this->setPassword($password);
        $this->setDbName($dbname);
        
        
        $pers = $this->getPersistent();
        if ($pers)
        {
            $function = "mysql_pconnect";
        }
        else
        {
            $function = "mysql_connect";
        }
        
        if (!function_exists($function))
        {
            return false;
        }    
        
        $test = $function($host, $user, $password);
        if (!$test)
        {
            return false;
        }
        
        else
        {
            $this->_ConnID    =    $test;
            $this->select_db();
            $this->query('SET @@AUTOCOMMIT = false');
        }
    }


Как видим, здесь используются 4 переменные, и без них, видимо, никак. Тут всё хорошо. Теперь в классе MySQL_StoredProcs пытаюсь сделать 

Код

parent::__construct();

который в таком виде, естественно, не проходит. Говорит что не указаны те самые 4 переменные. Хорошо.... идём обратно в класс Database и видим:

Код

/**
     * Host
     * @var string
     * @access protected
    */ 
    protected $_host;
    
    /**
     * User
     * @var string
     * @access protected
    */
    protected $_user;
    
    /**
     * Password
     * @var string
     * @access protected
    */
    protected $_password;
    
    /**
     * Database name
     * @var string
     * @access protected
    */
    protected $_dbName;


В точности их указываем в методе parent::__construct() класса MySQL_StoredProcs и получаем

Код

Warning: mysql_connect(): Access denied for user ''@'localhost' (using password: NO) in D:\WebSites
\main\libs\Database\mysql.php on line 92 Warning: mysql_query(): Access denied for user ''@'localhost'
 (using password: NO) in D:\WebSites\main\libs\Database\mysql.php on line 123 Warning: mysql_query():
A link to the server could not be established in D:\WebSites\main\libs\Database\mysql.php on line 123
Warning: mysql_query(): Access denied for user ''@'localhost' (using password: NO) in D:\WebSites
\main\libs\Database\mysql.php on line 123 Warning: mysql_query(): A link to the server could not be
established in D:\WebSites\main\libs\Database\mysql.php on line 123 


Как бы тоже логично, потому что вне классов у меня эти переменные нигде не указаны. Действительно, откуда же он их возьмёт? Но как быть? Конструктор Database - без параметров. Конструктор MySQL - 4 параметра, но в этом конструкторе я вызываю parent::__construct() и всё нормально. Конструктор MySQL_StoredProcs без параметров, НО у родителя 4 параметра, а где их определить - непонятно. Или MySQL_StoredProcs делать тоже с 4 параметрами? Но для чего тогда наследование вообще? Что-то непонятно в этой части...

Автор: s0lman 16.9.2011, 12:39
Чтоб передать параметры, их надо где-то взять, например, считать из конфига или захардкодить smile 
Что-то подобное есть?

Автор: vfz4z 22.12.2011, 14:29
Ага. Рекомендую использовать пер-ю в конфиге, типа 

Код

return array(
      'connectionString' => 'mysql:host=mysql.nt;dbname=errd',      
      'username' => 'root',
      'password' => 'nt13579',
      'charset' => 'utf8',
      'tablePrefix' => 'errd_',

    );


и в родительском классе инициализировать подключение....

Добавлено через 1 минуту и 1 секунду
код из yii. А вообще я не сторонник изобретения велосипедов. Готовых orm оч. много... На край просто можно посмотреть как сделано

Автор: krundetz 22.12.2011, 16:09
может для MySQL_StoredProcs сделать такой конструктор?
Код

public function __construct($host, $user, $password, $dbname) {
    parent::__construct($host, $user, $password, $dbname);
}

Автор: Fortop 26.2.2012, 20:46
Мне кажется тут ошибка проектирования

Что за класс MySQL_StoredProcs?

И почему он потомок от MySQL

Логичнее было бы иметь что-то вида

Код

class MySQL_StoredProcs {
    protected $_db = null;

    public function __construct(MySQL $db) {
        $this->_db = $db;
    }

    public function query($sql) {
        return $this->_db->query($sql);
    }
}

Автор: krundetz 27.2.2012, 12:13
Fortop, 2 месяца теме.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)