The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.

PHP. Объекты, шаблоны и методики программирования

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by 9229696521, 2018-03-28 08:15:50

PHP. Объекты, шаблоны и методики программирования

PHP. Объекты, шаблоны и методики программирования

Глава 1 2. Шаблоны корпоративных приложений 293

protected function set ( $ key, $val
return \apc_s tore ( $key, $val ) ;

static function getDSN ( ) {
return self : : instance ( ) ->get ( "dsn" ) ;

static function setDSN ( $dsn ) {
return self : : instance ( ) ->set ( "dsn " , $dsn ) ;

Если вы собираетесь использовать вариант этого примера кода, обязательно
прочитайте сле.цующий раздел: есть некоторые серьезные моменты, которые сле­
.цует учесть.

На заметку. Поскольку расширение АРС не входит в стандартную поставку РНР, вам нужно самостоятельно его
установить. Как это сделать, описано в руководстве по РНР по адресу http : / /php . net /manual / ru /
apc . installation. php.

Результаты

Поскольку и S e s s i onReg i s t ry, и App l i ca t ionReg i s t r y сериализуют данные в
файл, важно еще раз сформулировать очевидный факт: объекты, извлекаемые в
разных запросах, являются идентичными копиями и не ссьmаются на один и тот же
объект. Это не должно иметь значения для S e s s i onReg i s t ry, потому что к объекту в
каждом случае обращается один и тот же пользователь. Но для App l i c a t i onReg i s t r y
это может быть серьезной проблемой. Сохраняя данные беспорядочно, в ы можете
оказаться в ситуации, в которой два процесса бу.цут конфликтовать. Рассмотрим
описанную ниже последовательность действий.
Процесс l извлекает объект
Процесс 2 извлекает объект
Процесс l изменяет объект
Процесс 2 изменяет объект
Процесс l сохраняет объект
Процесс 2 сохраняет объект

Изменения, выполненные Проце с с ом 1 , затираются в результате сохранения
Процессом 2 . Если вы действительно хотите создать совместно используемое про­
странство для данных, реализуйте в классе App l i c a t ionRe g i s t r y схему взаимобло­
кировки для предотвращения подобных противоречий. Существует и альтернатив­
ный вариант: рассматривать класс App l i ca t ionReg i s t r y в большей степени как
ресурс "только для чтения". Именно таким образом я использую этот класс в после­
дующих примерах в данной главе. Первоначально в нем устанавливаются данные,
и после этого взаимодействие с ним происходит по принципу "только чтение". Если
файл хранилища не найден, то в коде вычисляются новые значения и записывают­
ся в этот файл. Следовательно, перезагрузку данных конфигурации можно иниции­
ровать только путем удаления файла хранилища. Более того, вы можете усовершен­
ствовать класс так, чтобы он работал в режиме "только для чтения".

Еще один важный момент, о котором нужно помнить, - не каждый объект под­
ходит для сериализации. В частности, если вы будете сохранять ресурсы любого
типа (например, дескриптор подключения к базе данных), то он не будет сериали-

294 Часть 111. Шаблоны

зован. Вам придется разработать стратегии, обрабатывающие такой дескриптор во
время сериализации и восстанавливающие его при десериализации.

Итак, какую же стратегию выбрать? На практике я почти всегда использую са­
мый простой вариант - реестр, работающий только с запросами. Разумеется, в
разрабатываемой программной системе я всегда использую только один тип рее­
стра. Это позволяет избежать некоторых трудноуловимых ошибок! Механизм кеши­
рования, рассмотренный выше в примере с классом Appl i c a t i onRe g i s t r y . позво­
ляет преодолеть недостатки шаблона Front Controller, заключающиеся в высоких
накладных расходах. связанных с синтаксическим анализом запутанного файла
конфигурации в каждом запросе. В реальных приложениях механизм кеширования
следует реализовать отдельно, чтобы максимально упростить реестр и ограничить
его функциональные возможности только запросами. Тем не менее в данном случае
класс App l i ca t ionRegis t r y служит поставленным мною целям, поэтому я продолжу
с ним работать.

На заметку. Один из способов управления сериализацией - реализовать "магические" методы s l eep ( )
и w_ akeup ( ) . Метод s l eep ( ) вызывается автоматически, когда объект сериализуется-:Вы можете
использовать его для выполнения любой операции очистки перед сохранением объекта. Он должен вернуть
массив строк, представляющих поля, которые вы хотите сохранить. Метод wakeup ( ) вызывается при де­
сериализации объекта. Вы можете использовать его, чтобы восстановить дескриптор открытого файла или
подключения к базе данных, которые, возможно, использовал объект во время сохранения.

Хотя сериализация в РНР довольно эффективна, вы должны быть внимательны
в отношении того, что сохраняете. Простой на вид объект может содержать ссылку
на огромный набор объектов, полученных из базы данных.

Объекты типа Reg i s t r y делают свои данные глобально доступными. Это озна­
чает, что любой класс, действующий как клиент для реестра. будет проявлять за­
висимость, не объявленную в его интерфейсе. Это может стать серьезной пробле­
мой. если слишком много данных в вашей системе будут зависеть от объектов типа
Regi s t ry. Поэтому объекты типа Reg i s t r y лучше всего использовать сравнительно
редко, для четко определенного набора элементов данных.

Уровень п редставления данных

Когда запрос обращается к вашему приложению, оно должно интерпретировать
его требования, затем выполнить всю необходимую обработку и наконец вернуть
ответ. Для простых сценариев весь этот процесс обычно полностью происходит вну­
три самого представления. и только сложные вычислительные процедуры и повто­
ряемый код помещаются в библиотеки.

На заметку. Представление - это отдельный элемент на уровне отображения данных. Обычно это РНР-страница
(или набор составных элементов отображения), главная обязанность которой - отображать данные и обеспе­
чивать механизм, посредством которого пользователь может генерировать новые запросы. Это также может
быть один из шаблонов при использовании системы шаблонов, такой как Smarty.

По мере увеличения размера приложения стандартная стратегия становится ме­
нее подходящей для обработки запросов, вызова логики приложения. поскольку ло­
гика выборки представления обязательно дублируется от одной страницы к другой.

В этом разделе мы рассмотрим стратегии управления этими тремя ключевыми
обязанностями уровня представления. Поскольку границы между уровнем пред­
ставления и уровнем команд и управления, как правило, довольно размыты, имеет
смысл рассматривать их вместе под общим названием "уровень представления".












Click to View FlipBook Version