2010-07-31 150 views
0

我有一個Site對象,但我無法弄清楚如何在網站上存儲一組對象。這些頁面是分層的(網站導航的樹形結構)。我想到了一個樹狀的頁面陣列,但這會讓人感到很痛苦 - 例如, $site->pages[0][3][1]->addContent('<h1>lol</h1>')。我可以使用具有唯一ID的平面頁面,例如$site->pages['home']->addContent('<p>easier</p>'),但是如何在渲染導航時從中提取樹?PHP OOP使用對象層次結構

回答

1

我會使用的網址,如:

http://www.example.org/products/electronics/computer/monitors

而且使用這樣的代碼來表示頁:

$site->pages['products']['electronics']['computer']['monitors'] 

你可以配置你的Web服務器的所有重定向請求您的.php文件,並且您可以通過分解REQUEST_URI變量來「破解」URL。

0

如果需要收集物體,請查看SplObjectStorage

SplObjectStorage類提供從對象到數據的映射,或者通過忽略數據來設置對象集。這種雙重目的在很多情況下都很有用,涉及需要唯一標識對象的情況。

或者,如果您想要一個簡單的可訪問樹結構,請考慮使用SimpleXml。這不會允許您輕鬆使用自定義頁面對象。除了向它添加HTML之外,你似乎對頁面對象做的更多,所以在你的情況下它可能是可行的。

對於更高級的需求,看到Composite Design pattern

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(); 

希望這將幫助你。