【问题标题】:Trait vs Inhertance - Class-Definition's memory impact? (in PHP)特征与继承 - 类定义内存影响? (在 PHP 中)
【发布时间】:2021-11-04 09:17:07
【问题描述】:

在 PHP 中使用继承时,我很确定;子类不会根据其父类中定义的方法数量占用任何额外的内存。

但请考虑以下:

<?php

trait MyTrait {
    private $myTraitVariable = NULL;

    public function myTraitMethod() {
        // A lot of logic here...
    }
}

class MyClass1 {
    use MyTrait;
}

class MyClass2 {
    use MyTrait;
}

class MyClass3 {
    use MyTrait;
}

$instance1 = new MyClass1();
$instance2 = new MyClass2();
$instance3 = new MyClass3();
// ...

$instance1->myTraitMethod();
// ...

与继承相比,现在使用 PHP 的 Trait 功能会导致 myTraitMethod 的逻辑占用 3 倍的内存吗?
(或者还有其他区别吗?)

【问题讨论】:

  • 不确定你在问什么,即使你把那个方法放在你的基类中并让你的 myclass1,2,3 扩展它,它仍然会在内存中被调用 3 次。跨度>
  • 前一阵子树this post 说,在多个类中使用一个特征时会有一些效率。

标签: php inheritance traits


【解决方案1】:

实例的内存使用情况

$instance1$instance2$instance3 的内存占用无论是在各自的类定义中使用继承还是使用特征,都将基本相同。这是因为他们需要创建他们定义的对象的实例以及通过父母继承或通过特征“继承”的对象。

类定义的内存使用

但这与 MyClass1MyClass2MyClass3 定义本身的内存占用不同。

当一个 trait 用在一个类中时,它就像一个“mixin”一样使用。类不扩展特征,但特征被注入到类定义中。这可以通过考虑静态特征属性在每个使用该特征的类上获得单独的副本而不是对所有类具有与继承相同的值来确认。可能需要进行优化,但同样,这真的不是重点。

从这个意义上说,使用特征的定义的内存占用比继承定义的内存占用要多。

但是最后一点没有实际意义。声明的内存通常非常低,除非您有大量可笑的类声明,但如果您这样做,那么这本身就表明您需要开始考虑将项目分成更小的部分。运行代码时占用最多内存的是对象实例,在这种情况下,使用特征或继承并不重要,重要的是对象中的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多