Spa*_*usA 6 php mysql inheritance
所以我试图采用PHP的良好的面向对象编程技术.大多数(全部读完)我的项目都涉及MySQL数据库.我的直接问题涉及我需要开发的用户模型.
我目前的项目有代理商和潜在客户.代理商和潜在客户都是具有大量相同信息的用户.所以,显然,我想要一个类Agents和一个类Leads来扩展一个公共类Users.现在,我的问题如下:
如何最好地处理SQL来加载这些对象?我实例化代理或潜在客户时,我不想执行多个SQL语句.但是,逻辑告诉我,当用户构造函数被触发时,它应该执行一个SQL语句来加载代理和潜在客户之间的公共信息(用户名,密码,电子邮件,联系信息等).Logic还告诉我,当激活Agents或Leads构造函数时,我想执行SQL来加载Agents或Leads类的唯一数据....但是,逻辑也告诉我执行2是个坏主意每次我需要代理或潜在客户时的SQL语句(因为每个可能有数千个).
我已经尝试过搜索一般如何处理但没有成功的例子......也许我只是在寻找错误的东西?
你基本上有三种解决这个问题的方法(其中一种我会立即消除):
为简单起见,我一般建议(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意义上的可疑设计,但它很简单并且有效.