Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用对象层次结构的PHP OOP_Php_Oop - Fatal编程技术网

使用对象层次结构的PHP OOP

使用对象层次结构的PHP OOP,php,oop,Php,Oop,我有一个站点对象,但我不知道如何最好地在站点上存储页面对象的集合。页面是分层的(网站导航的树状结构)。我考虑过一个树状的页面数组,但是与之交互会很痛苦,例如,$site->pages[0][3][1]->addContent('lol')。我可以使用具有唯一ID的平面页面数组,如$site->pages['home']->addContent('p>easer'),但在呈现导航时,我如何从中提取树呢?我会使用URL,例如: 并使用如下代码表示页面: $site->pages['produ

我有一个
站点
对象,但我不知道如何最好地在站点上存储
页面
对象的集合。页面是分层的(网站导航的树状结构)。我考虑过一个树状的页面数组,但是与之交互会很痛苦,例如,
$site->pages[0][3][1]->addContent('lol')
。我可以使用具有唯一ID的平面页面数组,如
$site->pages['home']->addContent('p>easer

')
,但在呈现导航时,我如何从中提取树呢?

我会使用URL,例如:

并使用如下代码表示页面:

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

您可以将web服务器配置为将所有请求重定向到.php文件,还可以通过分解REQUEST_URI变量来“分解”URL。

如果需要对象集合,请查看

SplObjectStorage类提供从对象到数据的映射,或者通过忽略数据,提供对象集的映射。这种双重用途在许多需要唯一标识对象的情况下都很有用

或者,如果你想要一个简单的可访问树结构,考虑使用SimeXML。但这不允许您轻松使用自定义页面对象。除了向页面对象添加HTML之外,您似乎并没有对页面对象做更多的事情,所以在您的情况下这可能是可行的


有关更高级的需求,请参见

一个好方法是使用Gordon所说的复合模式。这方面的一个简单实现可以是:

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) { ... } } 接口站点部件{ 函数getName(); } 类页面实现SitePart{ 函数页($name,$content){…} 函数getName(){…} 函数getContent(){…} } 类类别实现SitePart{ private$parts=array() 函数类别($name){…} 函数getName(){…} 函数add(SitePart$part){$this->parts[$part->name]=$part} 函数get($partName){return$this->parts[$name]} } 类站点扩展类别{ 函数站点($name){…} } 要创建层次结构和页面,请执行以下操作:

Site Categ 1 Page 1 Categ 1.1 Categ 2 场地 类别1 第1页 类别1.1 类别2 $site=新站点(); $categ1=新类别(“categ1”); $categ11=新类别(“categ1.1”); $categ2=新类别(“categ2”); $site->add($categ1); $site->add($categ2); $categ1->add($categ11); $categ1->add(新页面('Page 1','Hello world'); 现在检索第1页,例如:

$page = $site->get('Categ 1')->get('Page 1'); echo $page->getContent(); $page=$site->get('categ1')->get('page 1'); echo$page->getContent(); 我希望这会对你有所帮助

$page = $site->get('Categ 1')->get('Page 1'); echo $page->getContent();