Php 扩展类时,是否复制或引用属性?
扩展类时,子类通过复制粘贴这些属性(新变量、相同值)来继承属性,因此会消耗更多内存,或者。。。参考他们Php 扩展类时,是否复制或引用属性?,php,oop,class,Php,Oop,Class,扩展类时,子类通过复制粘贴这些属性(新变量、相同值)来继承属性,因此会消耗更多内存,或者。。。参考他们 希望我已经讲清楚了。定义类时,对象及其属性还不存在 扩展类时,只需扩展定义,即未来可能对象的蓝图 使用$var=new classname()创建对象时,类定义与类中定义的所有属性和方法以及它的所有祖先类一起“激活”。但他们都是新对象的一等公民,不管他们是否继承自其他类定义。(编辑:这在内部层面上并不完全正确。请参阅的答案。)在这个阶段,引用与复制的问题从未出现过 定义类时,对象及其属性还不存
希望我已经讲清楚了。定义类时,对象及其属性还不存在 扩展类时,只需扩展定义,即未来可能对象的蓝图
使用
$var=new classname()创建对象时代码>,类定义与类中定义的所有属性和方法以及它的所有祖先类一起“激活”。但他们都是新对象的一等公民,不管他们是否继承自其他类定义。(编辑:这在内部层面上并不完全正确。请参阅的答案。)在这个阶段,引用与复制的问题从未出现过 定义类时,对象及其属性还不存在
扩展类时,只需扩展定义,即未来可能对象的蓝图
使用$var=new classname()创建对象时代码>,类定义与类中定义的所有属性和方法以及它的所有祖先类一起“激活”。但他们都是新对象的一等公民,不管他们是否继承自其他类定义。(编辑:这在内部层面上并不完全正确。请参阅的答案。)在这个阶段,引用与复制的问题从未出现过 我假设你指的是zvals,而不是。在这种情况下,是的,在您更改扩展对象中的值之前,继承的属性似乎只是一个内部引用。有关更多信息,请参阅手册:
一个例子:
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)
}
结果:
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)
}
我假设你指的是zvals,而不是。在这种情况下,是的,在您更改扩展对象中的值之前,继承的属性似乎只是一个内部引用。有关更多信息,请参阅手册:
一个例子:
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)
}
结果:
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可能会用字符串做一些创造性的事情来降低内存,但我不知道这个级别。如果它是静态属性并初始化,那么它是在加载is类时创建的。扩展该类的所有子类也指向该静态属性,并且无论共享该静态属性的子类的数量如何,都不会使用额外的空间。但是,它们实际上共享同一个属性,所以为一个类更改它,为所有相关类更改它
对于非静态属性,当您实例化类的对象时,它会创建自己的属性集,这些属性会占用它们自己的内存
PHP可能会用字符串做一些创造性的事情来降低内存,但我不知道那个级别。你说的是克隆对象吗?不是真的,更像-扩展类,实例化扩展类。变量现在会发生什么?对象会使用所有属性初始化,包括祖先类中定义的属性和扩展类中定义的属性。他们之间没有区别,他们都是新生的,纽约的一等公民object@Tom:我相信这就是你所指的:。使用debug\u zval\u dump()
,它确实表明使用了内部引用,而不是创建或复制了新的zval。您是在谈论克隆对象吗?不是真的,更像是-扩展类,实例化扩展类。变量现在会发生什么?对象会使用所有属性初始化,包括祖先类中定义的属性和扩展类中定义的属性。他们之间没有区别,他们都是新生的,纽约的一等公民object@Tom:我相信这就是你所指的:。使用debug\u zval\u dump()
,它确实表明使用了内部引用,而不是创建或复制了新的zval。非常有趣。这意味着@Martin也是对的!我被纠正了。很有趣。这意味着@Martin也是对的!我被纠正了。