ФорумПрограммированиеPHP для идиотовPHP и ООП → непонятки с ООП

непонятки с ООП

  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 10 февраля 2010 г. 16:54, спустя 4 минуты 50 секунд

    рhpdude, phpdude, воистину неделя дуда))))
    рhpdude, тот, что Артеду. Так я с реальной и ебусь. Более того, мн за нее еще и деньги платят гы)
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 10 февраля 2010 г. 16:55, спустя 58 секунд

    тогда не торопись ;) пусть платят
    ιιlllιlllι унц-унц
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 10 февраля 2010 г. 17:45, спустя 50 минут 31 секунду

    artedooo, :)
    Платят мне за факт сделанной работы. Но ООП то надо учить ка нибудь =)
    PS Посмотрите бегло упрощенный класс для работы с БД. Коннект, дисконект, выполнение запросов и настройки базы собирает с движков. Выполнять селекты мне будет не надо. Видимо только инсерт и апдейт. Если что - допишу еще. Не проблема. Мне главное узнать на сколько это правильно с точки зрения ооп. Ну и послушать, как дуд меня обосрет :D
    <?php
    class DB // Класс работы с базой данных
    {
    // Объявление членов класса
    protected $cms="";
    protected $id="";
    public $pref="";
    protected $link="";
    protected $host="";
    protected $user="";
    protected $pass="";
    protected $base="";

    // Тут подключаемся к базе выбранной кмс.
    public function __construct($cms = "DLE")
    {
    $this->cms = (strtoupper($cms) == "DLE") ? strtoupper($cms) : "SE";
    $this->connect();
    }

    // Тут закроем соединение с базой.
    public function __destructor()
    {
    $this->disconnect();
    }

    // Коннект к базе
    private function connect ()
    {
    $this->config();
    $this->id = mysql_connect($this->host, $this->user, $this->pass);
    if (!$this->id) throw new Exception ("Не удалось подключится к базе.");
    if (!mysql_select_db($this->base, $this->id)) throw new Exception ("Не удалось найти выбранную базу данных");
    $this->query("SET NAMES " . $this->charset . ";");
    }

    // Закрытие соедиения с базой
    private function disconnect ()
    {
    if(mysql_close($this->id)) throw new Exception ("Не удалось закрть соединение с базой.");
    }

    // Извлекаемм настройки подключения к базе.
    private function config ()
    {
    if ($this->cms == 'DLE')
    {
    if (!require_once ("engine/data/dbconfig.php")) throw new Exception ("Не удалось найти файл конфигурации DLE.");
    $this->host = DBHOST;
    $this->user = DBUSER;
    $this->pass = DBPASS;
    $this->base = DBNAME;
    $this->charset = COLLATE;
    $this->pref = PREFIX . "_";

    }
    elseif ($this->cms == 'SE')
    {
    if (!require_once (SE_FOLDER . "/include/database_config.php")) {throw new Exception ("Не удалось найти файл конфигурации SE.");}
    $this->host = $database_host;
    $this->user = $database_username;
    $this->pass = $database_password;
    $this->base = $database_name;
    $this->pref = "se_";
    $this->charset = "UTF8";
    }
    }

    // Выполение запросов
    public function query ($query)
    {
    if (!$this->id) throw new Exception ('Вы не были подключены к базе.');
    if (!$this->link = mysql_query ($query, $this->id)) throw new Exception ("Не удалось выполнить запрос. Ошибка: ".mysql_error($this->id));
    return $this->link;
    }

    // Уничтожаем объект в духе ООП :)
    public function destroy()
    {
    unset($this);
    }
    }
    ?>
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 10 февраля 2010 г. 18:32, спустя 46 минут 42 секунды

    if(mysql_close($this->id)) throw new Exception ("Не удалось закрть соединение с базой.");

    ниче странного не замечаешь ?
    Спустя 79 сек.
    + у тебя есть метод query()
    а где же метод fetch() ?
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 10 февраля 2010 г. 18:37, спустя 4 минуты 39 секунд

    Я не сразу вспомнил, что мне нужен фетч. Когда код кидал - думал, что будут только insert запросы делать. fetch напишу.
    Странность пропустил. Спасибо.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 10 февраля 2010 г. 18:39, спустя 2 минуты 48 секунд

    + зачем в методе query() проверка линка ?
    у тебя в конструкторе он уже проверяется
    Спустя 108 сек.
    ну и самое главное,
    у тебя по всему проекту должна быть только одна сущность твоего обьекта DB.
    ну или столько, сколько баз одновременно используется в проекте
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 10 февраля 2010 г. 18:46, спустя 6 минут 41 секунду

    2 базы используется одновременно. Их можно конечно по очереди, но пожалуй это не удобно будет.
    проверка в методе query() - следствие дебага). Удалю.
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 10 февраля 2010 г. 19:03, спустя 17 минут 8 секунд

    ну и самое главное,
    у тебя по всему проекту должна быть только одна сущность твоего обьекта DB.
    ну или столько, сколько баз одновременно используется в проекте

    NRG, я не очень понял то, что ты этим хотел сказать. Это какой то недостаток? Проверка нужна?
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 10 февраля 2010 г. 19:05, спустя 1 минуту 41 секунду

    SpartakuS, страшная у тебя аватарка, есть фото получше?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 10 февраля 2010 г. 19:10, спустя 5 минут 32 секунды

    adw0rd, да она реально страшная. Я с разбитым еблом, пьяный в хлам и не помнящий всего действия происходящего там.
    Ну а вообще я на фото плохо получаюсь и норм фотки у меня только по синей теме. =) Ну посмотрю. Может что еще поставлю)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 10 февраля 2010 г. 19:12, спустя 1 минуту 14 секунд

    Спасибо :)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 10 февраля 2010 г. 19:15, спустя 3 минуты 2 секунды


    ну и самое главное,
    у тебя по всему проекту должна быть только одна сущность твоего обьекта DB.
    ну или столько, сколько баз одновременно используется в проекте

    NRG, я не очень понял то, что ты этим хотел сказать. Это какой то недостаток? Проверка нужна?
    я хотел сказать, что он должен быть синглтоном
    Спустя 164 сек.
    я твой класс вижу приблизительно таким

    <?php

    class NRG_Mysql
    {
    /**
    * Host to connect
    */
    protected $_host = 'localhost';

    /**
    * Database user
    */
    protected $_user = 'root';

    /**
    * User password
    */
    protected $_pswd = '';

    /**
    * Port number
    */
    protected $_port = 3306;

    /**
    * Database name
    */
    protected $_database = 'trunk';

    /**
    * Mysql link identifier
    */
    private $_linkIdentifier;

    /**
    *
    */
    public function __construct()
    {
    try {
    $this->_linkIdentifier = @mysql_connect($this->_host . ':' . $this->_port, $this->_user, $this->_pswd);
    if (!$this->_linkIdentifier){
    throw new Exception('Can\'t connect to host: ' . $this->_host);
    }
    if (!mysql_select_db($this->_database, $this->_linkIdentifier)) {
    throw new Exception('Can\'t use database: ' . $this->_database);
    }
    } catch (Exception $e) {
    echo '<b>Caught exception:</b> ' . $e->getMessage();
    }
    }

    /**
    * Execute Query
    *
    * @param string $sql
    * @return NRG_Mysql
    */
    public function query($sql)
    {
    $this->_queryResult = mysql_query($sql, $this->_linkIdentifier);
    return $this;
    }

    /**
    * Fetch query result by specified type
    *
    * @param string $type
    * @return mixed
    */
    public function fetch($type = 'row')
    {
    $fetchFunction = 'mysql_fetch_' . $type;
    return $fetchFunction($this->_queryResult);
    }
    }


    зы: не приебыватся, накидал на скорую руку, может и не работать, и пару методов упустил =)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 10 февраля 2010 г. 19:22, спустя 7 минут 12 секунд

    и еще одно , твой класс DB не должен вообще ничего знать о существовании каких либо цмс или чтотам у тебя в методе config() ….
    ты всеголишь должен сделать чтото типа NRG::getModel('core/config')->getDatabaseSettings();
    а вот твоя модель конфига уже сама разбирается какие парметры для соединения отдавать
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 10 февраля 2010 г. 19:31, спустя 8 минут 44 секунды

    NRG, на счет последнего действительно упустил момент.
    И вот вопрос. Как лучше?
    В конструкте вызвать метод коннект или прямо там сделать код подключения? Или все равно?
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 10 февраля 2010 г. 19:46, спустя 15 минут 34 секунды

    коннект к базе делай в конструкторе
    если вынесешь сам коннект в отдельный метод а его вызовешь в конструкторе то ниче страшного

Пожалуйста, авторизуйтесь, чтобы написать комментарий!