Комментарии

Методы-конструкторы
( 0 Голосов )

Начинающим осваивать объектно-ориентированное программирование (ООП) очень важно уяснить особую роль метода-конструктора. Конструктор — это метод, который выполняется автоматически при создании объекта класса с помощью оператора new. Например, в строке кода

$registry = new JRegistry();

создается новый объект класса JRegistry и выполняется метод-конструктор этого класса перед присваиванием его объекта переменной $registry.

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

 parent:: construct();

Если в классе отсутствует метод-конструктор, то вызывается конструктор родительского класса, как это обычно происходите методами, но при условии, что конструктор определен в родительском классе. В более поздних версиях языка РНР конструкторы стали называться по имени своих классов, например, конструктор jregistry () класса JRegistry вместо construct (). Если же метод construct () отсутствует в коде РНР, то вместо него будет произведен поиск метода-конструктора по имени класса. А в Joomla все конструкторы называются construct ().

Ниже приведены первые строки кода из конструктора класса JController Admin.

function construct ($config = arrayO)
{
parent:: construct($config);

В этом фрагменте кода вызывается конструктор родительского класса JController. В этом конструкторе применяется способ так называемой рефлексии для построения массива с именами всех открытых в данном классе методов, как следует из приведенного ниже кода.

//  определить методы,   исключаемые из базового  класса $xMethods  = get_class_methods('JController');

//  получить  открытые  в данном классе методы,   используя рефлексию $r = new ReflectionClass($this); $rName =  $r->getName(); $rMethods  =  $r->getMethods(ReflectionMethod::IS_PUBLIC); $methods  =  array(); ($rMethods  as   $rMethod) { $mName = $rMethod->getName();
// добавить вызываемый по умолчанию метод отображения, если он не объявлен явным образом
if (!in_array($mName, $xMethods) || $mName == 'display') { $this->methods[] = strtolower($mName);
// автоматически зарегистрировать методы как задачи $this->taskMap[strtolower($mName)] — $mName; } }

В приведенном выше фрагменте кода поле taskMap заполняется ассоциативным массивом, где ключи и значения содержат имена открытых методов в данном классе, за исключением методов из его родительского класса JController. Кроме того, всегда добавляется вызываемый по умолчанию метод отображения, поскольку он присутствует в классе JController. Если вы незнакомы с понятиями открытых, закрытых и защищенных методов и полей, обратитесь за справкой к приведенной далее врезке "Модификаторы доступа public, protected и private".

Через несколько строк кода в этом же методе следует приведенный ниже фрагмент кода.

// если исходная задача определена, зарегистрировать ее как таковую if (array_key_exists('default_task', $config)) {
$this->registerDefaultTask($config['default_task']); } else {
$this->registerDefaultTask('display'); }

В этом фрагменте кода вводится исходная (по умолчанию) задача с ключом default и значением "display". Этим Joomla уведомляется, что нужно делать с запросом, если конкретная задача не указана. Для основных компонентов это, как правило, задача отображения.

Рассмотрим, как этот механизм действует на данном конкретном примере. При вызове метода JController: rgetlnstance () создается новый класс контроллера Webl inksControllerWebl inks. А поскольку у него отсутствует конструктор, то вызывается конструктор его родительского класса JControllerAdmin. Как было показано выше, в первой строке кода вызывается конструктор родительского класса JControllerAdmin, создающий массив taskMap. В классе WeblinksControllerWeblinks определен только один метод — getModel (). Но поскольку этот же метод присутствует в классе JController, он исключается из массива taskMap.

В родительском классе JControllerAdmin определены следующие методы: checkin(), delete (), display (), publish (), reorder (), а также saveorder(). Из них только метод display () определен также в классе JController, и поэтому он явным образом вводится в массив, а все остальные методы — обычным образом. Кроме того, конструктор класса JController добавляет в массив элемент с ключом default, имеющим по умолчанию значение "display". По завершении выполнения конструктора из родительского класса JController в массиве taskMap содержатся значения.

Ниже  приведена  следующая  часть  кода  из  конструктора  родительского  класса JControllerAdmin.

// определить  сопоставления  со  стандартными задачами $this->registerTask('unpublish',    'publish');  
//   значение = 0 $this->registerTask('archive', 'publish');  
//  значение = 2 $this->registerTask('trash', 'publish');  
// значение = - 2 $this->registerTask('report', 'publish');  
//  значение = - 3 $this->registerTask('orderup', 'reorder');
$this->registerTask('orderdown', 'reorder');

Именно здесь дополнительные задачи сопоставляются с соответствующими методами. Например, в выделенной выше строке кода задача trash сопоставляется с методом publish () добавлением в массив taskMap элемента с ключом trash и значением "publish". После выполнения этого фрагмента кода в массиве taskMap появятся значения.

Этот способ сочетает в себе простоту и гибкость. Если правильно назвать задачи по именам соответствующих методов контроллера, то для их сопоставления не придется больше ничего делать, поскольку все остальное возьмет на себя Joomla. А если потребуется видоизменить сопоставление, для этого достаточно воспользоваться методом registerTask (), как показано выше.

В данном примере имеет смысл воспользоваться тем же самым методом для выполнения задач публикации (publish), снятия публикации (unpublish), архивирования
(archive), удаления в корзину (trash) и составления отчета (report). Все эти задачи просто изменяют значение в столбце state (состояние) таблицы #weblinks.


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


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