【发布时间】:2015-02-25 22:25:26
【问题描述】:
我有一个类,它采用一些基本的 HTML5,并通过一些 DOM 魔法将它变成一个类,它是一个扩展 simpleXMLElement。这一切都始于一个名为 XPage 的“工厂”(我可能稍微滥用了这个术语)类。
因此我们可能有
<?php
$MyPage = new XPage($HTML);
到目前为止一切顺利。我现在需要做的是选择 XML 文档的某些部分,以便它们可以被“添加书签”(我确信它有一个更好的名称),这样就可以像这样了
$MyPage->ThatBit("foo")->addChild('p',$MyParagraph);
理想情况下我希望能够去
$MyPage->page()->body->header->RememberThisBitAs("foo");
或者直觉上类似的东西。然后应该发生的事情是对象 $MyPage(XPage 类型)应该传递引用,在本例中为 html/body/header(这可能不是完全正确的 XPath 表示法,但希望您可以遵循)。
这个想法是可以更顺利地到达最常见的访问区域。这就是 SimpleXML 类(即使使用我的扩展)遇到的问题,如果没有另一个工厂,它也无法做到,并且还会使 XPage 成为单例。
但是,保存“书签”数组的是 XPage 类 ($MyPage)。据我所知,没有办法将引用传递到 SimpleXML 的迭代中,这样孩子或孩子的孩子就无法告诉工厂“请给我添加书签”。
这会让我做一些讨厌的事情,比如:
$MyPage->addBookmark("foo",
$MyPage->page()->body->header->getChildren() );
这似乎不对。
或
$MyPage->page()->body->header->RememberThisBitAs("foo",$MyPage);
这还不错,但仍然“感觉”不对。
如何在没有过多的对象耦合或丑陋的自引用的情况下解决这个问题?
更新
我想知道是否可以使用 debug_backtrace 反向遍历一个类,但答案似乎是否定的。
In PHP is it possible to reverse traverse a Traversable class to find the root object?
其他类似的测试表明,在可遍历堆栈中的任何其他元素上都无法访问在元素上设置类变量的值。
我将专注于包装建议。
更新
SimpleXML 实际上不是真正的对象,而是系统资源。这可以解释我的痛苦来自哪里。说笔记:http://php.net/manual/en/class.simplexmlelement.php
所以对于所有对象来说,感觉就像是一串对象相互调用,但实际上并非如此。
【问题讨论】:
-
我认为我在这个问题上做错了什么?除非得到指示,否则我无法学习。
-
等一下,你可能会得到答案。
-
RememberThisBitAs("foo");是什么意思? -
在每个元素中保留对顶级工厂的引用对您有用吗?
-
@MatthewBrown 这正是我回答的选项 1。
标签: php oop design-patterns simplexml