首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象编程问题

面向对象编程问题
EN

Stack Overflow用户
提问于 2011-06-24 15:32:45
回答 3查看 280关注 0票数 2

我正在使用PHP设计一个小的CMS,同时将OOP付诸实践。不过,我遇到了一个问题。

我有一个页面类,它的构造函数接受一个UID和一个slug。然后用它来设置属性(除非页面不存在,在这种情况下它会失败)。不管怎样,我想实现一个函数来创建一个页面,我想...在不重载构造函数的情况下,最好的方法是什么?做这件事的正确方式,或者更传统的方法是什么?

我的代码如下:

代码语言:javascript
复制
<?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?
    }
}
EN

回答 3

Stack Overflow用户

发布于 2011-06-24 15:36:56

PHP不支持重载。我可能会选择这样的东西:

代码语言:javascript
复制
$oPage = new Page();
$oPage->setTitle($sSomeTitle);
$oPage->setcontent($sSomeContent);
$oPage->save();

或者你可以创建一个额外的对象--负责处理这个问题。

代码语言:javascript
复制
$oPage = new Page();
$oPage->setTitle($sSomeTitle);
$oPage->setcontent($sSomeContent);
PageManager::create($oPage);

这样做的好处是,您的页面类仍然是一个纯数据容器,其中加载/保存的所有逻辑都在一个单独的类中完成。

票数 0
EN

Stack Overflow用户

发布于 2011-06-24 15:43:15

您可以使成为静态的方法,它返回页面对象

代码语言:javascript
复制
public static function CreatePageWithExtraAttribute($uid, $slug, $extra) {
    $page = new Page($uid,$slug);
    //your code here
    return $page;
}

或者创建查询数据库的静态方法,例如

代码语言:javascript
复制
public static function CreatePage($extra) {
    list($uid,$slug) = SomeDatabaseManager::GetUidSlug();
    $page = new Page($uid,$slug);
    //your code here
    return $page;
}

然后使用它

代码语言:javascript
复制
$page=Page::CreatePageWithExtraAttribute($title)
票数 0
EN

Stack Overflow用户

发布于 2011-06-24 15:44:47

我把这些参数放在一个构造器中,没有这个构造器,一个对象就不能存在。可以通过调用对象的setter来设置对象的其他(可选)属性。

例如,在您的示例中,页面似乎总是有一个UID,如果没有UID,系统将无法识别它,因此它应该是构造函数的参数,我将构建它,使构造函数的被调用者不能调用空构造函数,因为它对页面类没有任何意义。

页面可以没有内容,甚至没有任何标题,但是如果没有UID或URI,它对系统就没有意义。因此,我的被调用者的代码将如下所示:

代码语言:javascript
复制
$page = new Page($uid);
$page->setTitle($sSomeTitle);
$page->setcontent($sSomeContent);
$page->render();

但是,我的讨论主要是针对您的类进行建模。我个人认为Wesley's answer中的第二种解决方案更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6464747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档