Создание нескольких объектов
Мы только что передавали методу add () обыкновенное число. Однако, конечно, в качестве параметра функции можно указывать все, что угодно, например объект другого (или того же самого) класса. Листинг 3 иллюстрирует ситуацию. В учебных целях мы создадим еще один класс, MathCornplex1, немного изменив его метод add (). Кроме того, мы добавили еще и метод для получения строкового представления комплексного числа, чтобы не выводить его каждый раз вручную.
Листинг З Пример класса с методом. Файл Math/Complexl .php
Смотрите, мы явно указали перед параметром $у тип MathCornplex1. Это говорит РНР, что мы можем передавать в данную функцию только объекты этого класса, но не другого. Вот как может выглядеть корректное использование данного класса.
Листинг 4 Вызов метода объекта. Файл calll.php
ПРИМЕЧАНИЕ
В отличие от таких языков, как С++ и Java, в РНР не поддерживается создание в одном классе нескольких методов с одинаковым именем, которые бы различались только типами и количеством аргументов. Поэтому-то нам и пришлось создавать класс MathComplex1, а не просто добавить новую функцию add () с аргументом типа MathComplex в имеющийся класс.
Перегрузка преобразования в строку
Посмотрите еще раз на листинг 3. Возможно, вы спросите: почему мы назвали функцию _tostring() столь длинным именем? И зачем эти неуклюжие символы подчеркивания?
Оказывается, в РНР существует ряд имен методов, начинающихся с двойных подчерков, которые имеют специальное значение. Мы только что затронули один из них: это функция __toString (). Она вызывается РНР автоматически всякий раз, когда мы затребуем неявное преобразование ссылки на объект в строку.
Листинг 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).
Листинг 6 Пример класса с конструктором. Файл Math/Complex2.php
Обратите внимание на необычное название метода - _ construct () . Это так называемый конструктор класса. Он вызывается всякий раз, когда вы используете оператор new для объекта.
ПРИМЕЧАНИЕ
В отличие от других языков программирования, в РНР у класса может быть только один конструктор.
Как видите, конструктор принимает два параметра: действительную и вещественную части комплексного числа. Листинг 7 иллюстрирует применение данного класса.
Листинг 7 Использование конструктора. Файл construct.php
Насколько легче стало создание новых объектов! Теперь мы уже при всем желании не сможем пропустить их инициализацию - конструктор будет вызван в любом случае.
Параметры по умолчанию
Как и для обычных функций и методов, для конструкторов можно задавать параметры по умолчанию. Например, объявив его следующим образом:
Мы заставим РНР корректно воспринимать следующие четыре команды:
При этом недостающие параметры будут заполнены значениями по умолчанию (в нашем примере это 0).
В примере, который только что был приведен, по умолчанию создается объект класса MathCornplex2 со значением (0, 0). В языках программирования вроде Java и С++ конструктор класса, который допускает создание объектов без указания параметров, называется конструктором по умолчанию.