PHP继承和MySQL

2024-01-09

所以我尝试在 PHP 中采用良好的面向对象编程技术。我的大多数(阅读全部)项目都涉及 MySQL 数据库。我眼前的问题涉及我需要开发的用户模型。

我当前的项目有代理和潜在客户。代理和潜在客户都是拥有许多相同信息的用户。因此,显然,我想要一个 Agents 类和 Leads 类来扩展公共类 Users。现在,我的问题如下:

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

我尝试寻找通常如何处理此问题的示例,但没有成功......也许我只是在寻找错误的东西?


基本上,您可以使用三种方法来解决此问题(我将立即消除其中一种方法):

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

为简单起见,我通常推荐(2)。所以一旦你有了桌子:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  type VARCHAR(10),
  name VARCHAR(100)
);

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

  • 你有一个 User 父类;
  • 您有两个子类:Lead 和 Agent;
  • 这些孩子都有固定的类型。

它应该很容易就位。

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

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);
  }
  ...
}

工厂可能看起来像这样:

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]'");
  }
}

或者,您可以让工厂方法成为 User 类上的静态方法和/或使用类类型的查找表。

也许从最严格的 OO 意义上来说,用查询结果资源污染类是一个有问题的设计,但它很简单并且有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP继承和MySQL 的相关文章

  • 使用 CodeIgniter 加载视图文件夹外的视图

    我需要从以下范围之外加载视图 this gt load gt view 这似乎是从base application views目录 如何从外部访问视图 application 目录 我想我将不得不延长CI Loader class这是最好的
  • python多重继承,调用基类函数

    我只是尝试在 python 中进行多重继承 我想出了这个 class ParentOne def foo self print ParentOne foo is called class ParentTwo def foo self pri
  • 提交简单 PHP 表单时出现禁止错误

    我有一个不复杂的问题 这似乎比应有的更复杂 我有一个简单的表单 用于向网站添加内容 有些字段需要输入html 然而 当您在表单的不同部分输入某些 html 元素时 它会认为它讨厌您并抛出禁止的 403 错误 这是下面的表格
  • MySQL 中的 UDF 性能

    我注意到 当查询在 SELECT 或 WHERE 子句中调用 UDF 时 MySQL 查询执行时间的性能会呈指数级下降 有问题的 UDF 查询本地表以返回标量值 因此它们不仅执行算术表达式 而且充当相关子查询 我通过简单地删除 UDF 并使
  • 在 PHP 中使用可变变量是不好的做法吗?

    例如 一个简单的MVC类型系统 api class method使用重写为 PHP 变量 htaccess nginx conf 然后做类似的事情
  • 如何在 MacOS 上卸载 Mysql Shell

    我错误地安装了 MySql Shellhttps dev mysql com doc mysql shell 8 0 en https dev mysql com doc mysql shell 8 0 en 在我的 MacBook Pro
  • 从模块中获取类名

    如何从模块中获取该模块包含的类的类名 module ActMethods def some method attr names cls self class this doesn t work end end 如何进入 cls 变量 加载此
  • 在 MySQL 中创建布尔列并将 false 作为默认值?

    我想在 MySQL 中创建一个表boolean默认值为的列false 但它默认接受 NULL 你必须指定0 意思是假 或1 意思是 true 作为默认值 这是一个例子 create table mytable mybool boolean
  • 如何捕获反序列化异常?

    PHP 是否可以在以下情况下捕获异常 unserialize 产生错误 一个简单的方法是 ret unserialize foo if ret null Error case 但这不是最现代的解决方案 最好的方法是像前面提到的那样有一个自定
  • 如何编写 bash 函数来包装另一个命令?

    我正在尝试编写一个函数包装器mysql command If my cnf存在于 pwd 中 我想自动附加 defaults file my cnf到命令 这就是我正在尝试的 function mysql if e my cnf then
  • Sublime Text 编辑器中的 PHP 语法检查

    在Gedit中 我可以在当前文档上添加 php l 外部工具 如果我安装了PHP命令行 它将对文档进行语法检查 有没有办法用 Sublime Text 编辑器来做到这一点 注意 我有一台 Mac 并且安装了 PHP CLI 我想我必须将代码
  • 有没有办法只安装mysql客户端(Linux)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有不需要安装整个mysql db安装包的Linux mysql命令行工具 我想做的是从服务器 1 应用程序服务器 执行将在服务器 2
  • PHP + MySQL 队列

    我需要一个充当队列的简单表 我的 MySQL 服务器限制是我不能使用 InnoDB 表 只能使用 MyISAM 客户 工人将同时工作 他们每次都需要接受不同的工作 我的想法是执行以下操作 伪代码 job lt SELECT FROM que
  • 未知的表引擎“InnoDB”

    最近 我发现如果我有好的硬件 我可以最大限度地提高 mysql 的性能 由于我一直在使用 InnoDB 所以我在 my ini 中添加了额外的配置 以下是新添加的配置 innodb data file path ibdata1 10M au
  • 什么是 PHP session_start()

    它是否基于 cookie 启动当前会话 从 PHP 网站上得到的 PHP如何控制会话 如果我在用户打开我的登录页面时启动会话 我什至可以使用该会话做什么 我可以使用当前会话来获取有关登录用户的信息吗 PHP 会话系统允许您将数据安全地存储在
  • 访问 PHP 数组对象受保护的属性

    我正在尝试在 Symfony2 中上传多个文件 我正在尝试访问以下请求对象 但无法获取参数属性 如何将文件一一上传 我得到的错误 致命错误 无法访问第 66 行 var www File src Webmuch FileBundle Ent
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 使用 yaml 路由描述时如何在运行时获取 Symfony2 中的路由名称?

    在这里你可以找到我的n关于 Symfony2 的第一个问题 我正在与一个分页捆绑 https github com makerlabs PagerBundle wiki使用中提供的路由名称routing yml文件 从我的角度来看 这种方法
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • Nginx 安全链接模块不适用于 php 文件,但适用于静态文件

    我在用http nginx org en docs http ngx http secure link module html http nginx org en docs http ngx http secure link module

