<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
<stylesheet type="text/css">
.body{font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
}
.p{margin:0.5em 0 0 0.3em; padding:0.2em; text-align:justify;
}
</stylesheet>
<description>
<title-info>
<genre>sf_history</genre>
<author>
<first-name>Имя автора</first-name>
<last-name>Фамилия автора</last-name>
</author>
<book-title>Название книги</book-title>
<annotation></annotation>
<date>Дата</date>
<lang>ru</lang>
</title-info>
<document-info>
<author><nickname></nickname>
</author>
<program-used>Lib converter jcms</program-used>
<date value=""></date>
<src-url>http://johncms.com</src-url>
<id></id>
<version>1.0</version>
<history><p>book</p></history>
</document-info>
</description>
<body>
<title><p>Классы в PHP</p>
</title>
<section><p>Приветствую! Рано или поздно более-менее опытный программист задает себе вопрос: хороший ли код я пишу? Могу ли я что-то улучшить? Как облегчить себе жизнь? В статье пойдет речь об использовании классов в PHP. </p>
<p></p>
<p>Класс — это некий объект, который можно использовать при написании кода. Говоря человеческим языком, класс — это набор более-менее унифицированных (хотя и не всегда) функций, которые могут использоваться в программах по несколько раз. </p>
<p></p>
<p>Простая задача: нам в нескольких частях программы нужно подключаться к базе данных, делать запрос и обрабатывать полученные данные. Разумеется, можно каждый раз писать mysql_connect, mysql_select_db, mysql_query и т.п. Однако ведь мы имеем один и тот же код в нескольких местах программы (пускай даже скрипт нам позволяет подключиться только раз, но сайт ведь не состоит из одного скрипта!) Здесь-то и начинает осознаваться необходимость классов. Мы можем вынести, в нашем случае, функции подключения к БД в отдельную функцию, а там, где необходимо подключение, просто вызывать эту функцию. В этой статье я не собирался подробно описывать классы, лишь хочу показать преимущества их использования. </p>
<p></p>
<p>Класс может иметь два вида переменных: общие (public) и закрытые (private). Отличие между ними в следующем: мы можем влиять на общие переменные из скрипта, а закрытые могут изменяться только внутри класса. Это связано с вопросами конфиденциальности и безопасности. </p>
<p></p>
<p>Удобными средствами классов являются конструкторы и деструкторы. Конструктор — это функция, вызываемая при создании экземпляра класса (т.е., вызова его из скрипта). В PHP функция конструктора, или просто конструктор, должна называться __construct. Соответственно, деструктор представляет функцию, которая выполняется по завершении работы класса и должна называться __destruct. </p>
<p></p>
<p>Итак, нашему классу для работы с БД необходим отдельный файл, пусть db.class. В нем мы и создадим функцию подключения. Листинг класса (пояснения ниже): </p>
<p><?php</p>
<p>class Db {</p>
<p>private $host;</p>
<p>private $database;</p>
<p>private $name;</p>
<p>private $pass;</p>
<p>private $link;</p>
<p></p>
<p>public $query;</p>
<p></p>
<p>	// Конструктор</p>
<p>	public function __construct ($h, $n, $p, $b) {</p>
<p>$this->host=$h;</p>
<p>$this->name=$n;</p>
<p>$this->pass=$p;</p>
<p>		$this->database=$b;</p>
<p>	}</p>
<p></p>
<p>	// Функция подключения к БД</p>
<p>	public function connect() {</p>
<p>    </p>
<p>		if (!($this->link=mysql_connect($this->host,$this->name,$this->pass))) {</p>
<p>			$this->error('Не могу подключиться к '.$this->host);</p>
<p>			$noerrors=false;</p>
<p>		}</p>
<p></p>
<p>		if (!mysql_select_db($this->database)) {</p>
<p>			$this->error('Не могу войти в базу '.$this->database);</p>
<p>			$noerrors=false;</p>
<p>		}</p>
<p></p>
<p>		return $noerrors;</p>
<p></p>
<p>	}</p>
<p></p>
<p>// Функция выполнения запроса</p>
<p>	public function query() {</p>
<p></p>
<p>		$this->lQueryResult=mysql_query($this->query)</p>
<p>		or $this->error('Не могу выполнить запрос');</p>
<p></p>
<p>		return $this->lQueryResult;</p>
<p></p>
<p>	}</p>
<p></p>
<p>}</p>
<p>?></p>
<p></p>
<p>В начале класса мы объявили переменные, которые будут использованы при работе этого класса (переменная link будет содержать идентификатор соединения MySQL). Рассмотрим конструктор. Переменные $h, $n, $p, $b будут задаваться при создании экземпляра класса. Они будут содержать параметры подключения — сервер, имя БД, пользователь, пароль. Конструкция $this->имя_переменной=значение присваивает переменной этого класса указанное значение. Это удобно, т.к. в разных классах могут быть переменные с одинаковым именем, а таким образом мы точно будем знать, к переменной из какого класса мы обращаемся. Далее функция подключения connect(). В первом условном блоке мы пытаемся присвоить переменной $link идентификатор соединения с БД. Если происходит ошибка, мы вызываем вымышленную функцию error() и задаем ей текст сообщения об ошибке (эту функцию для упрощения примера мы включать в класс не будем). В следующем условном блоке мы пытаемся выбрать БД, и, если этого не происходит, снова вызываем функцию ошибки. Функция connect() возвращает в переменной $noerrors значение false в случае ошибки. </p>
<p></p>
<p>Функция выполнения запроса query() очень проста: в ней мы присваиваем результат выполнения запроса, содержащегося в переменной $query, переменной $lQueryResult, либо вызываем функцию error() в случае ошибки. Функция query() возвращает результат запроса, который далее будет использоваться при создании массива для обработки и вывода данных. </p>
<p></p>
<p>Теперь, после того как мы создали класс, попробуем его использовать. Для этого необходимо подключить файл класса в наш PHP-скрипт, создать экземпляр класса, использовать его функции (называемые методами класса) и вывести результат. Листинг PHP-скрипта (описание ниже):</p>
<p></p>
<p><?php</p>
<p>require ('db.class');</p>
<p></p>
<p>$Db=new Db (‘localhost’, ‘user’, ‘password’, ‘db’);</p>
<p>$Db->connect();</p>
<p></p>
<p>$Db->query="SELECT id, name FROM my_table";</p>
<p>$Db->query();</p>
<p></p>
<p>while ($lRes=mysql_fetch_array($Db->lQueryResult)) {</p>
<p>echo ‘(’.$lRes[id].’) ’.$lRes[name].’<br>’;</p>
<p>}</p>
<p>?></p>
<p></p>
<p></p>
<p>Рассмотрим этот скрипт построчно. Для работы с классом необходимо подключить к скрипту файл, где размещен класс. Дальше мы создаем экземпляр класса, т.е. говорим, что хотим использовать функции (методы) класса  Db с помощью переменной $Db. При создании экземпляра класса мы указали параметры для подключения к БД, которые перехватывает конструктор в классе. После этого вызываем функцию connect(), которая соединяется с БД. Дальше присваиваем переменной $query значение нашего запроса, после чего вызываем функцию query() для его выполнения. После присваиваем переменной $lRes результат запроса и в цикле выводим полученные данные. </p>
<p></p>
<p>Просто? Для начала не слишком понятно, однако в более сложных задачах такой подход значительно облегчит и структурирование программы, и удобство ее использования, и легкость ее модификации. К примеру, постраничный вывод результатов поиска. Мы просто передаем результат выполнения запроса нужному классу, он выполняет необходимые операции для разбиения по страницам, нам же только остается сказать echo $result. </p>
<p></p>
<p>Если изначально продумать класс и требуемые от него функции, можно значительно эффективнее использовать свое время, код будет значительно читабельнее. В конце концов, использование классов — это просто хороший тон. </p>
<p></p>
<p>Успехов!</p>
</section>
</body>
</FictionBook>