我正在使用PHP设计一个小的CMS,同时将OOP付诸实践。不过,我遇到了一个问题。
我有一个页面类,它的构造函数接受一个UID和一个slug。然后用它来设置属性(除非页面不存在,在这种情况下它会失败)。不管怎样,我想实现一个函数来创建一个页面,我想...在不重载构造函数的情况下,最好的方法是什么?做这件事的正确方式,或者更传统的方法是什么?
我的代码如下:
<?php
class Page {
private $dbc;
private $title;
private $description;
private $image;
private $tags;
private $owner;
private $timestamp;
private $views;
public function __construct($uid, $slug) {
}
public function getTitle() {
return $this->title;
}
public function getDescription() {
if($this->description != NULL) {
return $this->description;
} else {
return false;
}
}
public function getImage() {
if($this->image != NULL) {
return $this->image;
} else {
return false;
}
}
public function getTags() {
if($this->tags != NULL) {
return $this->tags;
} else {
return false;
}
}
public function getOwner() {
return $this->owner;
}
public function getTimestamp() {
return $this->timestamp;
}
public function getViews() {
return $this->views;
}
public function createPage() {
// Stuck?
}
}发布于 2011-06-24 15:36:56
PHP不支持重载。我可能会选择这样的东西:
$oPage = new Page();
$oPage->setTitle($sSomeTitle);
$oPage->setcontent($sSomeContent);
$oPage->save();或者你可以创建一个额外的对象--负责处理这个问题。
$oPage = new Page();
$oPage->setTitle($sSomeTitle);
$oPage->setcontent($sSomeContent);
PageManager::create($oPage);这样做的好处是,您的页面类仍然是一个纯数据容器,其中加载/保存的所有逻辑都在一个单独的类中完成。
发布于 2011-06-24 15:43:15
您可以使成为静态的方法,它返回页面对象
public static function CreatePageWithExtraAttribute($uid, $slug, $extra) {
$page = new Page($uid,$slug);
//your code here
return $page;
}或者创建查询数据库的静态方法,例如
public static function CreatePage($extra) {
list($uid,$slug) = SomeDatabaseManager::GetUidSlug();
$page = new Page($uid,$slug);
//your code here
return $page;
}然后使用它
$page=Page::CreatePageWithExtraAttribute($title)发布于 2011-06-24 15:44:47
我把这些参数放在一个构造器中,没有这个构造器,一个对象就不能存在。可以通过调用对象的setter来设置对象的其他(可选)属性。
例如,在您的示例中,页面似乎总是有一个UID,如果没有UID,系统将无法识别它,因此它应该是构造函数的参数,我将构建它,使构造函数的被调用者不能调用空构造函数,因为它对页面类没有任何意义。
页面可以没有内容,甚至没有任何标题,但是如果没有UID或URI,它对系统就没有意义。因此,我的被调用者的代码将如下所示:
$page = new Page($uid);
$page->setTitle($sSomeTitle);
$page->setcontent($sSomeContent);
$page->render();但是,我的讨论主要是针对您的类进行建模。我个人认为Wesley's answer中的第二种解决方案更好。
https://stackoverflow.com/questions/6464747
复制相似问题