Совместимость родственных типов

Пусть у нас есть базовый класс Page и производный от него - staticPage. В соответствии с идеологией наследования везде, где может быть использован объект типа Page, возможно и применение staticPage-oбъeктa, но не наоборот! В самом деле, если мы неявно "преобразуем" staticPage в Page, то сможем работать с его Раgе - частью (свойствами и методами): ведь любая статья является также и страницей. В то же время, преобразовать Page в staticPage нельзя: ведь имея объект типа Page, мы не знаем, новость ли это, обычная страница или страница категории (при условии, что эти классы объявляются в программе).

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

Уточнение типа в функциях

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

Данный код корректен: мы передаем функции echoPage() объект типа StaticPage, что совпадает с именем класса в прототипе процедуры. Но задумаемся на мгновение: ведь функции echoPage(), по сути, совершенно все равно, со страницей какого типа она работает. Действительно, метод render() существует у любой страницы, и ее допустимо применять к произвольным объектам, базовый класс которых - Page.

Руководствуясь данными рассуждениями, модифицируем код (листинг 18).

Листинг 18 Уточнение и совместимость типов. Файлы pages/cast.php

Мы увидим, что он прекрасно работает: вместо аргумента типа Page можно подставлять объект класса StaticPage.

Оператор lnstanceof

Проверка совместимости типов производится во время выполнения программы, а не во время ее трансляции. Если мы попробуем вызвать echoPage(З14), то получим такое сообщение:

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

Листинг 19 Оператор instanceof. Файлы pages/instanceof.php

Вместо $class, конечно, можно и явно написать Page. Мы просто хотели продемонстрировать, что с помощью instanceof допустимо использовать имя класса, заданное неявно (в переменной).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: