А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/oop/
Rambler's Top100
Пишем на PHP: ООП и наши классы

Здрасьте. Еще не забыли, что мы пишем грандиозный web-проект под кодовым названием "Колонка обозревателя"? Если забыли, начните читать все с самого начала.

А для тех, кто не страдает ретроградной амнезией, мы продолжим наше планирование.

У нас уже есть спланированные директории на диске и база данных для наших будущих обзоров. Теперь пора перейти к определению функций нашей будущей системы и разделению их на тематические группы.

Сразу хочу вас обрадовать. Писать мы будем все в ООП (Объектно-Ориентированном Программировании). Бояться тут нечего. В PHP ООП развито не на самом высоком уровне, никакими страшными ООП-конструкциями я вас пугать не собираюсь. Но и без ООП нам не обойтись, если мы пишем большой серьезный проект.

Для тех, кто писал когда-нибудь на каком-нибудь языке, но не писал в ООП, я расскажу о ключевых отличиях ООП от обычного "прямого" программирования.

В ООП все функции и переменные объединяются в классы (class). Классы между собой объединяются "наследованием" (extends). Наследование происходит в одну сторону: от отца к сыну. Причем, сын наследует все возможности отца.
Предположим, что класс "first" имеет в своем теле две переменные и две функции, работающие с этими переменными:

class first
{
 var $a1;
 var $b2;

 function f_increment($x) 
 {
  settype($x,"integer");
  $this->$a1=$this->a1+$x;
  return(0);
 }

 function f_ab() 
 {
  $this->$a1=$this->a1+$this->$b2;
  return(0);
 }

}


Это мы объявили переменные $a1 и b2, и две функции. Первая получает в качестве параметра некое значение x, которое приводит к целому числу, и прибавляет его (число) к глобальной переменной $a1, возвращает "0" в качестве кода ошибки (0 — нет ошибок). Вторая функция просто плюсует наши две объявленные переменные и результат записывает в переменную $a. Тоже возвращает код ошибки. Привыкайте всегда возвращать код ошибки выполнения любой функции!


    Напомню, что я стараюсь писать понятно, а не эффективно. Эффективность пусть каждый для себя ищет сам. Это замечание для снобов, которые могут сейчас сказать, что мой демонстрационный код можно было написать намного короче. Да это так. Но кто меня поймет, если я напишу все тело первой функции вот так:
    $this->$a+=(int)$x;
    Можно так написать. Но это не очень понятно для тех, кто слабо знаком с синтаксисом PHP или C. Давайте уважать психику других.



Обратите внимание на конструкцию $this->. Таким образом внутри класса мы обращаемся к любому объявленному объекту класса. Будь то переменная или функция.

ООП тем и приятно, что нам в конструкциях вызова процедур или переменных не надо ничего менять. Функция отличается от переменной во время вызова только тем, что содержит у себя "на хвосте" дополнительные параметры или пару пустых скобок, если параметров нет.

$this->labuda — это переменная.
$this->labuda() — это функция.

echo "Результаты работы: ".$this->labuda()." и ".$this->labuda; — вывод обоих значений: значение переменной будет выведено как есть, а функция отработает и выдаст результат своей работы не хуже переменной. Точка "." в PHP используется для слияния двух строк:
"123"."abc" = "123abc"

    Обращаю внимание: переменная и функция вполне могут иметь одинаковые имена, интерпретатор PHP сам разберет "кто есть who", если вы не будете забывать про скобки на хвосте у функций. В больших проектах я этим часто пользуюсь, чтобы не путаться.

Возвращаясь к наследованию.

Мы создаем класс "second", от класса "first":

class second extends first
{
...
}

Даже если на месте двоеточия (в теле класса) мы не определим ни одной переменной или функции, мы можем пользоваться теми, которые были описаны в классе first.

Таким образом, в ООП создают классы и наследуют их, двигаясь от общего к частному. Получается четкая древовидная структура классов, которую мы и создадим для нашего проекта. В PHP не реализовано множественное наследование. Т.е. каждый новый класс может рождаться только от одного родителя. Нам этого будет вполне достаточно.

Это пока основное, что вам надо знать про отличия ООП от обычного.

Вернемся к планированию.

Скажу вам по секрету, что это почти все мои веб-проекты делятся на следующие тематические группы скриптов (я эти группы буду сразу называть классами, пользуясь терминологией ООП. А каждый класс мы будем хранить в отдельном файле с окончанием ".class"):

1. Класс переменных описывающих свойства проекта (class_var). Этот класс я обычно делаю изначальным, в котором описываю глобальные переменные, влияющие на работу всего проекта. Такие, как: пути на диске, время кеширования страниц, стандартные названия, форматы отображения времени и даты, и так далее.

2. Класс class_mysql наследуется от class_var. По названию класса не сложно догадаться, что он посвящен работе с базой данных MySQL. Это будет небольшой класс.

3. Класс class_util содержит все глобальные утилиты, которые могут нам понадобиться на любом из этапов выполнения нашей задачи. Кроме того, в этом классе мы опишем важнейшую часть проекта: обработку ошибок.

Эти три класса можно было бы объединить в один, т.к. все остальные классы будут наследоваться от class_util, но я всегда держу их именно в разных файлах. Так проще вносить изменения в нужное место.

Давайте думать далее. У нас есть три основные группы скриптов. Группа, отвечающая за добавление данных в базу сайта. Группа, отвечающая за вывод данных из базы. И группа, отвечающая за выполнение периодических (cron) задач.

Вот мы и определим три основных класса:

class_in
class_out
class_cron


Надеюсь, не надо пояснять, какой класс за что будет отвечать.

Ну, хватит на сегодня. В качестве домашнего задания рекомендую графически отобразить генеалогическое древо наших классов. Это даст вам возможность понять красоту планирования.

[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin