php 类的性能损失

2024-01-12

我正在为我的公司开发一个网络应用程序。该应用程序用于跟踪我们购买(和使用)的工具。

公司中的员工每次使用工具时都会在应用程序(mysql db)中注册。 到目前为止,我都是以过程风格编写代码。我仍然是 OOP 的新手,我的程序代码运行良好并且相对较快。

现在应用程序变得越来越大,我在维护旧的编码模式方面确实遇到了问题,所以我认为是时候继续前进并尝试实现 OOP 了。我现在面临的问题是,我以某种方式创建了我的类,因此应用程序的速度比以前慢了 10 倍。我的其中一个页面需要 1 秒才能加载 - 如果没有类,则需要 0.1 秒。 我使用 php microtime 来衡量这一点。

我创建了一个 Company 类,其中包含每个公司的属性。 班级片段:

class Company {

    private $companyId;
    private $name;
    private $cvr;
    etc…..

    private $tools = array();

}

到目前为止,它正在按预期工作。现在我想创建一个方法来获取所有 companytools 并将其附加到 $tools 数组。

public function tools() {

    $purchases = $db
    ->table('CompanyTools')
    ->select(
        'id'
    )
    ->where('CompanyTools.companyId', '=', $this->companyId)
    ->get();

    $objects = array();

    foreach ($purchases as $purchase) {

        $objects[] = new CompanyTool($purchase['id']);

    }

    $this->tools = $objects;

    return $this->tools;

}

现在,当我像这样使用它时,我遇到了前面提到的性能问题

foreach ($company->tools() as $purchase) {

    echo $purchase->id;

}

我怀疑这与创建 CompanyTool 类的新实例的循环有关。 CompanyTool 类看起来像这样

class CompanyTool {

    function __construct($id = null) {

    if(!$id) die("We need the id");

    $this->id = $id;

    $attributes = $db
        ->table('CompanyTools as ct')
        ->select(
            'ct.*'
        )
        ->where('ct.id', '=', $this->id)
        ->take(1)
        ->get();

    foreach($attributes as $attribute)
        foreach ($attribute as $key => $value) {
            if(property_exists($this, $key))  $this->{$key} = $value;
        }
    return $this;       


}

我希望我想要实现的目标以及我缺乏 OOP 知识是显而易见的:)

感谢您的输入

/ j


您可以进行简单的重新排列,这应该可以节省一些周期:

// get all fields in this query
$purchases = $db
  ->table('CompanyTools')
  ->select('ct.*')
  ->where('CompanyTools.companyId', '=', $this->companyId)
  ->get();

foreach ($purchases as $purchase) {
    // and pass each row to the constructor
    $objects[] = new CompanyTool($purchase);
}

