Пятница, 17.05.2024, 02:13
DigitalBox
Приветствую Вас Гость | RSS
Главная Определение класса Регистрация Вход
Меню сайта

Определение класса



После выявления требуемых объектов, их свойств и методов можно приступать к определению соответствующих классов. Класс является шаблоном (каркасом) для создания объектов.


Создание класса

Выражение class используется для определения свойств и методов класса и имеет следующий синтаксис:

class имяКласса
{
     Определение свойств класса
     Определение методов класса
}

В качестве имени класса можно использовать любой корректный идентификатор РНР, кроме stdClass — зарезервированного служебного имени РНР.

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

class whiteRose extends Rose
{
     Определение свойств класса
     Определение методов класса
}

Объект, созданный на основе этого класса, будет иметь доступ ко всем свойствам и методам как класса whiteRose, так и Rose. Однако класс Rose не имеет доступа к свойствам и методам класса-наследника.

Следующие несколько разделов посвящены вопросам, связанным с определением свойств и методов класса. Более исчерпывающий пример создания класса приведен ниже, в разделе "Собирая все вместе".


Определение свойств

При создании класса все его свойства следует объявить в начале соответствующего блока:

class Car
{
     var $color;
     var $tires;
     var $gas;
     Методы
}

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

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

  • Следующие выражения можно использовать в качестве значений по умолчанию:
         var $color = "черный";
         var $gas = 10;
         var $tires = 4;
  • Эти выражения нельзя использовать в качестве значений по умолчанию:
         var $color = "синий"." черный";
         var $gas = 10-3;
         var $tires = 2*2;

В качестве переменных можно также использовать массивы, в которых содержатся простые значения.

var $doors = array("передняя часть", "задняя часть");

Значения соответствующих переменных класса при создании объекта можно задавать или изменять, используя конструктор (который описывается ниже, в разделе "Создание конструктора") или любой другой метод, предназначенный для этих целей.


Использование переменной $this

Внутри класса специальная переменная $this представляет собой ссылку на этот же класс. При этом ее нельзя использовать вне класса. Эта переменная обеспечивает доступ к переменным и методам класса внутри самого класса. Для использования переменной $this можно использовать следующий синтаксис:

$this->имя_переменной

Например, для доступа к атрибуту $gas класса Саr следует воспользоваться выражением:

$this->gas

Таким образом, с помощью переменной $this можно манипулировать атрибутом $gas внутри класса, как, например, в следующих примерах:

$this->gas = 20;
if($this->gas > 10)
$product[$this->size] = $price

Как видно в приведенных примерах, выражение $this->имя_переменной используется внутри класса точно так же, как и переменная $имя_переменной в сценарии.

Обратите внимание на то, что символ $ используется только перед именем this , а не gas. Если воспользоваться выражением $this->$gas, оно будет неправильно проинтерпретировано. При этом может возникнуть (а может, и нет) ошибка, однако в любом случае это не будет иметь никакого отношения к ссылке на переменную $gas текущего класса.


Добавление методов

Методы определяют функциональность объектов и определяются точно так же, как и обычные функции. Например, для класса "автомобиль" может понадобиться метод, который будет обеспечивать заправку бензином его бака. В классе может содержаться переменная $gas, значение которой будет соответствовать количеству бензина, содержащегося в баке в текущий момент. Можно определить метод, который будет добавлять к этой переменной значение $amount (количество заправленного бензина). Это можно осуществить следующим образом:

class Car
{
     var $gas = 0;
     function addGas($amount)
     {
          $this->gas = $this->gas + $amount;
          echo "в бак залито $amount галлонов бензина";
     }
}

Функция addGas() выглядит как обычная функция, но поскольку она находится внутри класса, то является его методом.

В языке РНР определено несколько специальных методов, имена которых начинаются с двух символов подчеркивания (__). В этом разделе рассматриваются три из них: construct, destruct и clone. Поэтому имена своих методов лучше не начинать с двух символов подчеркивания, если только не переопределяется один из специальных методов.


Создание конструктора

Конструктор (constructor) — это специальный метод класса, который выполняется при создании объекта. Конструктор использовать необязательно, если при создании объекта не нужно присваивать значения атрибутам или выполнять какие-либо действия. В классе может содержаться только один конструктор.

Конструктор имеет специальное имя (construct), поэтому интерпретатор РНР всегда знает, какой метод нужно выполнять при создании объекта. Конструктор имеет примерно следующий вид:

function construсt ()
{
     $this->gas =10; # бак заполнен полностью
     $this->openDoor();
}

Этот конструктор создает новый автомобиль (т.е. объект) с полным баком и открытой дверью.

