Изучение ООП на PHP, простой класс подключения к MySQL.


Я выложил более раннюю версию это и вот это усовершенствованная версия из отзывов я получил. Некоторые из отзывов, которые я получил;

  • Не цепным методом (старался ограничить это)
  • Не используйте печать() или Die() и сообщение об ошибке (все-таки немного потерял, но я сделал попытку использовать редирект на собственную страницу ошибки)

Я пытался переписать код, я еще очень новичок в этом так что идти легко. Я читал о методологии ООП и читать о взаимодействии и реализации, поэтому я попытался включить это в мой класс.

Я бы хотел увидеть несколько разных идей о том, как сделать это наиболее эффективно, насколько это возможно. Я уверен, что он должен кучу меняется, но именно поэтому я здесь, чтобы помочь мне учиться и расти. Я визуал, поэтому если можно код было бы удивительным, но любой ответ будет высоко оценен.

<?php
class Mysql
{
        private $user;
        private $pass;
        private $data;
        private $host;

        public function __construct($user,$pass,$data,$host)
        {
                $this->user = $user;
                $this->pass = $pass;
                $this->data = $data;
                $this->host = $host;
                $this->process();
        }

        /* INTERFACE */
        private function process()
        {
                if($this->verifyNullFields()==true)
                {
                        if($this->verifyDatabaseConnection()==true)
                        {
                                if($this->verifyDatabaseExist()==true)
                                {
                                        print('ALL PASSED'); //for debugging
                                }
                                else
                                {
                                        print('redirect to custom error page will go here');
                                }
                        }

                        else
                        {
                                  print('redirect to custom error page will go here');
                        }

                }
                else
                {
                        print('redirect to custom error page will go here');
                }
        }

        /* IMPLEMENTATIONS */
        private function verifyNullFields()
        {
                if($this->user != NULL)
                {
                        if($this->data != NULL)
                        {
                                if($this->host != NULL)
                                {
                                        return true;
                                }
                                else
                                {
                                        return false;
                                }

                        }
                        else
                        {
                                return false;
                        }
                }
                else
                {
                        return false;
                }
        }
        private function verifyDatabaseConnection()
        {
                $link = @mysql_connect($this->host,$this->user,$this->pass);
                if(!$link)
                {
                        return false ;
                }
                else
                {
                        return true;
                }
        }
        private function verifyDatabaseExist()
        {
                $db = @mysql_select_db($this->data);
                if(!$db)
                {
                        return false;
                }
                else
                {
                        return true;
                }
        }
}
?>
<?php
$m = new Mysql("root","","magic","localhost");
?>


26044
4
задан 13 мая 2011 в 02:05 Источник Поделиться
Комментарии
3 ответа

Позвольте мне показать мой вариант этого кода:

DatabaseException.php:

class DatabaseException extends Exception {
}

Database.php:

abstract class Database {
protected $login;
protected $password;
protected $database;
protected $hostname;

public function __construct($login, $password, $database, $hostname) {
// NB: password not checked and may be empty
$this->throwExceptionIfNotSet('login', $login);
$this->throwExceptionIfNotSet('database', $database);
$this->throwExceptionIfNotSet('hostname', $hostname);

$this->login = $login;
$this->password = $password;
$this->database = $database;
$this->hostname = $hostname;
}

private function throwExceptionIfNotSet($argName, $argValue) {
if (empty($argValue)) {
throw new DatabaseException("'${argName}' not set");
}
}

}

Mysql.php:

class Mysql extends Database {

private $link = null;

public function __construct($login, $password, $database, $hostname) {
parent::__construct($login, $password, $database, $hostname);
$this->connect();
$this->selectDatabase();
}

public function connect() {
if (! is_null($this->link)) {
return;
}

$link = @mysql_connect($this->hostname, $this->login, $this->password);
if (! $link) {
throw new DatabaseException(
sprintf(
'Cannot connect to database. mysql_connect() to %s with login %s fails',
$this->hostname,
$this->login
)
);
}
}

public function selectDatabase() {
$ret = @mysql_select_db($this->database, $this->link);
if (! $ret) {
throw new DatabaseException("Cannot select database {$this->database}");
}
}

}

application.php:

try {
$db = new Mysql('root', '', 'magic', 'localhost');
print('ALL PASSED'); //for debugging

} catch (DatabaseException $ex) {
print('redirect to custom error page will go here');
}

4
ответ дан 13 мая 2011 в 04:05 Источник Поделиться

Это уже старый вопрос, нужен другой ответ. Никто не предупредил об опасном характере оператор@!

ошибки @ подавляет (скрывает их). Это очень плохая вещь. Вы можете использовать его, и уйти с ним, если вы делаете все правильно (проверка булевых флагов и т. д.). Но когда вы сделаете ошибку, вы не будете знать, почему. Я делаю ошибки, все, кого я знаю. Итак, я предлагаю против использования оператора@.

mysql_* является устаревшим теперь тихо (используйте PDO или mysqli как).

Ваши имена методов могут быть улучшены:


  • процесс дает мне понятия не имею, что он делает.

  • verifyDatabaseConnection фактически подключается к базе данных! проверьте, должны только использоваться, чтобы проверить вещи, а не вещи.

  • verifyDatabaseExist аналогично выбирает базу данных (вы должны использовать правильный глагол).

Проблема с проверьте методы, что они делают 2 вещи. Подключения или опции, а затем Проверка.

Пожалуйста, прочитайте Джефф Этвуд-это уплощение стрелка код.

Продолжайте работать из конструктора для хорошего ОО. Не называй процесс. Хотя я бы никогда не написала mysql_* это то, что ваш класс должен выглядеть:

class Mysql
{
private $db;

public function __construct($host, $user, $pass)
{
$this->db = mysql_connect($host, $user, $pass);

if (!$this->db)
{
throw new RuntimeException(
__METHOD__ . ' could not connect to DB due to error: ' .
mysql_error());
}
}

public function selectDatabase($database)
{
$db_selected = mysql_select_db($database, $this->db);

if (!$db_selected)
{
throw new RuntimeException(
__METHOD__ . ' could not select database: ' . $database .
' error: ' . mysql_error());
}
}
}

Ошибки не будут подавлены, и это является простым и легким для чтения.

2
ответ дан 24 апреля 2012 в 04:04 Источник Поделиться

Пожалуйста, измените эту строку:

$link = @mysql_connect($this->hostname, $this->login, $this->password);

к этому:

$this->link = @mysql_connect($this->hostname, $this->login, $this->password);

0
ответ дан 3 июня 2011 в 11:06 Источник Поделиться