扩展类时,子级通过复制粘贴属性(新变量、相同值)来继承这些属性,从而消耗更多内存,或者。。。引用它们?
希望我已经说清楚了。
定义类时,对象及其属性还不存在。
当您扩展一个类时,您只需扩展定义,即未来可能对象的蓝图。
当您使用$var = new classname();
创建对象时,类定义会随着类中定义的所有属性和方法及其所有祖先类而"活跃"起来。但他们都是新对象的一等公民,无论他们是否继承自其他阶级定义。(编辑:这在内部层面上并不完全正确。请参阅破坏者Bob的答案。)引用与复制的问题在现阶段从未出现。
我假设您引用的是zval,而不是通用变量引用。在这种情况下,是的,在您更改扩展对象中的值之前,继承的属性似乎只是一个内部引用。有关更多信息,请参阅手册:http://www.php.net/manual/en/features.gc.refcounting-basics.php
示例:
class test
{
public $a = 'asdf';
}
class test2 extends test
{
}
class test3 extends test
{
}
class test4 extends test
{
}
$test2 = new test2;
debug_zval_dump($test2);
$test2->a = 1;
debug_zval_dump($test2);
结果:
object(test2)#1 (1) refcount(2){
["a"]=>
string(4) "asdf" refcount(5)
}
object(test2)#1 (1) refcount(2){
["a"]=>
long(1) refcount(1)
}
如果它是一个静态属性并已初始化,则在加载is类时创建它。所有扩展类的子类也指向相同的静态属性,并且无论共享静态属性的子类的数量如何,都不会使用额外的空间。然而,它们确实共享相同的属性,所以为一个类更改它,并为所有相关的类更改它。
对于非静态属性,当您实例化类的对象时,它会创建自己的一组属性,这些属性会占用它们自己的内存。
PHP可能会用字符串做一些创造性的事情来降低内存,但我不知道这个级别。