关于OOP和PHP有点困惑

时间:2010-04-21 11:46:22

标签: php oop

我之前已经编程了很多程序风格,在这几个月里我决定去OOP。

我对OOP和PHP有点困惑。假设我的数据库中有Categories表和Pages表。我想做一个页面类和一个类别类。

假设我有一个页面显示有关该类别的信息,并且会有一个属于该类别的页面列表。我将如何以OOP方式实现它?

我认为类别类有一个属性(数组),它将包含它拥有的所有页面。那么那就是我很困惑的部分。我是否应该有一个方法可以从数据库中获取具有正确categoryID的所有页面,并且我应该将所有行实例化为Page对象吗?

或者我应该在Pages类中的Category-class和getAllPages方法中使用setPages方法,并使用该方法将所有页面设置为Category-class。

嗯我失去了。 :d

5 个答案:

答案 0 :(得分:1)

好像你在混合数据库和OOP。我建议您首先以面向对象的方式对类进行建模,然后担心数据库。要回答你的问题,你肯定应该为每个页面和每个类别都有一个唯一的对象。

对于数据库部分,我建议您使用数据映射器模式(http://martinfowler.com/eaaCatalog/dataMapper.html)或ORM(http://en.wikipedia.org/wiki/Object-relational_mapping)模式。

答案 1 :(得分:1)

您不必从数据库加载所有页面和数据。常见的解决方案是使用所谓的活动记录。每个数据库行一个对象。例如:

class Page
{
var $id;
var $title;
var $txt;
function __construct($id) {...} // load from database
function save() {...} // save to database edited data
}

您可以创建类Record,例如:

class Record
{
var $tablename; // table name
var $row; // associative array - represents a row from a database

function __construct($tablename, $id)
// standard use cases with database
function save(); // will save a row to the database table
function load(); // will retrieve a row from the database table
function delete();
}

用法:

$page = new Record('page', 10);
echo $page['title'];

这只是一个非常简单的解决方案。 有关更好的示例,请参阅CodeIgniter Active Records。

答案 2 :(得分:0)

面向对象编程是一个很大的主题,它不像你想象的那样具有语言特定性。

你有一本优秀的PHP OOP教程,我建议你去这里阅读: OOP Part 1OOP Part 2

对于PHP开发,我强烈建议您切换到OOP开发风格:

  1. 你会写更少的代码。
  2. 维护起来会更容易。
  3. 扩展会更容易。

答案 3 :(得分:0)

如果我愿意这样做会是正确的:

例如:

$category = new Category();
$category->setPages(); // This would get all the pages (with the right categoryID) from the database and istantiate every row as an object to an array in the Category-class.

然后我可以这样做:

foreach($category->getPages() as $page) {
     echo $page->getName()."<br>";
}

答案 4 :(得分:0)

创建一个Page类。

创建一个Category类。它的一个属性应该是一个名为$ pages(或类似)的Page对象数组。

在Category类中创建一个名为getPages()的方法,它将返回$ pages数组。如果你愿意,这可以是一个“延迟加载”方法,在调用它时从数据库获取页面并将它们缓存在$ pages属性中。或者,您可以在创建Category对象时加载所有Page对象。你的电话。

如果您需要或想要,请在Category类中创建一个名为setPages($newArray)的方法。此方法应该用于使用$ newArray参数的值覆盖$ pages数组属性。

setX()方法(传统上)用于设置属性的值,而不是启动数据库查找或其他数据生成方案。他们大部分时间都会这样:

public function setPages($newArray)
{
    // data checking here to make sure $newArray is valid
    $this->pages = $newArray;
}