当扩展类时,属性会被复制或引用


When extending class, properties gets copied or referenced?

扩展类时,子级通过复制粘贴属性(新变量、相同值)来继承这些属性,从而消耗更多内存,或者。。。引用它们?

希望我已经说清楚了。

定义类时,对象及其属性还不存在。

当您扩展一个类时,您只需扩展定义,即未来可能对象的蓝图。

当您使用$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可能会用字符串做一些创造性的事情来降低内存,但我不知道这个级别。