NB: Создатели НПЖ часто говорят об агрегировании. Агрегирование – частный случай делегирования, но насколько тонкое различие между ними проводят Кукуц и Кусо мне не вполне понятно.
Чтобы класс А наследовал классу В (т.е. чтобы свойства и методы В были «делегированы» А), нужно:
(a – экземпляр класса А)
<?
class A {
function agregateB() { // при желании это можно делать прямо в конструкторе
require('B.php'); // инклюдим код для класса В (можно и в другом месте, если он еще где-то понадобится)
$this->b = &new B; // агрегируем объект класса В
}
}
?>
Как это сделано в НПЖ (на примере метода 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.