Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Заметки Дизайнера" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Статические методы и свойства
PHP 5: Новые возможности.
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2005 Pterodactyl's School.
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".
24.01.2006
| История переиздания | |
|---|---|
| Издание 1.00 | 24.01.2006 |
| Первоначальная версия. | |
Аннотация
Рассказано о статических методах и переменных, а также о константах класса. Доработано учебное приложение. Начато знакомство с пакетом PEAR::HTML_Template_Flexy.
Содержание
Для того, чтобы объявить статический метод или свойство (переменную класса), используется ключевое слово static. Оно должно следовать сразу же после модификатора доступа. Если модификатор доступа отсутствует, то объявление начинается с ключевого слова static, а видимость метода или переменной по умолчанию принимается общедоступной (public).
Статические методы и переменные принадлежат самому классу, но не его экземплярам (объектам). Поэтому для доступа к таким методам и переменным не требуется создание объекта.
Поскольку статические методы принадлежат всему классу, а не отдельным его экземплярам, то и вызывать их необходимо в контексте класса (Пример 1, «Вызов статического метода»). Для этого используется оператор :: вне класса либо специальное название self внутри самого класса.
Вызов в контексте объекта также возможен, но пользоваться им не следует (Пример 2, «Нежелательный вызов методов»). Не нужно также вызывать в контексте класса (статически) обычные методы - это вызовет предупреждение уровня E_STRICT.
Внимание
Псевдопеременная $this внутри статических методов недоступна, а попытка ее использования вызывает фатальную ошибку.
<?php
class Foo {
private $hello = 'Hello there!';
static function printHello()
{
print $this->hello; // FATAL ERROR
}
}
Foo::printHello();
?>
Fatal error: Using $this when not in object context
Пример 1. Вызов статического метода
<?php
class Foo {
public static function staticMethod()
{
print 'Hello from staticMethod()!';
}
}
Foo::staticMethod();
?>
Hello from staticMethod()!
<?php
class Foo {
public __construct()
{
self::staticMethod();
}
public static function staticMethod()
{
print 'Hello from staticMethod()!';
}
}
$foo = new Foo;
?>
Hello from staticMethod()!
Пример 2. Нежелательный вызов методов
<?php
class Foo {
public static function staticMethod()
{
print 'Hello from staticMethod()!';
}
}
$foo = new Foo;
$foo->staticMethod(); // you should use Foo::staticMethod()
?>
Hello from staticMethod()!
<?php
class Foo {
public __construct()
{
$this->staticMethod(); // you should use self::staticMethod()
}
public static function staticMethod()
{
print 'Hello from staticMethod()!';
}
}
$foo = new Foo;
?>
Hello from staticMethod()!
<?php
class Foo {
public function printHello()
{
print 'Hello there!';
}
}
Foo::printHello(); // you should create a new instance $foo = new Foo
// and then use $foo->printHello()
?>
Strict Standards: Non-static method Foo::printHello() should not be called statically
Hello there!
Статические переменные часто называют свойствами класса в противоположность обычным свойствам объектов.
Как и статические методы, статические переменные достижимы при помощи оператора :: извне или специального названия self изнутри класса (Пример 3, «Использование статической переменной»).
Внимание
К статическим переменным нельзя обратиться в контексте объекта (в отличие от статических методов, которые, хоть им и не рекомендуется пользоваться, но все же поддерживают такой способ обращения).
<?php
class Foo {
public static $staticVariable = 'static';
}
$foo = new Foo;
print $foo->staticVariable; // you should use Foo::$staticVariable
?>
Notice: Undefined property: Foo::$staticVariable
Глобальные константы, объявляемые при помощи функции define(), существовали в PHP и ранее. Тем не менее, только PHP 5 предоставляет возможность объявления констант в контексте класса.
Своей принадлежностью непосредственно классу (а не объектам) и способами обращения к ним (:: или self) константы класса напоминают статические переменные. Однако, в отличие от последних, константы не содержат в начале названия символ $ и, будучи единожды объявленными, не могут быть изменены или удалены.
Обычно константы класса используются для перечисления тех или иных постоянных свойств (Пример 4, «Использование констант»).
Замечание
В названиях констант принято использовать заглавные буквы. Отдельные слова разделяются знаком подчеркивания.
На текущем практическом занятии нам предстоит выполнить две задачи.
- "Научить" разрабатываемое нами учебное приложение различать свою собственную версию.
- Познакомиться с пакетом PEAR::HTML_Template_Flexy.
Родительский класс - HTML_Page2 - имеет метод apiVersion() (Пример 5, «Функция HTML_Page2::apiVersion()»), который перекрывает аналогичный метод в классе HTML_Common, которому наследует HTML_Page2. Можно было бы просто перекрыть этот метод в классе SSS,
однако, такой путь имеет один существенный недостаток: метод apiVersion() не является статическим, то есть, принадлежит объекту, а не классу. Версия же является как раз таким свойством, которое имеет смысл в контексте класса. Кроме того, представляется не самым удачным решение указывать версию непосредственно в самом методе.
Пример 5. Функция HTML_Page2::apiVersion()
/**
* Returns the current API version
*
* @access public
* @return double
*/
function apiVersion()
{
return 2.0;
} // end func apiVersion
Можно легко разрешить указанные противоречия, используя только что полученные знания о статических методах и константах (Доработка класса SSS).
Процедура 1. Доработка класса SSS
-
Исправьте номер версии во встроенной документации.
* @version 0.03
-
Добавьте константу
VERSION./** * The current version * * @since 0.03 */ const VERSION = 0.03; -
Добавьте статический метод
getVersion()./** * Returns the current version * * @static * @access public * @return double * @since 0.03 */ public static function getVersion() { return self::VERSION; } // end func getVersion -
Перекройте также метод
apiVersion(), чтобы избежать вывода версии, относящейся к родительскому классу, объявив его использование нежелательным (deprecated)./** * Returns the current API version * * @access public * @return double * @since 0.03 * @deprecated Method deprecated since version 0.03 */ function apiVersion() { return self::getVersion; } // end func apiVersion
В результате должен получиться следующий документ.
Пример 6. SSS 0.03
<?php
/**
* The main part of the Simple Site Solution package
*
* The SSS package provides a simple interface for generating an web site.
*
* Required: PEAR::HTML_Page2.
*
* PHP version 5
*
* LICENSE: This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* @package SSS
* @author The Pterodactyl <ptero@pterodactyl.l2p.net>
* @copyright 2006 Pterodactyl's School
* @license http://www.gnu.org/licenses/gpl.txt GNU General Public License
* @version 0.03
* @link http://pterodactyl.l2p.net/php5/examples/SSS
*/
/**
* Include the parent class
*/
require_once 'HTML/Page2.php';
/**
* Advanced (X)HTML Page Generation Class
*
* Features:
* + PEAR Code Standards compliance
*
* Usage:
* require_once 'SSS.php';
* $page = new SSS;
* $page->setBody('...');
* $page->display();
*
* @todo more features
*/
class SSS extends HTML_Page2 {
/**
* The current version
*
* @since 0.03
*/
const VERSION = 0.03;
/**
* Contains defaults for page attributes
* Overrides parent class defaults
*
* @var array
* @access private
* @since 0.02
*/
private $attributes = array('tab' => ' ');
/**
* Contains defaults for extra page attributes
*
* @var array
* @access private
* @since 0.02
*/
private $options = array('stylesheet' => '/styles.css',
'favicon' => '/favicon.ico', 'title' => 'SSS',
'generator' => 'Simple Site Solution');
/**
* Class constructor
*
* Accepts an array of attributes
* (just as the parent) and options
* Supported extra attributes:
* + stylesheet Style sheet (addStyleSheet)
* + favicon Favorite icon (addFavicon)
* + generator Page generator (setMetaData)
* + title Page title (setTitle)
*
* Calls the parent's constructor
* Overrides page attributes
*
* @param array $attributes Page attributes
* @param array $options Extra page attributes
* @since 0.02
*/
function __construct($attributes = array(), $options = array())
{
$attr = array_merge($this->attributes, $attributes);
parent::__construct($attr);
$opt = array_merge($this->options, $options);
$this->setTitle($opt['title']);
$this->setMetaData('Generator', $opt['generator']);
if ($this->isFileExists($opt['stylesheet'])) {
$this->addStyleSheet($opt['stylesheet']);
}
if ($this->isFileExists($opt['favicon'])) {
$this->addFavicon($opt['favicon']);
}
} // end class constructor
/**
* Returns the current version
*
* @static
* @access public
* @return double
* @since 0.03
*/
public static function getVersion()
{
return self::VERSION;
} // end func getVersion
/**
* Returns the current API version
*
* @access public
* @return double
* @since 0.03
* @deprecated Method deprecated since version 0.03
*/
function apiVersion()
{
return self::getVersion;
} // end func apiVersion
/**
* Checks out whether the file exists
* The path to the file can be either absolute (from the
* document root) or relative
*
* @param string $filename The file name
* @return boolean
* @access private
* @since 0.02
*/
private function isFileExists($filename)
{
if ($filename[0] == '/') {
$basedir = rtrim($_SERVER['DOCUMENT_ROOT'], '/');
} else {
$basedir = '';
}
return file_exists($basedir.$filename);
} // end func isFileExists
}
?>
На сайте этот код находится здесь.
Пакет HTML_Template_Flexy представляет собой один из наиболее мощных и гибких инструментов для работы с шаблонами. Нам предстоит установить этот пакет на сайте (Установка пакета HTML_Template_Flexy) и применить его для подготовки тела страницы, генерируемой нашим учебным приложением (Использование HTML_Template_Flexy).
Процедура 2. Установка пакета HTML_Template_Flexy
-
Скачайте и разархивируйте пакет.
-
На странице загрузки выберите последнюю версию пакета.
-
Для распаковки воспользуйтесь любым архиватором, поддерживающим формат
.tgz(tar + gzip).
-
-
Создайте на сайте каталог
/pear/HTML/Template/. -
Закачайте следующие файлы на свой сайт в каталог
/pear/HTML/Template/.-
Файл
Flexy.php. -
Весь каталог
Flexyцеликом.
-
Процедура 3. Использование HTML_Template_Flexy
-
Создание структуры каталогов
Понадобятся два каталога: один для хранения разработанных нами шаблонов, а второй - для автоматически сгенерированного на основе этих шаблонов PHP кода.
-
Создайте каталог
templatesдля хранения шаблонов. -
Создайте каталог
templates/compiledдля хранения автоматически сгенерированного кода.Внимание
Обеспечьте возможность автоматической записи в этот каталог, установив права доступа равными 0777 (пользователи Windows могут не беспокоиться).
-
-
Создание шаблона
Создайте шаблон
templates/index.htm.<p>Этот шаблон со временем будет наполнен реальным содержимым.</p>
-
Доработка демонстрационного скрипта
Понадобится внести ряд изменений и дополнений в код скрипта, использованного для демонстрации предыдущей версии учебного приложения (Пример 7, «Демонстрационный скрипт»).
-
Определите пути к каталогам, используемым для хранения шаблонов и кода[1].
$dirs = array('templateDir' => 'templates', 'compileDir' => 'templates/compiled'); -
Включите файл
HTML/Template/Flexy.php.require_once 'HTML/Template/Flexy.php';
-
Создайте новый объект класса
HTML_Template_Flexy, передав ему пути к каталогам в качестве параметра.$flexy = new HTML_Template_Flexy($dirs);
-
Произведите компиляцию шаблона.
$flexy->compile('index.htm'); -
Получите содержимое страницы при помощи метода
bufferedOutpitObject, передав ему в качестве параметра "пустой" объект.$content = $flexy->bufferedOutputObject(new stdClass);
-
Установите тело страницы.
$page->setBody($content);
-
Пример 7. Демонстрационный скрипт
<?php
$attributes = array('language' => 'ru', 'charset' => 'windows-1251');
$options = array('title' => 'SSS 0.03 Demo Page');
$dirs = array('templateDir' => 'templates',
'compileDir' => 'templates/compiled');
/////////////////////////////////////////////////////////
$include_path[] = get_include_path();
$include_path[] = $_SERVER['DOCUMENT_ROOT'].'/pear';
$include_path[] = $_SERVER['DOCUMENT_ROOT'].'/classes';
set_include_path(implode(PATH_SEPARATOR, $include_path));
/////////////////////////////////////////////////////////
require_once 'SSS.php';
require_once 'HTML/Template/Flexy.php';
$page = new SSS($attributes, $options);
$flexy = new HTML_Template_Flexy($dirs);
$flexy->compile('index.htm');
$content = $flexy->bufferedOutputObject(new stdClass);
$page->setBody($content);
$page->display();
?>
Этот код на сайте можно найти здесь.
Получим следующее.
Этот шаблон со временем будет наполнен реальным содержимым.
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3c.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
<meta name="Generator" content="Simple Site Solution" />
<title>SSS 0.03 Demo Page</title>
<link href="/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link rel="stylesheet" href="/styles.css" type="text/css" />
</head>
<body>
<p>Этот шаблон со временем будет наполнен реальным содержимым.</p>
</body>
</html>
С последней версией этой и других статей Вы можете ознакомиться на сайте рассылки [http://pterodactyl.l2p.net/php5/].
| Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: inet.webbuild.php5whatsnew Архив рассылки |
Отписаться
Вебом
Почтой
Вспомнить пароль |
| В избранное | ||


