Комментарии

Имена и область действия переменных в методах
( 0 Голосов )

У начинающих программировать может возникнуть недоумение по поводу переменной $table. Напомним, что в коде, инициирующем событие onContentBeforeDelete, передается массив, определяемый как array ($context, $table), и что этот массив распаковывается, превращаясь в два аргумента метода onContentBeforeDelete ().

Второй передаваемый аргумент назван $table. Но ведь второй аргумент в сигнатуре метода onContentBeforeDelete () называется $data. Несмотря на отличие в именах, переменная $data в данном методе имеет такое же значение, какое было у переменной $ table, когда инициировалось событие.

Когда методам и функциям передаются аргументы, имеет значение расположение, а не название аргумента. Первая переменная из вызывающего метода загружается в первый аргумент сигнатуры вызываемого метода и так далее. Имя аргумента в сигнатуре метода соответствует имени переменной в теле этого метода.

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

Переменная $table является локальной для метода onContentBeforeDelete (), а следовательно, она может иметь несколько иное значение в этом методе, чем в каком-нибудь другом месте программы. Но поскольку имя переменной $table не указывается в сигнатуре метода onContentBeforeDelete (), то ничто не мешает воспользоваться им в теле этого метода с какой угодно целью. В данном случае переменная $table ссылается на имя таблицы, определяемое в массиве $table!nfo.

Перейдем к следующему фрагменту кода из рассматриваемого здесь метода.

// возвратить логическое значение false, если произойдет 
// ошибка при обращении к базе данных if ($count === false)
{
$result = false;
}

В этом фрагменте кода проверяется, получен ли достоверный результат из метода _ countltemsInCategory (). Этот метод возвращает числовое или логическое значение false. Обратите внимание на применение оператора = при проверке наличия в переменной $ count логического значения false. Это приходится делать потому, что нулевое значение, возвращаемое из метода _countItemsInCategory (), является достоверным результатом. Если этот метод возвратит логическое значение false, значит, при выполнении запроса базы данных по какой-то причине произошла ошибка. А если он возвратит достоверный результат, то произойдет переход к приведенному ниже кодовому блоку else.

else
{
// сообщить об ошибке, если в категории найдены элементы содержимого if ($count > 0) {
$msg = JText::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED',
->$data->get ('title') ) .
JText::plural('COM_CATEGORIES_N_ITEMS_ASSIGNED', $count);
JError::raiseWarning(403, $msg);
$result = false;
}
// проверить наличие элементов в любых порожденных категориях,
//а если это лист дерева, то порожденные категории отсутствуют if (!$data->isLeaf()) {
$count = $this->_countItemsInChildren($table, $data->get('id'), $data); if ($count === false)
{
$result = false;
}
elseif ($count > 0)
{
$msg = JText::sprintf('COM_CATEGORIES_DELETE_NOT_ALLOWED',
->$data->get ('title') ) .
JText::plural(’COM_CATEGORIE S_HAS_SUBCATEGORY_ITEMS', $count);
JError::raiseWarning(403, $msg);
$result = false;
}
}
}

В первом условном операторе if из приведенного выше фрагмента кода проверяется, содержит ли переменная $count значение больше нуля. В этом случае пользователю выдается предупреждающее сообщение, а в переменной $result устанавливается логическое значение false. Следует иметь в виду, что, возвращая логическое значение false, рассматриваемый здесь подключаемый модуль предотвращает случайное удаление пользователем категории. Кроме того, оператор return употребляется лишь в самом конце данного метода, а следовательно, код продолжает выполняться.

В следующем условном операторе if проверяется, имеются ли в порожденных категориях какие-нибудь элементы содержимого, для чего вызывается метод _ count Items InCategory (). Обратите внимание на сокращенную запись, применяемую с целью сэкономить немного время обработки. У объекта $data имеется метод isLeaf (), возвращающий логическое значение true, если текущая категория является “листом” в “дереве” категорий, а это означает, что у нее нет никаких порожденных категорий. И в этом случае весь кодовый блок условного оператора if пропускается.

Если же имеются порожденные категории, а в них — какие-нибудь элементы содержимого, то выдается еще одно предупреждающее сообщение, а в переменной $ result устанавливается логическое значение false. Таким образом, если выполняются оба проверяемых условия, то выдаются оба предупреждающих сообщения, а это означает, что элементы содержимого присутствуют как в самой текущей категории, так и в порожденных категориях. Для выдачи предупреждающего сообщения пользователю служит метод JError:: raiseWarning (), причем в само сообщение включается подсчитанное количество элементов содержимого.

В версии Joomla 1.6 в класс JText был внедрен новый эффективный метод plural (), позволяющий автоматически выбирать подходящее языковое окончание в зависимости от того, какое число отображается: 1 или больше 1. Этот метод используется при выдаче обоих предупреждающих сообщений, чтобы написать в них слово “элемент” или “элементов”, исходя из количества обнаруженных элементов содержимого, но не прибегая к условному оператору if. Кроме того, метод JText::plural () правильно выбирает различные формы слова для одного, двух и трех элементов на разных языках.

В конце рассматриваемого здесь метода употребляется оператор return $result;, который просто возвращает логическое значение true, если элементы содержимого в категории отсутствуют, а иначе — логическое значение false. Как упоминалось ранее, данный метод делает нечто полезное лишь в том случае, если из таблицы # categories удаляются элементы. Но ведь мы могли бы с тем же успехом ввести аналогичную проверку в класс таблицы категорий. Зачем же вместо этого пользоваться подключаемым модулем?

Это делается ради удобства. Организовав подобную проверку в подключаемом модуле, мы предоставляем администратору веб-сайта целый ряд дополнительных возможностей. Во-первых, подключаемые модули могут быть выключены из работы, что дает администратору веб-сайта возможность удалить проверку категорий. Во-вторых, параметры подключаемого модуля позволяют включать или отключать проверки по отдельности. В-третьих, можно предоставить собственный подключаемый модуль, заменяющий или дополняющий функциональные возможности данного или любого другого основного подключаемого модуля. И наконец, данный подключаемый модуль предоставляет простую модель, которой могут воспользоваться сторонние разработчики расширений для организации в них проверки категорий на наличие элементов содержимого.

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


Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости