Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 扩展类时,是否复制或引用属性?_Php_Oop_Class - Fatal编程技术网

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也是对的!我被纠正了。