Создание экземпляра класса только через фабрику

Angel Echo

Guest
Создание экземпляра класса только через фабрику

Есть два класса (упрощенно):

class PageFactory
{
function createPage($id) { return new Page($id); }
}

class Page
{
private $id;
function __construct($id) { $this->id=$id; }
}

Как сделать невозможным создание экземпляра класса Page в обход метода PageFactory::createPage() ?

Например, как в библиотеке DOM, можно создать объект DOMNode только через DOMDocument->createElement().
 

Andreika

"PHP for nubies" reader
PHP:
 $a = new DomDocument;
 $a1 = $a->createAttribute('tt');
 $a2 = new DOMAttr('rr');
 var_dump($a1,$a2);
передавать параметром в конструктор объекта свою фабрику, а в объекте проверять что передали?
 

Angel Echo

Guest
Andreika

Не понял, к чему этот пример?

-~{}~ 20.11.05 18:52:

svetasmirnova

Гм, но как же вызывать private метод класса из другого класса? На то и private, чтоб извне вызвать нельзя было
 

Andreika

"PHP for nubies" reader
Angel Echo
как в библиотеке DOM, можно создать объект DOMNode только через DOMDocument->createElement
пример - к этому вроде %)
 

Angel Echo

Guest
b]Andreika[/b]

Про DOM - это был не вопрос, а пример того, как нужно мне. Я хочу понять механизм, как это делается ?

-~{}~ 20.11.05 19:00:

Если попытаться создать new DOMNode, то получится соврешенно бесполезный объект, с которым ничего нельзя делать.

-~{}~ 20.11.05 19:01:

Вот и мне нужно так чтобы при создании new Page, полчался такой же бесполезный объект!

-~{}~ 20.11.05 19:07:

Сам по себе DOMNode не может существовать без объекта DOMDocument, мне нужно то же самое, только, чтобы страница (Page) не могла быть создана сама по себе, без отношения к какому-нибудь агрегату, например, объект класса Сайт создает объекты класса Раздел, которые создают объекты класса Страница. Однако существование объектов Страницы без Раздела и Раздела без Сайта должно быть невозможным !
 

Andreika

"PHP for nubies" reader
Angel Echo
получается совсем не бесполезный объект, которым можно пользоваться также как и созданным функцией и DOMNode может существовать без объекта DOMDocument

чем тебе передача ссылки на создателя не устраивает?
 

Angel Echo

Guest
Andreika

Странно, но для DOMNode даже конструктор не определен в документации, т.е. нижеследующее не сработает:

$node = new DOMNode("неизвестно что");
$node->nodeValue="что-то";

Передачу ссылки уже пробую, может все устроит, однако хотелось бы все же понять, как это в случае DOM реализовано.
 

Andreika

"PHP for nubies" reader
c Dom все оч просто устроено
print_r(new DOMNode('rr')); // выведет DOMNode Object ( )

и насколько я помню - Element, Attribute и ко. являются Node и наверное в php они наследуются от DomNode
 

Angel Echo

Guest
Да это так, собственно даже DOMDocument наследуется от DOMNode. Но в отличие от DOMElement DOMNode, созданный через new, не выполняет никаких функций.
 

svetasmirnova

маленький монстрик
Ну тогда Andreika-ин способ с __construct(фабрика, $id) Exception в конструкторе ещё можно бросать, чтобы неожиданную фабрику какую-нибудь не передали бы.
 

white phoenix

Новичок
[offtop]встает вопрос о том где вы собираете такую замечательную траву[/offtop]
 

Andreika

"PHP for nubies" reader
white phoenix
[offtop]
даже употребление тяжелых наркотиков не дает те права не пользовацца поиском
http://phpclub.ru/talk/showthread.php?s=&threadid=73369&perpage=20&pagenumber=2
[/offtop]
 
Сверху