Создание нескольких объектов

Мы только что передавали методу add () обыкновенное число. Однако, конечно, в качестве параметра функции можно указывать все, что угодно, например объект другого (или того же самого) класса. Листинг 3 иллюстрирует ситуацию. В учебных целях мы создадим еще один класс, MathCornplex1, немного изменив его метод add (). Кроме того, мы добавили еще и метод для получения строкового представления комплексного числа, чтобы не выводить его каждый раз вручную.

Создание нескольких объектов - student2.ru

Листинг З Пример класса с методом. Файл Math/Complexl .php

Смотрите, мы явно указали перед параметром $у тип MathCornplex1. Это говорит РНР, что мы можем передавать в данную функцию только объекты этого класса, но не другого. Вот как может выглядеть корректное использование данного класса.

Создание нескольких объектов - student2.ru

Листинг 4 Вызов метода объекта. Файл calll.php

ПРИМЕЧАНИЕ

В отличие от таких языков, как С++ и Java, в РНР не поддерживается создание в одном классе нескольких методов с одинаковым именем, которые бы различались только типами и количеством аргументов. Поэтому-то нам и пришлось создавать класс MathComplex1, а не просто добавить новую функцию add () с аргументом типа MathComplex в имеющийся класс.

Перегрузка преобразования в строку

Посмотрите еще раз на листинг 3. Возможно, вы спросите: почему мы назвали функцию _tostring() столь длинным именем? И зачем эти неуклюжие символы подчеркивания?

Оказывается, в РНР существует ряд имен методов, начинающихся с двойных подчерков, которые имеют специальное значение. Мы только что затронули один из них: это функция __toString (). Она вызывается РНР автоматически всякий раз, когда мы затребуем неявное преобразование ссылки на объект в строку.

Создание нескольких объектов - student2.ru

Создание нескольких объектов - student2.ru

Листинг 5 Перегрузка интерполяции. Файл tostring.php

Обратите внимание, что мы вставляем объект $а прямо в строку, и в момент интерполяции переменных РНР вызывает метод __tostring (). Результат будет таким:

Значение: (314, 101)

Если бы не метод __toString () (например, при использовании класса MathComplex, который мы написали в самом начале этой главы), вывод был бы другим:

Catchable fatal error: Object of class MathComplex could not bе converted to string

Как видите, РНР генерирует ошибку, в которой сообщает о невозможности преобразования объекта класса МathComplex в строку.

Инициализация и разрушение

Давайте еще раз взглянем на листинги 4 и 5. Как видите, для корректного создания объекта нам недостаточно просто использовать оператор new: потом приходится еще инициализировать свойства объекта ($re и $im). Конечно, это утомительно, и о присваивании легко случайно позабыть, - в результате будет ошибка. В нашем примере инициализация очень проста, однако в реальной ситуации она может быть, наоборот, весьма объемна (например, если класс требует загрузки каких-нибудь файлов или записей из базы данных).

Конструктор

Давайте взглянем на очередную реализацию нашего класса комплексных чисел (листинг 6).

Создание нескольких объектов - student2.ru

Создание нескольких объектов - student2.ru

Листинг 6 Пример класса с конструктором. Файл Math/Complex2.php

Обратите внимание на необычное название метода - _ construct () . Это так называемый конструктор класса. Он вызывается всякий раз, когда вы используете оператор new для объекта.

ПРИМЕЧАНИЕ

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

Как видите, конструктор принимает два параметра: действительную и вещественную части комплексного числа. Листинг 7 иллюстрирует применение данного класса.

Создание нескольких объектов - student2.ru

Листинг 7 Использование конструктора. Файл construct.php

Насколько легче стало создание новых объектов! Теперь мы уже при всем желании не сможем пропустить их инициализацию - конструктор будет вызван в любом случае.

Параметры по умолчанию

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

Создание нескольких объектов - student2.ru

Мы заставим РНР корректно воспринимать следующие четыре команды:

Создание нескольких объектов - student2.ru

При этом недостающие параметры будут заполнены значениями по умолчанию (в нашем примере это 0).

В примере, который только что был приведен, по умолчанию создается объект класса MathCornplex2 со значением (0, 0). В языках программирования вроде Java и С++ конструктор класса, который допускает создание объектов без указания параметров, называется конструктором по умолчанию.

Наши рекомендации