我有一个类,它接收一些基本的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反向遍历类,但答案似乎是否定的。
其他类似的测试已经告诉我,在可遍历堆栈中的任何其他元素中都无法访问在元素上设置类变量的值。
我将专注于包装器建议。
更新
SimpleXML实际上并不是真正的对象,而是系统资源。这可能解释了我的困扰所在。请参阅说明:http://php.net/manual/en/class.simplexmlelement.php
因此,尽管所有对象都感觉像是互相调用的一系列对象,但实际上并非如此。
RememberThisBitAs("foo");
的含义是什么? - hek2mgl