随机推荐

  • Apache MQ Artemis - MQTT 保留消息对于连接到集群中其他节点的客户端不可用

    I have 4 ActiveMQ 阿耳忒弥斯 2 10 1实例运行在cluster 客户端 A 连接到其中一个节点并发布MQTTQoS 0 的消息并且保留 真 当新的 MQTT 客户端 B 连接到另一个节点在集群中并订阅了该主题 之前发送
  • Flutter报错无法启动守护进程

    我的 flutter 项目在我的旧笔记本电脑上运行顺利 但是当我使用我的新笔记本电脑时 我的 flutter 项目无法在调试模式下运行 这个错误 FAILURE Build failed with an exception What wen
  • 检查字符串是否包含CJK(中文)字符[重复]

    这个问题在这里已经有答案了 我需要检查一个字符串是否包含中文字符 搜索后我发现我必须使用正则表达式查看此模式 u31C0 u31EF 但我无法让正则表达式工作 有人经历过这种情况吗 正则表达式正确吗 正如所讨论的here https sta
  • Hibernate 的重复密钥问题

    使用 Hibernate 4 0 我有三个 hibernate 实体 歌曲 封面艺术 封面图片 Songs 代表音乐文件 CoverImage 代表图像 Cover Art 用于将封面图像与歌曲相关联 一首歌曲可以包含多个封面图像 Song
  • React Redux 与路由器位置、分页/排序和获取

    我正在编写一些通用的 Todo List 组件 具有以下功能 分页 排序 保留 URL 中的部分状态 页面 排序 使用 HTTP 请求异步获取数据 使用 redux saga 现在 我正在尝试寻找 最佳 redux 操作序列的模式 以使该操
  • 将资源放入jar文件中并将其公开给网络

    我有一个 Web 应用程序 其资源文件夹中有一堆 js 和 css 文件 我如何将它们公开到网络上以便能够在我的网页中引用它们 以及如何引用这些文件 我还想稍后将这些资源放在一个单独的 jar 文件中 并且 就像上一个问题一样 也将它们公开
  • Phonegap Hook - execvp 权限被拒绝

    我正在尝试运行我在网上找到的phonegap hook 但我总是在构建时遇到相同的错误 execvp Permission denied 该钩子是位于此处的 splash and icon 钩子 http devgirl org 2013
  • Dijkstra 算法是确定性的吗?

    我认为 Dijkstra 算法是确定的 因此如果您选择相同的起始顶点 您将得到相同的结果 到每个其他顶点的距离相同 但我不认为它是确定性的 它为每个操作定义了以下操作 因为这意味着它不必首先搜索最短距离 我对么 如果我错了 你能解释一下为什
  • 屏蔽 UIView、CALayer 的动画

    我正在努力实现以下目标 用户点击视图 circular视图会在其左侧弹出 其中包含一些图像内容 视图应该从触摸点开始动画到触摸视图外部左侧的最终帧 在动画过程中 它应该是一个圆圈 增长到正确的位置和大小 一切都与下面的代码配合得很好 仅此而
  • Css3 @fontface 不适用于 Chrome 17 和 Firefox 10

    我正在尝试将此代码用于阿拉伯字体的 fontface font face font family MothnnaFont src url fonts mothnna eot IE9 Compat Modes src url fonts mo
  • Spring Hibernate 5.4.22.Final:javax.persistence.TransactionRequiredException:升级 Spring Boot 时没有正在进行事务

    我最近从 Spring Boot 1 5 更新到 2 3 5 但在保存数据时遇到了一些问题 我的应用程序是 Spring Batch 它读取 处理数据并将数据写入数据库 读取器和处理器都很好 但编写器出现了问题 它在 1 5 spring
  • mod_pagespeed 缓存文件夹中的奇怪域

    大约一年前 我在我的 VPS 服务器上安装了 mod pagespeed 对其进行设置并使其运行 最近 我正在探索服务器上的文件 进入 pagespeed 缓存文件夹 发现了一些奇怪的文件夹 所有文件夹通常都以这种方式命名 2Fwww my
  • 如何创建自定义 Murmur Avalanche 混合器?

    我正在尝试使用 Avalanche 混合器来散列整数坐标 我一直在使用杂音3的 https en wikipedia org wiki MurmurHash cite note Horvath 732 位和 64 位雪崩混合器这样做 而不是
  • QLPreviewController 隐藏底部工具栏

    I use QLPreviewController在我的应用程序中 想要隐藏底部工具栏 该工具栏允许在其数据源项目中移动 有可能以某种方式做吗 我尝试将其搜索为subview of QLPreviewController s view但它只
  • 如何捕获 TDataModule.OnCreate 事件中的异常?

    我在 Delphi 中遇到了以下问题try except block 我有一个简单的应用程序 一个名为 MainFormfr MAIN和一个TDataModule named DM DM不是自动创建的 而是在运行时创建的fr MAIN s
  • 如何在 Rails 4 中重新加载路线 /config/routes/* ?

    如何强制rails 4重新加载所有路线文件 也就是说 无需重新启动应用程序即可从 config routes 创建路由 rb 已加载 我在 config routes 中将它们分开 rb 但是这些 config routes 文件不会重新加
  • Azure Blob - 503 出口超出帐户限制

    所以我偶尔会收到这个错误 初始化流读取器时出错或未找到 Blob 响应状态 代码不表示成功 503 出口超过该帐户 限制 我不知道帐户限制 并且文件不应大到足以突破吞吐量限制 Blob 存储具有一些令人惊讶的高吞吐量限制 有谁见过这个并知道
  • X11 为什么我无法绘制任何文字?

    我正在努力学习X11 这对我来说非常困难 因为我没有 Linux 上的窗口应用程序的经验 我写了一些简单的代码 但无法解决这个不可见的文本问题 一切可能都工作正常 当我尝试使用 DrawRectangle 函数绘制矩形时 它正在工作 这是代
  • 仅将对话中的最新回复复制到剪贴板

    我有以下 Outlook VBA 代码 可将所选电子邮件的正文复制到 Windows 剪贴板 Sub CopyMailToClipboard On Error GoTo HandleErr Copies the selected messa
  • PHP继承和MySQL

    所以我尝试在 PHP 中采用良好的面向对象编程技术 我的大多数 阅读全部 项目都涉及 MySQL 数据库 我眼前的问题涉及我需要开发的用户模型 我当前的项目有代理和潜在客户 代理和潜在客户都是拥有许多相同信息的用户 因此 显然 我想要一个