改进构造函数

Chi*_*ins 1 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;
   }
  }
 }
Run Code Online (Sandbox Code Playgroud)

Mat*_*ell 5

一些想法:

  • 全球都很糟糕
  • 应该将数据库调用隔离到数据访问层,理想情况下是ORM种类,这样您就不会编写手动SQL.
  • 如果有什么$resource"ddd",你想用会员member_id1
  • 您无法防范SQL注入.
  • 你不member_list应该创建新Member对象(或者这个类被调用的任何东西)而不是简单地追加行数据吗?


Hom*_*er6 5

首先,不要在构造函数中工作.其次,有很多软件包可以完成您正在尝试做的事情,并且做得非常好.

你想写的东西叫做模特.它是一个镜像数据库中的表的类.使用成熟的ORM(对象关系映射器)包(如PropelDoctrine)自动生成基于数据库模式的类.我个人推荐Propel over Doctrine(尽管它们都是很棒的包).

另外,我建议你使用symfony php框架,它将Propel集成为ORM(同样,你可以使用Doctrine作为替代ORM与Symfony).

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

祝你好运