Четверг, 16.05.2024, 20:04
DigitalBox
Приветствую Вас Гость | RSS
Главная Повторное использование кода Регистрация Вход
Меню сайта

Повторное использование кода



Зачастую одни и те же действия необходимо выполнить в разных частях сценария. Например, нужно несколько раз получить информацию из базы данных. Или можно представить себе ситуацию, когда один и тот же код используется в разных файлах. Если окажется, что время от времени вы набираете одни и те же десять строк кода (постоянно выделяя и копируя их), то лучше поместить их в отдельный файл и использовать, когда того потребует ситуация. Можно выделить следующие преимущества такого подхода:

  • Меньше работы — это всегда стимулирует.
  • Отладка осуществляется один раз. Можно написать код один раз, проворить его работоспособность, а затем использовать столько, сколько потребуется. Редко удается сразу переписать код без каких-либо опечаток, неговоря уже о том, чтобы написать новый. Его всегда нужно проверять. Поэтому использование готового проверенного кода позволяет сэкономить много времени.
  • Простота понимания. Чем меньше кода, тем более простым и читаемым является сценарий. Например, одну строку кода, содержащую функцию get-Data(), проще понять, чем, скажем, десять срок, которые реально используются для получения данных.
  • Простота поддержки. Если необходимо внести какие-то изменения в сценарий, то при повторном использовании кода их нужно будет внести всего один раз во внешнем файле. В противном случае пришлось бы искать нужный фрагмент кода везде, где он используется, и изменять его соответствующим образом. Например, если поменяется имя базы данных, то куда практичней будет внести изменения один раз в одном файле, чем во всех частях, где используется ее имя.

В языке РНР существуют два варианта повторного использования кода: с помощью включения файла в сценарий или путем использования функций. В данном разделе будут рассмотрены оба этих подхода.


Включение кода в сценарий

Можно создать отдельный файл, состоящий из нужного количества строк кода, и включить его в исходный сценарий там, где это нужно. Для этого в РНР предназначена функция include.


Включение файлов

Предположим, что вы создаете интерактивный каталог товаров и что ваше приложение содержит большое количество страниц, отражающих его содержимое. Размеры изображений (ширина и высота) можно задать как константы, а затем использовать их в дескрипторах HTML для вывода изображений. Таким образом, все картинки будут одинакового размера. Впоследствии можно изменять размеры изображений путем простой замены значений констант. При этом отпадает необходимость вносить изменения в каждый дескриптор <img> сценария. Создать константы можно следующим образом:

define("HEIGHT", 60);
define("WIDTH", 60);

Затем их можно использовать в HTML-дескрипторах:

<img src="mypic.jpg" height=""
width="" />;

Если изображения товаров выводятся в разных файлах сценария, нет необходимости в каждом из них размещать определения констант. Константы можно объявить в одном файле, например size.inc (это расширение обычно используется для файлов включения), а затем включать его в сценарий там, где это будет нужно:

‹?php
     define("HEIGHT", 60);
     define("WIDTH", 60);
?›

Теперь для включения файла следует воспользоваться выражением:

include("size.inc");

При обработке этого фрагмента кода интерпретатор РНР считывает команды данного файла и вставляет его в исходный файл вместо инструкции include, т.е. HTML-дескрипторы, содержащие константы HEIGHT и WIDTH, будут отображаться следующим образом:

<img src="mypic.jpg" height="60" width="60" />

Таким образом, на Web-странице будет выведена картинка. Если необходимо автоматически изменить размеры всех изображений, следует один раз поменять значения констант HEIGHT и WIDTH. Поскольку дескриптор <img> является достаточно сложным и содержит большой набор параметров, его можно поместить в отдельный файл, скажем displayPix.inc, и включать при выводе изображений. При этом сам <img>-дескриптор можно поместить в файл displayPix.inc, константы — в файл size.inc, а затем оба файла включить в результирующий сценарий либо включить файл size.inc в displayPix.inc, а затем использовать только displayPix.inc.

Зачастую разработчики забывают использовать дескрипторы РНР. Это одна из наиболее частых ошибок, которая связана с вопросом безопасности, поскольку без PHP-дескрипторов содержимое страницы будет без обработки выведено на экран. Безусловно, если пользователь знает размеры изображений, это не создаст проблем. Но, если в файле будет содержаться, например, пароль для доступа к базе данных, это может иметь нежелательные последствия.

Вместо функции include() можно использовать выражение:

include_once("имя_файла");

Эта функция позволяет избежать повторного переопределения одинаковых переменных, содержащихся во включаемых файлах. Например, функцию include_once() можно использовать для включения определения функций (этот вопрос рассматривается далее в этом разделе) с тем, чтобы они не повторялись.

