PHP OOP使用对象层次结构

时间:2010-07-31 11:37:10

标签: php oop

我有一个Site对象,但我无法弄清楚如何最好地在网站上存储Page个对象的集合。页面是分层的(网站导航的树结构)。我想到了一个树状的页面阵列,但与之交互会很痛苦 - 例如$site->pages[0][3][1]->addContent('<h1>lol</h1>')。我可以使用具有唯一ID的平面数组,例如$site->pages['home']->addContent('<p>easier</p>'),但是在渲染导航时如何从中提取树?

3 个答案:

答案 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