Помощь в освоении ООП!

Kostya\spb

Новичок
Помощь в освоении ООП!

Всегда любил изучать что-то новое, поэтому решил освоить ООП.
Взял в столе книгу "Профессиональное программирование на PHP 5" и начал читать. С каждой прочтенной страницей лес становится все темнее и темнее и что бы не заблудится в нем решил написать простенький класс. Так сказать получше освоиться в этом лесу да и вообще вдруг я мыслю не в ту сторону. Сделал класс соединения с базой mysql. Просьба знающих людей сказать что и где неправильно что бы я мог направить думать свои мысли в нужном направлении. Заранее спасибо за помощь!

PHP:
class mysql_db
{
    private $servername;
    private $username;
    private $password;
    private $database;
    private $connection_master;
    
    public function __construct($servername, $username, $password, $database)
    {
        $this->servername = $servername;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
    }

    public function connect()
    {
        $this->connection_master = $this->db_connect();

        if (!empty($this->connection_master)) {
            if (empty($this->db_select()) { return die(mysql_error()); }
            return $this->connection_master;
        } else {
            return die(mysql_error());
        }
    }

    private function db_connect()
    {
        return mysql_connect($this->servername, $this->username, $this->password);
    }

    private function db_select()
    }
        return mysql_select_db($this->database, $this->connection_master);
    }
}
 

Beavis

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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Kostyaspb
ООП само по себе не имеет ценности и смысла,
класс не может быть неправильным.

Можно оценивать правильность использования, проектирования, сложность разработки, повторного использования и цену поддержки конкретных решений или паттернов.
 

weregod

unserializer
Kostyaspb
1) если рассматривать класс как законченный, то его практическая ценность сомнительна, иными словами, чего-то не хватает ;)
2) если за созданием объекта этого класса всегда следует вызов метода connect(), то хранение $servername, $username, $password, $database в свойствах объекта избыточно
3) даже если к текущей имплементации добавить методы для практического использования класса, то поведение двух объектов класса с теоретическим подключением к разным БД в пределах одного MySQL-сервера может быть неожиданным из-за отсутствия четвёртого параметра при вызове ф-ции mysql_connect.
4) зачем нужны методы db_connect и db_select, если ф-цию mysql_error Вы всё равно используете в методе без префикса "db_"? :)

общая рекомендация: на будущее можно сразу посмотреть в сторону комментариев для автодокументеров (автоматических построителей документации к коду по самому коду) и описать типы параметров/результатов методов класса.
 

Kostya\spb

Новичок
2) если за созданием объекта этого класса всегда следует вызов метода connect(), то хранение $servername, $username, $password, $database в свойствах объекта избыточно
А если сделать что-то вроде этого?:
PHP:
    public function connect($servername, $username, $password, $database)
    {
        $this->connection_master = $this->db_connect($servername, $username, $password, $database);
     ...
3) даже если к текущей имплементации добавить методы для практического использования класса, то поведение двух объектов класса с теоретическим подключением к разным БД в пределах одного MySQL-сервера может быть неожиданным из-за отсутствия четвёртого параметра при вызове ф-ции mysql_connect.
А можно чуть чуть по подробнее по поводу этого?
 

Духовность™

Продвинутый новичок
С каждой прочтенной страницей лес становится все темнее и темнее
это нормально. остановись и читай все заново.

Сделал класс соединения с базой mysql
Хм, интересно, топикстартер хотел создать класс для работы с БД или он действительно хотел создать класс для коннекта, что бы передавать объект этого класса в класс для запросов? :) Кто как думает? Стоит ли идея свеч или нет? Подменяя объекты-коннекты можно использовать один и тот же экземпляр объекта БД. Или это бред?
 

Духовность™

Продвинутый новичок
Kostyaspb
Ну смотри: ты сделал " класс соединения с базой mysql". Я полагаю, что ты хотел сделать именно класс для работы с БД, а не класс ИМЕННО РЕСУРСА соединения? Так? Или именно класс для инстанцирования объекта соединения? Когда мы решим ЧТО ИМЕННО ты хочешь сделать, тогда и будем решать задачу. А сейчас не ясно, что на самом деле тебе надо.
 

Kostya\spb

Новичок
Автор оригинала: triumvirat
Kostyaspb
Ну смотри: ты сделал " класс соединения с базой mysql". Я полагаю, что ты хотел сделать именно класс для работы с БД, а не класс ИМЕННО РЕСУРСА соединения? Так? Или именно класс для инстанцирования объекта соединения? Когда мы решим ЧТО ИМЕННО ты хочешь сделать, тогда и будем решать задачу. А сейчас не ясно, что на самом деле тебе надо.
Думаю, что в создании рабочего класса только для соединения нет большого смысла. Поэтому пускай будет для работы с БД.
 

Духовность™

Продвинутый новичок
ок.

Конструктор у тебя уже есть.

Теперь давай напишем функцию connect. Она будет вызывать mysql_connect() только в том случае, если connection_master не является ресурсом и является null-ом. После вызова mysql_connect() connection_master должен содержать ресурс, возвращенный mysql_connect(), а если mysql_connect() вернет FALSE, то выброси исключение с текстом ошибки.
 

Kostya\spb

Новичок
Автор оригинала: triumvirat
ок.

Конструктор у тебя уже есть.

Теперь давай напишем функцию connect. Она будет вызывать mysql_connect() только в том случае, если connection_master не является ресурсом и является null-ом. После вызова mysql_connect() connection_master должен содержать ресурс, возвращенный mysql_connect(), а если mysql_connect() вернет FALSE, то выброси исключение с текстом ошибки.
Вот что получилось (у меня какое то странное чувство, что что-то тут не так):

PHP:
    public function connect() 
    {
        if(!is_resource($this->connection_master) and is_null($this->connection_master)) {
            try {
                $this->connection_master = $this->db_connect();

                if (!$this->connection_master) {
                    throw new Exception('ERROR CONNECT');
                } else {
                    return $this->connection_master;
                }
            } catch (Exception $e) {
                return $e->getMessage();
            }
        }
    }
 

A1x

Новичок
Kostyaspb
какой смысл выбрасывать исключение внутри метода и внутри того же метода его отлавливать?
 

Kostya\spb

Новичок
Автор оригинала: A1x
Kostyaspb
какой смысл выбрасывать исключение внутри метода и внутри того же метода его отлавливать?
Хм... Это мой первый опыт работы с исключениями.
Вечером с работы приду, попробую по другому сделать.
 

Духовность™

Продвинутый новичок
Kostyaspb
пиши полный код класса, а не по методам

про исключение тебе уже сказали. твой класс только выбрасывает исключение, ловит исключение уже код "выше" - ВНЕ класса:

try{
// подключение к БД
}
} catch (Exception $e) {
// материмся, выводим в шаблоне где-то....
}

Далее. weregod постами выше тебе написал, что твоя функция $this->db_connect() излишняя - каой в ней большой смысл?

далее, возвращать сonnection_master нет особого смысла - ты не в процедурном программировании. сonnection_master всегда доступен в области видимости класса.

итого получаем
PHP:
public function connect() 
{
    // подключение ещё не осуществлялось 
    if (!is_resource($this->connection_master))
    {
        // если произошла ошибка, выбрасываем исключение с кодом и описанием ошибки
        if (!$this->connection_master = @mysql_connect($this->servername, $this->username, $this->password))
        {
            throw new Exception('ERROR CONNECT: '.mysql_error());
        }
    }
}
-~{}~ 26.05.09 14:00:

теперь можно написать метод setCurrentDb($database_name) для установки активной БД :)
 
Сверху