面向对象的PHP:从DB加载数据以创建对象?

时间:2014-03-25 01:15:13

标签: php mysql

我是PHP新手,所以这里有一个“基本”问题:

我有一张顾客表:

Table 'customers'

id PRIMARY KEY
name VARCHAR 250
email VARCHAR 1000
is_active ENUM 'n','y'

在脚本中,我需要选择所有活跃的客户(is_active =='y')并向他们发送一封感谢邮件。有一个与上表相关联的业务类,称为类Customers。

我可以在不使用OOP的情况下编写非常简单的东西:

$result = mysql_query("SELECT * FROM customers WHERE is_active = 'y'");
while($arr = mysql_fetch_assoc($result))
 send this customer a thank you email...

如果我要使用OOP,我该如何处理上述简单的事情?如果有成千上万的客户,我是否会编写加载数千个客户对象的OO代码,以便向每个客户发送一封电子邮件,如下所示?

$result = mysql_query("SELECT * FROM customers WHERE is_active = 'y');
while($arr = mysql_fetch_assoc($result))
 $objCustomer = new Customer($arr['id']);   //reload what has already been read from the db??
 $objCustomer->sendThankYouEmail();

我上面做错了什么(或愚蠢的)?

2 个答案:

答案 0 :(得分:0)

我不会从数据库重新加载它,而是从数组中重新加载:

$objCustomer = new Customer($arr);
$objCustomer->sendThankYouEmail();

在您的Customer对象中,您从阵列加载数据。

另一种方法是执行以下操作(对象属性应与字段名称匹配):

while($objCustomer = mysql_fetch_object($result, 'Customer')) {
    $objCustomer->sendThankYouEmail();
}

注意:如果您正在开发新功能,则应使用MySQLI或PDO进行参数化查询。

答案 1 :(得分:0)

如果您真的想工作OOP,请尝试使用Doctrine。

Doctrine 2将关系数据库映射到对象。 你可以说。

// obtaining the entity manager
$entityManager = EntityManager::create($conn, $config);

$customerRepository = $entityManager->getRepository('Customer');
$customers = $customerRepository->findAll();

forLoop(){
   $customers[index]->email  // To get the email and do whatever you want with the customer object.
}

有了这样的事情,你只需要试着看看它是否适合你。