【问题标题】:Will my project slow down if I start a lot of classes inside the class?如果我在课堂上开很多课,我的项目会变慢吗?
【发布时间】:2021-11-24 06:17:52
【问题描述】:

我有一个名为 products 的课程。而且我需要在这个类的 __construct 函数中初始化至少 12 个新类。如果我按以下方式运行它,会不会对网站性能有很大影响?是否有替代或更简单的方法?

注意:我的 PHP 版本是 v8

例如:

<?php
class products(){

    function __construct(){
        $this->class_1 = new Class_1();
        $this->class_2 = new Class_2();
        $this->class_3 = new Class_3();
        $this->class_4 = new Class_4();
        $this->class_5 = new Class_5();
        $this->class_6 = new Class_6();
        $this->class_7 = new Class_7();
        $this->class_8 = new Class_8();
        $this->class_9 = new Class_9();
        $this->class_10 = new Class_10();
        $this->class_11 = new Class_11();
        $this->class_12 = new Class_12();
        $this->class_13 = new Class_13();
    }

}
?>

【问题讨论】:

  • “它会对网站性能产生很大影响吗?” - 这取决于您自己运行指标,然后比较结果。我不能告诉你。由于您关心性能,new 将调用该类的 __construct 方法,因此如果它执行很多操作,就会产生影响,并且由于通常在单个文件中定义一个类,因此自动加载可能会创建磁盘 i /o.请牢记继承(extendsimplementsuse),因为这可能会触发每个类的多个文件的自动加载器。
  • 当然还有其他选择。总是有的。但是,您的问题非常抽象。我们不知道为什么需要初始化 12 个新类。可能它们中的五个是相同的简单类来表示金额。在这种情况下,不会使用很多资源。另一方面,可能有一个类需要外部 API 调用才能工作,它可能会减慢一切并使其不可靠。性能是否受到严重影响取决于这些类的作用,而您还没有告诉我们。
  • 1) product_categories(); 2)产品描述(); (对于不同的语言。像 opencart) 3) class_taxes(); 4) class_stock_statuses(); 5)类长度(); 6)类重量(); 7) class_manufacturers(); 8)类特征(); 9)类选项(); 10) class_recurrings(); 11) class_users_groups(); 12)类_用户(); 13) class_recur_payments();每个类用于管理自己的数据库并处理拉取的数据库。
  • “很多”是多少?你测量了什么?抱歉,但这不是一个可以在不将意见和猜测混合到答案中的情况下回答的问题,这对于 Stack Overflow 来说是一个糟糕的问题。另外,您实际上是在问两个问题。也就是说:考虑按需创建这些额外的对象。

标签: php function performance class web


【解决方案1】:

会不会对网站性能影响很大?

这无法按照您在 Stackoverflow 上的具体要求来回答。尤其是关于“很多”的部分。但是,您可以通过比较在您的环境中运行不同方法的指标来回答这个问题。

是否有替代或更简单的方法?

当然,经常如此。很可能 - 不仅是出于性能原因 - 您会遇到更根本的问题(迟早会影响性能)。

我这么说是因为您的 “构造函数确实工作” 基于它包含带有 new 关键字的代码这一事实。

其结果是将 products 类与其他类名连接(硬编码)(防止更改)每个类的对象创建开销(即在 PHP 中加载和初始化这些对象运行它们的 __construct 方法) - 总是!

尽管您的 产品 可能(现在)依赖于其中一些类(从某种意义上说,它需要这些类的实例才能工作),但它实际上只需要这些实例才能工作(功能)并且只有在实例化这些对象时才需要类名。

因此,一个常见的过程是将对象创建对象使用分开。

这可以通过创建一个不同的函数或方法来完成,该函数或方法创建一个 products 对象,通过参数将所需的实例传递给构造函数。

一个简化的例子是创建函数:

function create_products_out_of_thin_air(): products
{
    return new products(
        new Class_1(),
        new Class_2(),
        new Class_3(),
        new Class_4(),
        new Class_5(),
        new Class_6(),
        new Class_7(),
        new Class_8(),
        new Class_9(),
        new Class_10(),
        new Class_11(),
        new Class_12(),
        new Class_13(),
    );
}

还有类/构造函数:

class products
{
    public function __construct(
        public object $class_1,
        public object $class_2,
        public object $class_3,
        public object $class_4,
        public object $class_5,
        public object $class_6,
        public object $class_7,
        public object $class_8,
        public object $class_9,
        public object $class_10,
        public object $class_11,
        public object $class_12,
        public object $class_13,
    ) {
    }
}

当需要产品时:

$products = create_products_out_of_thin_air();

现在 products 的创建已与其实施分开,这会影响使用,包括。测试为更改提供了空间。

它几乎没有简化(就像你的问题一样,这里使用Constructor Promotion),但应该显示它是如何工作的。

这至少应该使代码更易于维护,从而使您能够在遇到性能瓶颈时处理它们。例如。当您的指标显示创建这些类对性能有很大影响时。

该示例还可能已经表明产品可能已经有太多的依赖关系。如果是这种情况,请考虑仅实例化代码实际依赖的对象。如上所示,将对象构造与使用分开将有助于您解决此问题(比较:延迟加载对象工厂工厂方法依赖注入,以及编写可测试代码)。

关于性能的问题仍然过于依赖具体的实现,无法在这里抽象地回答。

更多参考资料:

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多