Лабораторная работа №5. Объекты и классы в PHP
Класс как тип данных
До сих пор в программах мы оперировали переменными, хранящими значения определенного типа. В основном использовались типы string (строка) и douЫe (вещественное число), реже- array (ассоциативный массив). Для работы с такими переменными существует целый ряд операций: арифметические - для чисел; strlen (), substr () и т. д. - для строк; count (), array _merge () и др. - для массивов. ООП позволяет нам вводить новые типы данных в дополнение к уже существующим.
Мы видим, что с каждой переменной (а точнее, с каждым типом данных) логически связаны данные двух видов: во-первых, это некоторый набор битов, представляющий само значение переменных, а во-вторых, набор функций и операторов, предназначенных для обработки этих битов. Легко видеть, что любой тип всегда может быть полностью описан в терминах данных и операций над ними.
Ключевым понятием ООП является класс. Класс можно рассматривать как тип некоторой переменной в том понимании, которое было описано в предыдущем абзаце.
|
|
Переменная класса (далее будем ее называть объектом класса) обычно имеет набор свойств (значений различных типов) и операций (или методов, функций), которые могут быть с ним проведены. Свойства и методы класса часто называют его членами.
Рис. 1. Переменные объявляются при помощи типа, объекты - при помощи класса
Так же как может существовать много переменных одного и того же типа (например, строкового), не связанных между собой, возможно и наличие в программе множества объектов одного и того же класса, различающихся своими свойствами.
Например, мы можем рассматривать тип int как класс. Тогда переменная этого "класса" будет обладать одним-единственным свойством (ее целым значением), а также набором методов (сложение, вычитание, инкремент и т. д.). При этом методы выглядят как арифметические операторы+,-,++ и т. д.
В языке С++ мы могли бы, действительно, объявить новый тип int именно таким образом. Однако в РНР дело обстоит немного хуже: мы не имеем права переопределять стандартные операции (сложение, вычитание и т. д.) для объектов. Например, если бы мы захотели добавить в язык комплексные числа, в С++ это можно было сделать без особых затруднений (и класс комплексных чисел по использованию практически не отличался бы от встроенного типа int), однако в РНР нам такое добавление не удастся.
Альтернативное решение состоит в том, чтобы везде вместо + и других операций использовать вызовы соответствующих функций, например, add (), которые бы являлись методами класса. Собственно, только такой способ организации методов и поддерживается в РНР (а также в Java).
|
|
Подход к созданию классов, применяемый в объектно-ориентированных языках, называют инкапсуляцией. Данные, принадлежащие классу, сохраняются в его свойствах, доступ к которым тщательно ограничивается и предоставляется в основном при помощи специальных методов.
Создание нового класса
Новый класс (тип данных) в программе описывается при помощи ключевого слова class. Внутри класса могут располагаться его свойства (переменные класса) и методы (функции-члены класса).
Давайте для тренировки опишем класс с именем мathComplex, объекты которого будут хранить комплексные числа (листинг 1). Этот класс пока поддерживает только сложение и вычитание чисел.
ПРИМЕЧАНИЕ
В математике комплексным числом называют пару двух вещественных чисел, первое из которых условно называют "действительной частью", а второе - "мнимой частью" комплексного числа. Все действительные числа соответствуют комплексным величинам с мнимой частью, равной нулю. Квадратный корень из -1, не существующий в виде действительного числа, имеет комплексное значение (0, 1), которое еще иногда обозначают знаком i. С комплексными числами можно выполнять все те же операции, что и с действительными - складывать, умножать, делить и т. д.
Листинг 1. Пример класс. Файл Math/Complex.php
Как видно из листинга 1, для объявления членов класса $re и $im мы воспользовались модификатором public, который более подробно будет освещен в следующих темах. "Добраться" до членов класса можно при помощи специальной переменной $this, которая всегда существует внутри методов (функций-членов) класса.
Файл, приведенный в листинге 1, при своем включении не выполняет никаких действий. Его задача - добавить в программу новый класс с именем мathComplex. В один файл можно добавлять множество классов, однако для облегчения поиска классов принято придерживаться рекомендации: один файл - один класс.
Работа с классами
Предположим, что в программе каким-то образом уже описан некоторый класс. Так как класс - это, по сути, тип данных, мы должны иметь некоторый механизм для создания переменных, хранящих значение этого типа.