PHP继承和MySQL

Spa*_*usA 6 php mysql inheritance

所以我试图采用PHP的良好的面向对象编程技术.大多数(全部读完)我的项目都涉及MySQL数据库.我的直接问题涉及我需要开发的用户模型.

我目前的项目有代理商和潜在客户.代理商和潜在客户都是具有大量相同信息的用户.所以,显然,我想要一个类Agents和一个类Leads来扩展一个公共类Users.现在,我的问题如下:

如何最好地处理SQL来加载这些对象?我实例化代理或潜在客户时,我不想执行多个SQL语句.但是,逻辑告诉我,当用户构造函数被触发时,它应该执行一个SQL语句来加载代理和潜在客户之间的公共信息(用户名,密码,电子邮件,联系信息等).Logic还告诉我,当激活Agents或Leads构造函数时,我想执行SQL来加载Agents或Leads类的唯一数据....但是,逻辑也告诉我执行2是个坏主意每次我需要代理或潜在客户时的SQL语句(因为每个可能有数千个).

我已经尝试过搜索一般如何处理但没有成功的例子......也许我只是在寻找错误的东西?

cle*_*tus 7

你基本上有三种解决这个问题的方法(其中一种我会立即消除):

  1. 每班一张桌子(这是我要消除的一张桌子);
  2. 包含可选列的记录类型; 和
  3. 具有子表的记录类型,具体取决于您加入的类型.

为简单起见,我一般建议(2).所以,一旦你有了你的桌子:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  type VARCHAR(10),
  name VARCHAR(100)
);
Run Code Online (Sandbox Code Playgroud)

其中type可以是'AGENT'或'LEAD'(例如).或者,您可以使用一个字符类型代码.然后,您可以开始使用对象模型填充空白:

  • 你有一个用户父类;
  • 你有两个子课:领导和代理;
  • 那些孩子有固定的类型.

它应该很容易到位.

至于如何加载一个语句,我会使用某种工厂.假设这些准系统类:

class User {
  private $name;
  private $type;
  protected __construct($query) {
    $this->type = $query['type'];
    $this->name = $query['name'];
  }
  ...
}

class Agent {
  private $agency;
  public __construct($query) {
    parent::constructor($query);
    $this->agency = $query['agency'];
  }
  ...
}

class Lead {
  public __consruct($query) {
    parent::constructor($query);
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

工厂看起来像这样:

public function loadUserById($id) {
  $id = mysql_real_escape_string($id);  // just in case
  $sql = "SELECT * FROM user WHERE id = $id";
  $query = mysql_query($sql);
  if (!query) {
    die("Error executing $sql - " . mysql_error());
  }
  if ($query['type'] == 'AGENT') {
    return new Agent($query);
  } else if ($query['type'] == 'LEAD') {
    return new Lead($query);
  } else {
    die("Unknown user type '$query[type]'");
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以将工厂方法设置为User类的静态方法和/或使用查找表来获取类的类.

也许使用查询结果资源来污染类是最严格的OO意义上的可疑设计,但它很简单并且有效.