NPJ next: RequestHandlerDetails ...

Главная | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация | Вход:  Пароль:  

$rh – детали реализации


ДЕЛЕГИРОВАНИЕ


NB: Создатели НПЖ часто говорят об агрегировании. Агрегирование – частный случай делегирования, но насколько тонкое различие между ними проводят Кукуц и Кусо мне не вполне понятно.


Чтобы класс А наследовал классу В (т.е. чтобы свойства и методы В были «делегированы» А), нужно:


(a – экземпляр класса А)


  1. Подключить класс В 
  2. Создать экземпляр класса В в качестве члена класса А, например так:

<?
    
class {

      function 
agregateB() {  // при желании это можно делать прямо в конструкторе      
         
require('B.php');    // инклюдим код для класса В (можно и в другом месте, если он еще где-то понадобится)
         
$this->= &new B;   // агрегируем объект класса В
         
}

    }
?>


3. Вызывать $a->b->methodB();

Как это сделано в НПЖ (на примере метода NpjRequestHandler::UtilityRef())


<?
function &UtilityRef() {

    
$this->UseClass("UtilityRef"); 
       
// подключить UtilityRef - примерно равно require('UtilityRef.php');

    
$this->utility["ref"] = &new UtilityRef( &$this ); 
      
// $rh->utility[] - все утилиты, агрегированные в $rh, в одном массиве (хм, удобно :)

    
return $this->utility["ref"];  
      
// возвращает по ссылке полученный супер-пупер-агрегат
}


// Конструктор UtilityRef выглядит вот так:
  
   
UtilityRef::UtilityRef( &$rh )  { 
    
$this->rh = &$rh;   // здесь создается объект $ur->rh, т.е. происходит делегирование свойств и методов $rh,
                            // т.о. $ur становится наследником $rh
    
}


?>


Прикол здесь в том, что два объекта, $rh и $ur, агрегируют друг друга, (это для того, видимо, чтобы у них было общее окружение). Такой вот финт ушами. В принципе, можно даже попробовать вызвать $rh->utility["ref"]->rh->UtilityRef().


ОКРУЖЕНИЕ


Переменные окружения в НПЖ – это главным образом свойства объекта $rh, которые инициализируются при его создании в самом начале. В основном они считываются из файлов, содержащих в своем названии слово config. Таких файлов несколько – это сделано для того, чтобы различать переменные, связанные с БД, базовыми классами (т.е. с движком Manifesto), с классами НПЖ и «принципалом» (Principal – это класс, заведующий авторизацией и правами доступа). Значения переменных окружения большей часть определены еще в дистрибутиве, но некоторые из них прописываются в момент инсталляции (вроде префикса для таблиц БД, настройки мыла и т.п.). Собственно, вот эти конфиги:



Т.к. все они вызываются из конструктора NpjRequestHandler, то указатель $this в них относится к $rh. (М/б какие-то из них вызываются и не для конструирования $rh? – Надо бы с этим разобраться.) Например, последним в конструкторе RequestHandler создается объект $rh->tpl, для которого вызывается конструктор TemplateEngine, который заполняет свойства уже $rh->tpl.


 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]