扩展类时,属性是否被复制或引用?

时间:2012-02-20 19:50:40

标签: php oop class

当你扩展一个类时,子类通过复制粘贴那些(新变量,相同的值)继承属性,因此消耗更多的内存,或者......引用它们?

希望我已经说清楚了。

3 个答案:

答案 0 :(得分:3)

定义类时,对象及其属性仍然存在。

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

使用$var = new classname();创建对象时,类定义会“生动”,包含类中定义的所有属性和方法及其所有祖先类。但它们都是新对象的一等公民,无论它们是否继承自其他类别的定义。 (编辑:这在内部级别上并不完全正确。请参阅Bob the destroyer的答案。)在此阶段,引用与复制的问题永远不会出现。

答案 1 :(得分:2)

我假设你指的是zvals,而不是common variable referencing。在这种情况下,是的,看起来继承的属性只是一个内部引用,直到您更改扩展对象中的值为止。有关详细信息,请参阅手册: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)
}

答案 2 :(得分:0)

如果它是一个静态属性并初始化它是在加载类时创建的。扩展该类的所有子类也指向此相同的静态属性,并且无论共享静态属性的子类的数量如何,都不会使用其他空间。但是,它们都真正共享相同的属性,因此为一个类更改它并为所有相关类更改它。

对于非静态属性,当您实例化该类的对象时,它会创建自己的一组属性,这些属性会占用自己的内存。

PHP可以使用字符串做一些创造性的事情来保持记忆力,但我不知道那个级别。

相关问题