在 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();
// ...
myTraitMethod與繼承相比,現在使用 PHP 的 Trait 功能會導致的邏輯占用 3 倍的記憶體嗎?
(或者那里有什么其他區別?)
uj5u.com熱心網友回復:
實體的記憶體使用情況
無論是在各自的類定義中使用繼承還是使用特征,$instance1,$instance2和的記憶體占用$instance3都將基本相同。這是因為他們需要創建他們定義的物件的實體以及通過父母繼承或通過特征“繼承”的物件。
類定義的記憶體使用
然而,這與MyClass1,MyClass2和MyClass3定義本身的記憶體占用不同。
當在類中使用特征時,它就像“mixin”一樣使用。類不擴展特征,但特征被注入到類定義中。這可以通過考慮靜態特征屬性在每個使用特征的類上獲得單獨的副本而不是像繼承那樣對所有類具有相同的值來確認。可能會進行優化,但同樣,這真的不是重點。
從這個意義上說,使用特征的定義的記憶體占用比繼承定義的記憶體占用更多??。
然而最后一點是沒有實際意義的。宣告的記憶體通常非常低,除非你有大量的類宣告,但如果你這樣做了,那么這本身就表明你需要開始考慮將專案分成更小的部分。運行代碼時占用最多記憶體的是物件實體,在這種情況下,使用特征還是繼承并不重要,重要的是物件中的資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348207.html
