改进构造函数

时间:2010-07-23 05:26:38

标签: php oop

好吧,我正在为我的网站制作一个会员班。我想尽可能优化它。目前,构造函数可以使用($ resource)int(从数据库中的一个成员获取信息,基于id)或int数组(从数据库中获取多个成员,并将它们存储在数组成员变量中) )。

我想知道在我继续创建我的网站的更多部分之前,我可以使用下面的代码块进行任何改进。什么可以改变,使其更好?做这种事情我应该遵循更好的布局吗?

public function __construct($resource) {
  global $database;
     if (is_string($resource) || is_int($resource)) {
            $resource = (int)$resource;
   $query = $database->query("SELECT * FROM members WHERE member_id = {$resource} LIMIT 1");
   $row = $database->get_row($query);

         foreach ($row as $key => $value) {
               $this->field[$key] = $value;
            }
  } else if (is_array($resource)) {
   $query = $database->query("SELECT * FROM members WHERE member_id IN(" . implode(",",$resource) . ")");
   while ($member = $database->get_row($query)) {
    $this->member_list[$member['member_id']] = $member;
   }
  }
 }

2 个答案:

答案 0 :(得分:5)

一些想法:

  • Globals很糟糕
  • 数据库调用应该与数据访问层隔离,理想情况是数据访问层,以便您不编写手动SQL。
  • 如果$resource"ddd",您希望会员member_id1吗?
  • 您无法防范SQL注入。
  • 你的member_list不应该创建新的Member对象(或者这个类被调用的任何对象)而不是简单地追加行数据吗?

答案 1 :(得分:5)

首先,不要在构造函数中工作。其次,有很多套餐可以完全按照您的要求去做,而且做得非常好。

您要编写的内容称为模型。它是一个镜像数据库中的表的类。使用成熟的ORM(对象关系映射器)包(如PropelDoctrine)自动生成基于数据库模式的类。我个人推荐Propel over Doctrine(尽管它们都是很棒的包)。

另外,我建议您使用symfony php framework,它将Propel集成为其ORM(同样,您可以将Doctrine用作Symfony的替代ORM)。

最后,不要使用全局变量。围绕任何访问资源编写一个类。进行静态调用以检索其单例实例(如Database :: getInstance())是访问数据库(或任何其他)资源的首选方法。

祝你好运