特质与继承 - Class-定义内存影响? (在 PHP 中)

Trait vs Inhertance - Class-Definition's memory impact? (in PHP)

在 PHP 中使用继承时,我很确定;子 class 不会根据其父 class.

中定义的方法数量占用任何额外内存

但考虑以下:

<?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-feature 是否会导致 myTraitMethod 的逻辑与继承相比占用 3 倍的内存?
(或者还有其他区别吗?)

实例的内存使用

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

Class-definition的内存使用

然而,这与 MyClass1MyClass2MyClass3 定义本身的内存占用不同。

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

从这个意义上说,使用特征的定义的内存占用量大于继承定义的内存占用量。

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