В языке РНР имеются также функции require() и require_once(), которые подобны include(), но отличаются способом обработки ошибок. Это различие проявляется, например, при обращении к файлу, которого не существует. В этом случае функция require() выдаст ошибку и сценарий остановится. При использовании include() будет выведено только сообщение об ошибке, но сценарий продолжит выполняться.

В качестве имен файлов также можно использовать значения переменных:

include("$filename");

Например, необходимо вывести различные сообщения в зависимости от дня недели. При этом сообщения находятся в файлах, имена которых соответствуют различным дням. Например, файл с именем Sun.inc может содержать следующее:

echo "Думайте о будущем. Отсыпайтесь. Сегодня - никакой работы.";

И другие файлы в том же духе. Следующий фрагмент кода позволяет корректно вывести нужное сообщение в зависимости от дня недели:

$today = date("D");
include("$today"."inc");

В результате выполнения функции date() переменной $today будет присвоено сокращенное название дня недели. Вторая строка позволяет подключить необходимый файл. Например, если $today равно Sun (воскресенье), то будет выведено сообщение, содержащееся в файле Sun.inc.


Размещение файлов включения

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

http://yourdomain.com/secretpasswords.inc

Предположим, что в Web-окружении имеется файл secretpassword.inc, который содержит следующую информацию:

‹?php
      $mysecretaccount="account48756";
      $mypassword="secret" ;
?›

В большинстве случаев Web-серверы не настроены на обработку PHP-кода в файлах с расширениями, отличными от .рнр, т.е. интерпретатор РНР не обрабатывает файл secretpassword.inc, и его содержимое будет отображено пользователю как HTML-код. что явно не желательно. Для защиты от подобных случаев можно предпринять одно из следующих действий:

  • Переименовать файл включения с расширением .php. В таком случае Web-сервер будет обрабатывать файл включения так же, как и обычный сценарий РНР. Но тогда следует хорошенько подумать о его содержимом. Дело в том, что независимая обработка отдельных файлов включения крайне нежелательна. Предположим, например, что файл включения предназначен для удаления записи в базе данных (что, правда, маловероятно). Тогда независимая обработка такого файла (отдельно от файла сценария) может иметь негативные последствия. Еще одним фактором является то, что расширение файла .inc явно указывает, что он вспомогательный и предназначен для включения, а не для отдельной обработки.
  • Настроить Web-сервер на обработку кода РНР не только в файлах с расширением .php, но и в других файлах, например с расширением .inc. Этот подход позволит отличить файлы по их функциональному назначению. Однако все равно остается проблема, связанная с независимой обработкой файлов включения.
  • Разместить файл в месте, недоступном извне. Это решение является наиболее предпочтительным. Хотя оно не всегда реализуемо, например при использовании услуги Web-хостинговой компании.

Наилучшим вариантом является размещение файлов в каталогах, недоступных извне. Другими словами, необходимо создать каталоги для файлов включения, к которым невозможно будет получить доступ из Web-окружения. Например, Web-сервер Apache по умолчанию сохраняет файлы для Web в каталоге apache/htdocs (хотя этот путь можно изменить в конфигурационном файле httpd.conf). Поэтому для защиты файлов включения от внешнего доступа их можно разместить, например, в каталоге d:\include.


Установка путей для файлов включения

Модуль РНР позволяет задать специальные пути, которые будут использоваться для загрузки файлов включения. Если вы являетесь администратором этого модуля, это можно очень просто сделать в файле конфигурации php.ini. Для этого необходимо найти строку, содержащую директиву include_path, и изменить указанное в ней значение. Если в начале этой строки находится точка с запятой, ее необходимо удалить. Рассмотрим следующие примеры:

include path=". ;d:\include"                      ;# для Windows
include_path = " . :/user/local/include"  ; # для Unix/Linux/Mac

Обе эти строки определяют каталоги, в которых интерпретатор РНР будет искать файлы включения. Первое значение (символ точки) соответствует текущему каталогу, за которым следует имя второго каталога. РНР позволяет определить столько каталогов, сколько требуется. При этом порядок проверки каталогов на наличие файлов включения соответствует порядку значений, указанному в директиве include_path. Разделителем этих значений для операционных систем Windows является точка с запятой и двоеточие — для Unix/Linux.

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

ini_set("include_path", "d:\hidden");

Это выражение присваивает переменной include_path определенное значение только на время выполнения сценария. Оно не устанавливает его для всего Web-окружения.

Для доступа к файлу включения по установленному пути необходимо использовать его имя. При этом полный путь указывать не обязательно:

include("secretpasswords.inc");

Если необходимый файл не содержится по адресу, указанному в директиве include_path или в том же каталоге, что и сам сценарий (например, в подкаталоге или каталоге, скрытом от Web-окружения), следует указать полный путь:

include("d:/hidden/secretpasswords.inc");

В остальных случаях будет достаточно одного имени файла.

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz