我有一个Site
对象,但我无法弄清楚如何最好地在网站上存储Page
个对象的集合。页面是分层的(网站导航的树结构)。我想到了一个树状的页面阵列,但与之交互会很痛苦 - 例如$site->pages[0][3][1]->addContent('<h1>lol</h1>')
。我可以使用具有唯一ID的平面数组,例如$site->pages['home']->addContent('<p>easier</p>')
,但是在渲染导航时如何从中提取树?
答案 0 :(得分:1)
我会使用以下网址:
http://www.example.org/products/electronics/computer/monitors
并使用这样的代码来表示页面:
$site->pages['products']['electronics']['computer']['monitors']
您可以将Web服务器配置为将所有请求重定向到.php文件,并且可以通过爆炸REQUEST_URI变量来“中断”URL。
答案 1 :(得分:1)
一种好方法是使用复合模式,正如戈登所说。一个简单的实现可能是:
interface SitePart { function getName(); } class Page implements SitePart { function Page($name,$content) { ... } function getName() { ... } function getContent() { ... } } class Category implements SitePart { private $parts = array() function Category($name) { ... } function getName() { ... } function add(SitePart $part) { $this->parts[$part->name] = $part } function get($partName) { return $this->parts[$name] } } class Site extends Category { function Site($name) { ... } }
用于创建层次结构和页面:
Site Categ 1 Page 1 Categ 1.1 Categ 2
$site = new Site(); $categ1 = new Category('Categ 1'); $categ11 = new Category('Categ 1.1'); $categ2 = new Category('Categ 2'); $site->add($categ1); $site->add($categ2); $categ1->add($categ11); $categ1->add(new Page('Page 1','Hello world');
现在要检索第1页,例如:
$page = $site->get('Categ 1')->get('Page 1'); echo $page->getContent();
我希望这会对你有帮助。
答案 2 :(得分:0)
如果您需要收集对象,请查看SplObjectStorage
。
SplObjectStorage类提供从对象到数据的映射,或者通过忽略数据来提供对象集。在涉及唯一标识对象的需要的许多情况下,这种双重目的可能是有用的。
或者,如果您想要一个简单的可访问树结构,请考虑使用SimpleXml。这不允许您轻松使用自定义页面对象。除了向页面对象添加HTML之外,您似乎对页面对象做了更多的操作,因此在您的情况下它可能是可行的。
有关更高级的需求,请参阅Composite Design pattern