До версии РНР 5 имя конструктора совпадало с именем класса. При этом классы, созданные для более ранних версий интерпретатора, могут использоваться и в РНР 5. При Создании объектов интерпретатор РНР 5 сначала пытается вызвать конструктор с именем __construct(). Если такой метод отсутствует, вызывается метод с именем, совпадающим с именем класса.


Собирая все вместе

Класс должен содержать столько атрибутов и методов, сколько необходимо. Эти методы могут быть как простыми, так и сложными. Однако цель объектно-ориентированного программирования заключается в том, чтобы сделать методы как можно более рациональными. Лучше использовать несколько небольших функций и вызывать один метод внутри другого, а не реализовывать все требуемые действия в одной функции. Рассмотрим следующий пример:

class MessageHandler
{
     var $message = "Сообщения нет";
     function __construct($message)
     {
          $this->message = $message;
     }
     function displayMessage()
     {
          echo $this->message. "\n";
     }
}

Класс MessageHandler имеет один атрибут $message, в котором хранится сообщение, и один метод displayMessage, предназначенный для его вывода. Предположим, необходимо добавить метод, который будет преобразовывать символы сообщения в нижний регистр, а затем выводить их на экран. Это можно выполнить таким образом:

class MessageHandler
{
     var $message = "Сообщения нет";
     function construct($message)
     {
          $this->message = $message;
     }
     function displayMessage()
     {
          echo $this->message. "\n";
     }
     function lowerCaseMessage()
     {
          $this->message = strtolower($this->message);
          $this->displayMessage() ;
     }
}

Обратите внимание на метод lowerCaseMessage(). Поскольку класс уже содержит метод для вывода сообщения, в новом методе lowerCaseMessage() используется именно этот метод. Если при создании нового метода оказалось, что часть его кода уже использовалась в другом методе, нужно выполнить их повторное проектирование. В одном и том же классе не должно быть повторяющегося кода.

В листинге ниже приведен более сложный пример класса, который можно использовать для создания HTML-форм. Для некоторого упрощения примера в форме содержатся только текстовые поля.

‹?php
/* Имя класса: form
  * Описание: класс, создающий простую HTML-форму с
  * одним текстовым полем. Класс содержит 3 метода.
  */
class Form
{
     var $fields=array(); # содержит имя поля
     var $processor;         # имя программы обработки данных формы
     var $submit = "Отправить данные"; # имя кнопки Submit
     var $Nfields = 0 ;      # количество полей формы
/* Конструктор: передается имя сценария обработки данных
  * ($processor) и имя кнопки.
  */
     function __construct($processor, $submit)
     {
          $this->processor = $processor;
          $this->submit = $submit;
     }
/* Функция отображения формы.
  */
     function displayForm()
     {
          echo "<form action='{$this->processor}' method='post'>";
          echo "<table width='100%'>";
          for($j=l;$j<=sizeof($this->fields);$j++)
          {
               echo "<tr><td align=\"right\">
                           {$this->fields[$j-1]['label']}: </td>\n";
               echo "<td>
                           <input type='text'
                              name='{$this->fields[$j-1]['name']}'>
                           </td></tr>\n";
          }
         echo "<tr><td colspan=2 align='center'>
                      <input type='submit'
                           value= ' {$this->submit} ' ></tdx/tr>\n" ;
         echo "</table>";
     }
/* Функция для добавления поля формы. Ее параметрами
  * являются имя и метка поля.
  */
     function addField($name, $label)
     {
          $this->fields[$this->Nfields]['name'] = $name;
          $this->fields[$this->Nfields] [ 'label' ] = $label;
          $this->Nfields = $this->Nfields + 1;
     }
}
?›

В созданном классе Form содержатся четыре атрибута (свойства) и три метода. Ниже приведен перечень атрибутов:

  • $fields. Массив, содержащий поля формы, заполняемые пользователем.
  • $processor. Имя сценария, который обрабатывает данные, введенные пользователем в форме. Значение этой переменной используется в атрибуте action дескриптора form.
  • $submit. Текст, который отображается на кнопке submit.
  • $fields. Количество полей, добавленных в форму в текущий момент.

В классе Form содержатся следующие методы:

  • __construct(). Конструктор, который во время создания объекта присваивает атрибутам $processor и $submit значения, переданные пользователем.
  • addField(). Добавляет имя и метку поля в массив $fields. Например, если пользователь добавил в форму поля для ввода имени и фамилии, то этот массив будет иметь следующий вид:
         $fields[1][name] = first_name
         $fields[1][label] = FirstName
         $fields[2][name] = last_name
         $fields[2][label] = LastName
         и т.д.
  • displayForm(). Используется для вывода формы на экран, т.е. дескрипторов HTML, необходимых для создания формы. При этом используются имена и метки полей, содержащиеся в атрибутах класса.

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

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz