首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这种PHP对象设计方法是好的还是不好的?

这种PHP对象设计方法是好的还是不好的?
EN

Stack Overflow用户
提问于 2012-09-26 17:23:11
回答 2查看 209关注 0票数 3

对于以面向对象的方式使用PHP,我还是个新手。在我的最新项目中,我将创建一个网站,该网站将从SQL数据库加载大量条目,然后将这些条目发送到视图进行输出。

在摆弄如何以最好的方式完成这项工作的同时,我已经创建了如下代码:

代码语言:javascript
复制
class entryHandler {

//Store database connection
protected $database;

//List of all entries as multidimensional array fetched from SQL.
private $entriesSQL = array();

//List of all entries (as objects) will be stored in our $entries array
private $entriesObjects = array();


/*
 * 
 * Upon construct
 * 
 */
public function __construct($database) {

    //Check if database class has been passed correctly.
    //Else we exit, since we can not function without it!
    if (isset($database)) {

        $this -> database = $database;

        //Get events
        if ($entriesSQL = $this -> getEventsFromSQL()) {
            // Set SQL entries
            $this -> setEntriesSQL($entriesSQL);

            //And turn them into an array of objects
            $this -> setEntryObjects();
        }
        else {

        }
    }
    else {
        echo 'No database connection has been established. Exiting execution.';
        exit();
    }
}


/*
 * Setter for entriesSQL
 */
private function setEntriesSQL($entriesSQL) {
    $this -> entriesSQL = $entriesSQL;
}


/*
 * Getter for entriesSQL
 */
public function getEntriesSQL() {
    return $this -> entriesSQL;
}


/*
 * Setter for entry objects
 * 
 */
private function setEntryObjects() {
    foreach ($this -> getEntriesSQL() as $key => $val) {
        //entryID, entryUserID, entryTitle, entryTimeStart, entryTimeEnd
        array_push($this -> entriesObjects, new entry($val['entryID'], $val['entryUserID'], $val['entryTitle'], $val['entryTimeStart'], $val['entryTimeEnd']));
    }
}


/*
 * 
 * Getter for entry objects
 * 
 */
public function getEntryObjects() {
    return $this -> entriesObjects;
}

/*
 * 
 * This function grabs events from SQL and return multidimensional-array of content.
 * 
 */
private function getEventsFromSQL() {
    //Define the SQL query
    $SQL = '...snippet...';

    if ($entriesSQL = $this -> database -> read($SQL)) {
        //Entries collected, return them.
        return $entriesSQL;
    }
    else {
        //Error occured. Log it and return false.
        return false;
    }
}

}


class entry {

var $entryID;
var $entryUserID;
var $entryTitle;
var $entryTimeStart;
var $entryTimeEnd;

public function __construct($entryID, $entryUserID, $entryTitle, $entryTimeStart, $entryTimeEnd) {
    $this -> setEntryID($entryID);
    $this -> setEntryUserID($entryUserID);
    $this -> setEntryTitle($entryTitle);
    $this -> setEntryTimeStart($entryTimeStart);
    $this -> setEntryTimeEnd($entryTimeEnd);
}

/*
 * Setter for entryID
 */
private function setEntryID($entryID) {
    $this -> entryID = $entryID;
}

/*
 * Getter for entryID
 */
public function getEntryID() {
    return $this -> entryID;
}



/*
 * Setter for entryUserID
 */
private function setEntryUserID($entryUserID) {
    $this -> entryUserID = $entryUserID;
}

/*
 * Getter for entryUserID
 */
public function getEntryUserID() {
    return $this -> entryUserID;
}



/*
 * Setter for entryTitle
 */
private function setEntryTitle($entryTitle) {
    $this -> entryTitle = $entryTitle;
}

/*
 * Getter for entryTitle
 */
public function getEntryTitle() {
    return $this -> entryTitle;
}



/*
 * Setter for entryTimeStart
 */
private function setEntryTimeStart($entryTimeStart) {
    $this -> entryTimeStart = $entryTimeStart;
}

/*
 * Getter for entryTimeStart
 */
public function getEntryTimeStart() {
    return $this -> entryTimeStart;
}


/*
 * Setter for entryTimeEnd
 */
private function setEntryTimeEnd($entryTimeEnd) {
    $this -> entryTimeEnd = $entryTimeEnd;
}

/*
 * Getter for entryTimeEnd
 */
public function getEntryTimeEnd() {
    return $this -> entryTimeEnd;
}
}

现在,类"entryHandler“是从我的控制器(在另一个PHP文件中)加载的,如下所示:

代码语言:javascript
复制
    //Instantiate calenderHandler and pass our database handler to it.
    $entryHandler = new entryHandler($database);

    //Load template
    $template -> calendarEntries = $this -> renderEntries($entryHandler -> getEntryObjects());



/*
 * 
 * This functions renders entries content for view.
 * Returns string with content.
 * 
 */
private function renderEntries($entries) {

    $entriesContent = '';

    foreach ($entries as $entry) {

        $entriesContent .= '{
                                title: "' . $entry -> getEntryTitle() . '",
                                start: "' . $entry -> getEntryTimeStart() . '",
                                end:   "' . $entry -> getEntryTimeEnd() . '"
                            }, ';
    }

    //Right trim entries string, so that we do not add trailing comma to last entry in list.
    $entriesContent = rtrim($entriesContent, ', ');

    //And return content to parse it to view.
    return $entriesContent;
}
 }

这是一个糟糕的设计模式吗?有什么我应该用另一种方式做的事情吗?这段代码有没有什么地方需要修改?-有什么我应该注意的吗?

感谢大家抽出宝贵的时间。

你好,费舍尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-26 17:38:03

看起来你所做的就是抛出数据。这可能不一定是错的,但您可以做一些其他的事情。不是将所有SQL条目都存储在一个数组中,而是这样:

从database.

  • Create中获取数据的
  • 保存此数据的对象。(对象关系映射)

因此,不是抛出实际数据,而是抛出包含数据的对象。

这是一个好主意,因为可以很容易地更改数据行为的方式,或者添加数据提取的方式,或者您可能需要的任何东西。

此外,您正在做的事情不一定属于OOP类别。你只是在一个类中包含了很多函数。

创建类以执行所需的操作,并使类尽可能小。每次你做一些你所在的类没有被创建来做的事情时,创建一个新的类来处理你需要的东西。

OOP示例

学习如何做OOP的一个很好的方法,就是观察别人是怎么做的。我建议你去看看其他项目,看看他们是怎么做的。

Symfony2 -一个使用OOP的复杂的php框架。

Slim

CodeIgniter

LavarelPHP

票数 3
EN

Stack Overflow用户

发布于 2012-09-26 17:46:42

我非常同意Kao的回答。无论如何,如果你真的想自己做这件事,而不是使用任何DBAL,我建议你阅读一些docs on ORMs

在你的代码中,允许construct一次处理很多事情不是一个好主意。清理并分离它们。使用依赖注入,而不是在类/方法中创建对象。

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

https://stackoverflow.com/questions/12598491

复制
相关文章

相似问题

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