特质与继承 - 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的内存使用
然而,这与 MyClass1
、MyClass2
和 MyClass3
定义本身的内存占用不同。
当在 class 中使用特征时,它就像“混合”一样使用。 class 不扩展特征,但特征被注入到 class 定义中。这可以通过考虑静态特征属性在每个使用特征的 class 上获得单独的副本而不是像继承那样对所有 class 具有相同的值来确认。可能需要进行优化,但同样,这真的不是重点。
从这个意义上说,使用特征的定义的内存占用量大于继承定义的内存占用量。
但是最后一点没有实际意义。声明的内存通常非常低,除非你有大量的 class 声明,但如果你这样做,那么这本身就表明你需要开始考虑将你的项目分成更小的部分。当 运行 代码是 object 实例时,占用最多内存的是什么,在这种情况下,使用特征或继承并不重要,重要的是 object 中的数据。
在 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的内存使用
然而,这与 MyClass1
、MyClass2
和 MyClass3
定义本身的内存占用不同。
当在 class 中使用特征时,它就像“混合”一样使用。 class 不扩展特征,但特征被注入到 class 定义中。这可以通过考虑静态特征属性在每个使用特征的 class 上获得单独的副本而不是像继承那样对所有 class 具有相同的值来确认。可能需要进行优化,但同样,这真的不是重点。
从这个意义上说,使用特征的定义的内存占用量大于继承定义的内存占用量。
但是最后一点没有实际意义。声明的内存通常非常低,除非你有大量的 class 声明,但如果你这样做,那么这本身就表明你需要开始考虑将你的项目分成更小的部分。当 运行 代码是 object 实例时,占用最多内存的是什么,在这种情况下,使用特征或继承并不重要,重要的是 object 中的数据。