// ====
class CompanyTool 
{
    function __construct(array $attributes) 
    {
        if (!isset($attributes['id'])) die("We need the id");

        // no need to perform any query here
        foreach ($attributes as $key => $value) {
            if (property_exists($this, $key))  $this->{$key} = $value;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php 类的性能损失 的相关文章

随机推荐

  • Laravel 扩展 TestResponse 类

    我正在尝试添加自定义断言TestReponse https laravel com api 5 5 Illuminate Foundation Testing TestResponse html类所以我可以做这样的事情 response t
  • 如何使多个带有 OR 的 LEFT JOIN 完全使用复合索引? (第2部分)

    它用于计算用户进入 离开工作场所时如何扫描指纹的系统 我不知道它的英文怎么称呼 我需要确定用户是否早上迟到 以及用户是否提前下班 This tb scan表包含用户扫描指纹的日期和时间 CREATE TABLE tb scan scperc
  • Swift:如何使用关联的应用程序打开文件?

    我喜欢在 macOS 上使用 Excel 打开 xls 文件 我只找到了 C 的示例 但没有找到 Swift 的示例 附加问题 即使该文件扩展名与 Excel 无关 是否也可以使用 Excel 启动该文件 有NSWorkspace shar
  • linux内存初始化时内核CPU使用率高

    在服务器上引导我的 java 应用程序时 我遇到了 Linux 内核 CPU 消耗高的问题 此问题仅发生在生产中 在开发服务器上一切都是光速 upd9 关于这个问题 有两个疑问 如何修复它 名义动物建议同步并删除所有内容 这确实有帮助 su
  • Delphi XE3 WM_HOTKEY 如何判断HotKey何时被释放?

    我正在尝试在一个并不总是有焦点的通信程序中编写一个 咳嗽按钮 我有用于使麦克风静音和取消静音的代码 MMDevApi 它工作得很好 我设置了一个全局热键 这非常适合设置静音 现在问题来了 如何判断热键何时被释放 我尝试了代码中所示的计时器
  • C 标准库的更安全替代品

    C 标准库在 I O 安全方面是出了名的差劲 许多函数都有缓冲区溢出 gets scanf 或者如果没有给出正确的参数 scanf 等等 每隔一段时间 我就会遇到一位有进取心的黑客 他编写了自己的库 但没有这些缺陷 您见过的这些库中最好的是
  • 如何制作莫里斯条形图动画?

    我正在尝试对莫里斯条形图进行动画处理 莫里斯条形图已显示 但我想要每个条形的动画和不同的颜色 我的代码是 success function response body css cursor default if response statu
  • Webpack 4 模块解析失败:意外字符“@”(1:0)

    当我尝试运行时出现此错误npm run dev将我的 scss 编译为 css 我知道这个问题与 import src scss main scss 中出现错误 模块解析失败 意外字符 1 0 您可能需要适当的加载程序来处理此文件类型 导入
  • 将自定义列表视图与 TextView 和 CheckBox 一起使用,并单选 CheckBox

    听说我使用自定义ListView with TextView and CheckBox 但我希望一次在复选框中进行单一选择 一CheckBox选中后另一项取消选择 使用 BaseAdapter 但这段代码不能正常工作 请给我建议 thnks
  • 如何按照 PKCS#11 将 Microsoft Crypto API 与 USB 适配器一起使用

    我有一家公司提供的 safenet 身份验证 USB 令牌 他们告诉我他们里面有数字公钥证书 他们给了我一个密码和一个软件 通过它我可以看到它可以检测里面的证书 现在我需要访问此令牌的证书 然后我需要使用我的开发代码进行签名 加密和解密 但
  • 如何使用 javascript 或任何库检查用户是否在线?

    我需要一些关于如何使用检查互联网连接的帮助JavaScript or jQuery或任何可用的图书馆 因为我正在开发一个离线应用程序 如果用户离线 我想显示一个版本 如果用户在线 我想显示另一个版本 目前我正在使用这段代码 if navig
  • Pandas 根据条件移动列数据

    I have dataframe看起来像这样 Name Val Rating 0 ABC 123 B 1 DEF 234 B 2 567 B NaN 3 GHI 890 D 但我想通过检查来移动数据 col Name 到下一栏 col Va
  • 将数据从 BeautifulSoup 导出到 CSV

    免责声明 我已经阅读过该领域的许多其他答案 但它们似乎对我不起作用 我希望能够将抓取的数据导出为 CSV 文件 我的问题是如何编写将数据输出到 CSV 的代码 当前代码 import requests from bs4 import Bea
  • t-SNE 在不同的机器上产生不同的结果

    我有大约 3000 个 100D 数据点 我用 t SNE 将它们投影到 2D 每个数据点属于三个类别之一 但是 当我在两台不同的计算机上运行脚本时 我不断得到不一致的结果 当我使用随机种子时 预计会出现一些不一致 但是其中一台计算机不断获
  • 如何通过运行时类型抛出异常?

    我想调用一个可能抛出异常的函数 如果它确实抛出异常 我想捕获它并将异常对象传递给处理函数 处理函数的默认实现只是简单地抛出异常 这是用来说明问题的精简代码 struct base exception exception char const
  • 如何向 StringBuilder 添加一定数量的空格?

    如何向 StringBuilder 添加一定数量 1 到 100 之间 的空格 StringBuilder nextLine new StringBuilder string time Util CurrentTime nextLine A
  • 如何(以编程方式)判断是否有/没有任何支持打开特定文档类型的注册应用程序?

    Apple 的 UIDocumentInteractionController PresentOpenInMenuFromBarButtonItem animated 方法文档指出 如果没有注册的应用程序支持打开文档 则文档交互控制器不会显
  • Android 清单 POST_NOTIFICATIONS 缺少导入

    尝试实现 android 13 或 提拉米苏 的通知权限 但未能获得该权限的导入 现在 目标SDK版本为32 编译SDK版本为32 我也在清单中声明了它 如下所示
  • elixir 中嵌套列表和结构的 get_in

    我有一个结构 s a Bla b c 我要拿c从中获得价值 我正在尝试做 get in s a b 但它并不是为了从结构中获取价值而设计的 有没有类似的东西可以让我获取c从带有嵌套结构的列表中 As 有记录的 https hexdocs p
  • php 类的性能损失

    我正在为我的公司开发一个网络应用程序 该应用程序用于跟踪我们购买 和使用 的工具 公司中的员工每次使用工具时都会在应用程序 mysql db 中注册 到目前为止 我都是以过程风格编写代码 我仍然是 OOP 的新手 我的程序代码运行良好并且相