Приветствую! Рано или поздно более-менее опытный программист задает себе вопрос: хороший ли код я пишу? Могу ли я что-то улучшить? Как облегчить себе жизнь? В статье пойдет речь об использовании классов в PHP.
Класс — это некий объект, который можно использовать при написании кода. Говоря человеческим языком, класс — это набор более-менее унифицированных (хотя и не всегда) функций, которые могут использоваться в программах по несколько раз.
Простая задача: нам в нескольких частях программы нужно подключаться к базе данных, делать запрос и обрабатывать полученные данные. Разумеется, можно каждый раз писать mysql_connect, mysql_select_db, mysql_query и т.п. Однако ведь мы имеем один и тот же код в нескольких местах программы (пускай даже скрипт нам позволяет подключиться только раз, но сайт ведь не состоит из одного скрипта!) Здесь-то и начинает осознаваться необходимость классов. Мы можем вынести, в нашем случае, функции подключения к БД в отдельную функцию, а там, где необходимо подключение, просто вызывать эту функцию. В этой статье я не собирался подробно описывать классы, лишь хочу показать преимущества их использования.
Класс может иметь два вида переменных: общие (public) и закрытые (private). Отличие между ними в следующем: мы можем влиять на общие переменные из скрипта, а закрытые могут изменяться только внутри класса. Это связано с вопросами конфиденциальности и безопасности.
Удобными средствами классов являются конструкторы и деструкторы. Конструктор — это функция, вызываемая при создании экземпляра класса (т.е., вызова его из скрипта). В PHP функция конструктора, или просто конструктор, должна называться __construct. Соответственно, деструктор представляет функцию, которая выполняется по завершении работы класса и должна называться __destruct.
Итак, нашему классу для работы с БД необходим отдельный файл, пусть db.class. В нем мы и создадим функцию подключения. Листинг класса (пояснения ниже):
<?php
class Db {
private $host;
private $database;
private $name;
private $pass;
private $link;
public $query;
// Конструктор
public function __construct ($h, $n, $p, $b) {
$this->host=$h;
$this->name=$n;
$this->pass=$p;
$this->database=$b;
}
// Функция подключения к БД
public function connect() {
if (!($this->link=mysql_connect($this->host,$this->name,$this->pass))) {
$this->error('Не могу подключиться к '.$this->host);
$noerrors=false;
}
if (!mysql_select_db($this->database)) {
$this->error('Не могу войти в базу '.$this->database);
$noerrors=false;
}
return $noerrors;
}
// Функция выполнения запроса
public function query() {
$this->lQueryResult=mysql_query($this->query)
or $this->error('Не могу выполнить запрос');
return $this->lQueryResult;
}
}
?>
В начале класса мы объявили переменные, которые будут использованы при работе этого класса (переменная link будет содержать идентификатор соединения MySQL). Рассмотрим конструктор. Переменные $h, $n, $p, $b будут задаваться при создании экземпляра класса. Они будут содержать параметры подключения — сервер, имя БД, пользователь, пароль. Конструкция $this->имя_переменной=значение присваивает переменной этого класса указанное значение. Это удобно, т.к. в разных классах могут быть переменные с одинаковым именем, а таким образом мы точно будем знать, к переменной из какого класса мы обращаемся. Далее функция подключения connect(). В первом условном блоке мы пытаемся присвоить переменной $link идентификатор соединения с БД. Если происходит ошибка, мы вызываем вымышленную функцию error() и задаем ей текст сообщения об ошибке (эту функцию для упрощения примера мы включать в класс не будем). В следующем условном блоке мы пытаемся выбрать БД, и, если этого не происходит, снова вызываем функцию ошибки. Функция connect() возвращает в переменной $noerrors значение false в случае ошибки.
Функция выполнения запроса query() очень проста: в ней мы присваиваем результат выполнения запроса, содержащегося в переменной $query, переменной $lQueryResult, либо вызываем функцию error() в случае ошибки. Функция query() возвращает результат запроса, который далее будет использоваться при создании массива для обработки и вывода данных.
Теперь, после того как мы создали класс, попробуем его использовать. Для этого необходимо подключить файл класса в наш PHP-скрипт, создать экземпляр класса, использовать его функции (называемые методами класса) и вывести результат. Листинг PHP-скрипта (описание ниже):
<?php
require ('db.class');
$Db=new Db (‘localhost’, ‘user’, ‘password’, ‘db’);
$Db->connect();
$Db->query="SELECT id, name FROM my_table";
$Db->query();
while ($lRes=mysql_fetch_array($Db->lQueryResult)) {
echo ‘(’.$lRes[id].’) ’.$lRes[name].’<br>’;
}
?>
Рассмотрим этот скрипт построчно. Для работы с классом необходимо подключить к скрипту файл, где размещен класс. Дальше мы создаем экземпляр класса, т.е. говорим, что хотим использовать функции (методы) класса Db с помощью переменной $Db. При создании экземпляра класса мы указали параметры для подключения к БД, которые перехватывает конструктор в классе. После этого вызываем функцию connect(), которая соединяется с БД. Дальше присваиваем переменной $query значение нашего запроса, после чего вызываем функцию query() для его выполнения. После присваиваем переменной $lRes результат запроса и в цикле выводим полученные данные.
Просто? Для начала не слишком понятно, однако в более сложных задачах такой подход значительно облегчит и структурирование программы, и удобство ее использования, и легкость ее модификации. К примеру, постраничный вывод результатов поиска. Мы просто передаем результат выполнения запроса нужному классу, он выполняет необходимые операции для разбиения по страницам, нам же только остается сказать echo $result.
Если изначально продумать класс и требуемые от него функции, можно значительно эффективнее использовать свое время, код будет значительно читабельнее. В конце концов, использование классов — это просто хороший тон.
Успехов!