OO PHP中可重用结构的说明

时间:2009-03-18 03:03:40

标签: php oop class

有人可以为我解释“可重复使用的结构”吗? 我正在努力在PHP中制作一些数据库对象,但被告知我在计算机上使用了太多的处理因为我使用以下对象复杂化了东西:

我的数据库对象:

$db = new Database;
$db->db_connect();

$post_content = new DbSelect;
$post_content->select('id', 'title', 'firstName', 'created', 'catName', 'tagName');
$post_content->from('content');   
$post_content->join('inner');
$post_content->on('category','cat_id','id');
$post_content->where('id','1');
$post_content->order('created');

$db->db_close();

普通PHP:

mysql_connect();
mysql_db_select();

$query = 'SELECT id, title, s_name, created, cat_name, tag_name
                FROM content
                JOIN INNER category, cat_id, id
                WHERE id=1
                ORDER created';

mysql_close();

重申我的问题: 1.快速解释可重复使用的结构? 2.为什么第一种方法使用对象“错误”?

请注意: 我将谷歌搜索这个以及希望得到反馈 我知道有一些像Zend这样的“工具”,其中内置了大量的数据库对象,但我正在尝试DIY方法

4 个答案:

答案 0 :(得分:4)

不要将面向对象编程与“面向类”或“基于对象”的编程混淆。从表面上看,它们看起来都像是OOP但不是。

这些是当您使用结构化代码并包装在一堆类中时,但不会更改其运行方式的基础知识。在编写对象时考虑对象,但不要利用OOP为您提供的任何特殊约定(多态,聚合,封装等)。这不是OOP。

这有点难以辨别。 DbSelect类的目的是抽象掉原始SQL代码,以便您可以使用连接到任何数据库而无需重写查询吗? (正如许多DBAL解决方案所做的那样)或者你正在“仅仅因为”这样做是为了看起来你已经实现了OOP,因为你将一个基本的SQL查询变成了一系列方法调用?如果后者更接近于创建这组类的动机,那么您可能需要考虑为什么要首先创建这些类和对象。

我应该注意到,从我的简单片段中我可以看出,你实际上在重用性方面没有获得任何东西。现在,您的设计可能包含的代码可以提供我无法看到的灵活性,但有点怀疑它不存在。程序/结构化代码段实际上并不比您提议的基于类的代码片段重复使用。

与你交谈的人有一点 - 开发一个复杂的(甚至简单的)OOP解决方案绝对可以带来许多好处 - 但这样做不考虑这些好处的成本(并且总是成本)充其量是愚蠢的,最糟糕的是危险。

答案 1 :(得分:0)

我不知道从哪里开始。面向对象的设计不是一个微不足道的主题,它有很多方法可以出错。

基本上,您希望尝试在应用程序中创建逻辑独立对象,以便可以将它们交换为具有相同接口的其他模块,或者在将来的项目中重用它们。在您的数据库示例中,查看PEAR :: MDB2。 PEAR :: MDB2将数据库驱动程序从应用程序中抽象出来,这样您就不必担心您正在使用哪个特定的数据库。今天,您可能正在使用MySQL来运行您的站点。明天,你可能会切换到Postgresql。理想情况下,如果您使用适当的OO设计,则无需更改任何代码即可使其正常工作。您只需将数据库层换成另一个。 (Pear :: MDB2使这变得像更改数据库连接字符串一样简单)

我建议您阅读Steve McConnell撰写的Code Complete。关于类的整章都有。虽然这些示例主要是C ++,但这些概念可以应用于任何编程语言,包括PHP。

答案 2 :(得分:0)

您的解决方案似乎涉及更多打字以实现与“正常”方式相同的操作。字符串SQL比为对象分配内存更有效。

如果要创建具有更多功能而不仅仅是选择的数据抽象层,则应该检查Active Record模式。

答案 3 :(得分:0)

如果您正在使用DbSelect对象从复杂的表单构建查询,那么您正在做正确的事情。

Query Object pattern