Обратите, пожалуйста, внимание на то, что отдельные выпуски рассылки в той или иной мере взаимосвязаны; особенно, это относится к материалам практических занятий.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
16.02.2006
История переиздания
Издание 1.00
16.02.2006
Первоначальная версия.
Аннотация
Описано ключевое слово final. Доработано учебное приложение.
Иногда бывает необходимо предотвратить перекрытие того или иного метода или даже наследование всего класса целиком. В PHP 5 для этого предусмотрено ключевое слово final.
Конечные методы
Чтобы метод не мог быть перекрыт в классе-наследнике, нужно предварить его объявление ключевым словом final.
final function foo() { /* ... */ }
Попытка перекрыть такой метод вызовет фатальную ошибку.
Пример 1. Демонстрация невозможности перекрыть конечный метод
<?php
class A {
final function foo() {
}
}
class B extends A {
function foo() {
}
}
?>
Fatal error: Cannot override final method A::foo()
Конечные классы
Класс в целом также может быть объявлен конечным.
final class Foo { /* ... */ }
Конечный класс вообще не может быть унаследован. Попытка это сделать вызовет фатальную ошибку.
Пример 2. Демонстрация невозможности унаследовать конечный класс
<?php
final class A {
}
class B extends A {
}
?>
Fatal error: Class B may not inherit from final class (A)
Практикум
На текущем практическом занятии займемся доработкой класса SSSEx и шаблона index.htm, а также внесем некоторые дополнения в базовый пакет SSS.
Исправим номер версии пакета SSS на 0.05 везде, где это требуется.
Добавим две новых константы и один статический метод в класс SSS.
/**
* The product name
*
* @var string
* @since 0.05
*/
const PRODUCT_NAME = 'Simple Site Solution';
/**
* The official web page
*
* @var string
* @since 0.05
*/
const WWW = 'http://pterodactyl.l2p.net/php5/';
/**
* Returns the HTML link to the official page
*
* @static
* @access public
* @return string
* @since 0.05
*/
public static function getCredits()
{
$url = self::WWW;
$product = self::PRODUCT_NAME;
$version = self::VERSION;
return "<a href=\"$url\">$product $version</a>";
} // end func getCredits
Поскольку класс SSSEx в будущем не будет наследоваться, то есть смысл объявить его конечным.
final class SSSEx extends SSS
Далее займемся шаблоном index.htm. Разделим страницу на три блока: заголовок, основную часть и подножие (Пример 3, «Шаблон index.htm»). В основной части оставим обещание наполнить шаблон со временем реальным содержимым. В остальные два блока частично будем подставлять данные в методе getContentData (Пример 4, «Метод getContentData»). Для этого нам придется познакомиться с некоторыми новыми для нас возможностями пакета HTML_Template_Flexy.
Механизм подстановки данных уже реализован нами в предыдущих версиях, но сами данные пока что отсутствовали. Теперь же введем два новых элемента для подстановки в шаблон: title и credits. Первый из них будет подставляться в заголовок страницы, а второй - в подножие. Конкретное место для подстановки в шаблон указывается при помощи названия элемента, обрамленного фигурными скобками: {title}. Если элемент содержит HTML
код, после его названия следует поставить двоеточие и добавить букву 'h': {credits:h}. Остается лишь добавить в объект класса stdClass, который используется для инкапсуляции подставляемых данных, две переменные, названия которых совпадают с названиями элементов для подстановки, и присвоить им значения.
Элементу title, таким образом, автоматически присваивается значение заголовка страницы (метод getTitle, определенный в классе HTML_Page2), а на место элемента credits подставляется ссылка на официальную страницу нашего проекта (только что определенный нами статический метод getCredits).
Пример 3. Шаблон index.htm
<div id="sssex_header">
<h1>{title}</h1>
</div>
<div id="sssex_main">
<p>Этот шаблон со временем будет наполнен реальным содержимым.</p>
</div>
<div id="sssex_footer">
<p>Страница разработана на основе {credits:h}.</p>
</div>
Пример 4. Метод getContentData
protected function getContentData()
{
$data = new stdClass;
$data->title = $this->getTitle();
$data->credits = self::getCredits();
return $data;
}
Полностью файлы, входящие в наш учебный пример, можно найти здесь.