我是一个PHP学习者。下面的PHP OOP代码请帮助我:
class x{}
$x = new x;
$x->name = "Chandan";
class y extends x {} // Inheritance
$y = new y;
var_dump($x); // object X; Shows Name property
var_dump($y); // object y; Empty
$y = $x;
var_dump($x); // object X; name = chandan
var_dump($y); // object X; name = chandan
$x->name = "Debasis";
var_dump($x); // object X; name = debasis
var_dump($y); // object X; name = debasis
问题:
当我们说$x->name = "Chandan";它是否创建了一个公共属性?在c++中从未见过这样的赋值
对$x->name的更改也反映在$y对象中。为什么?$y = $x应该创建$x的副本
如果你想创建一个动态对象:
$obj = new STDClass(); //Just a simple container, pretty much like array
$obj->anyStuff = "string" ; //Declare some public variables outside the class.
否则你必须在你的类中显式声明变量。
同样,对象总是通过引用(或赋值)传递,因为$obj
实际上不是一个对象,它只是一个引用,一个指向它的链接。对象本身包含在内存中。
$another = $obj ;
将创建另一个对同一对象的引用。
克隆对象必须使用:$clone = clone $obj
;
还可以定义一个魔术方法__clone()
,该方法可以在克隆对象时执行。
更多信息http://php.net/manual/en/language.oop5.cloning.php
当我们输入$x->name = "Chandan";它是否创建了一个公共属性?在c++中从未见过这样的赋值。
当你执行:
$x = new x;
$x->name = "Chandan";
创建x
类的新实例。所以,$x->name
只分配给这个实例,而不是一个类。这是一个public
属性,但只存在于$x
实例中。
对$x->name的更改也反映在$y对象中。为什么?y = x应该创建一个$x的副本。
class y extends x {} // Inheritance
$y = new y;
在第一行中声明了y
类,它扩展了x
。类y
继承了x
的所有内容,但仍然不能访问x
的私有成员。它没有继承$x->name
,因为这个属性存在于$x
实例中,而不存在于x
类中。
$y = $x;
$y
参考$x
。它不存储$x
的克隆,但引用一个地方,它存储。这就是$y
受此影响的原因:
$x->name = "Debasis";
var_dump($x); // object X; name = debasis
var_dump($y); // object X; name = debasis
PHP中的对象总是隐式地通过引用传递。如果需要克隆,则需要使用clone
关键字显式地创建它:
$y = clone $x;
一些有用的链接:
- PHP OOP PHP对象克隆PHP引用
如果对象定义使您感到困惑,您可以采用不同的方法。我通常像在其他语言中那样构造对象,唯一的区别是你不需要定义类型:
class MyClass {
// Can use private variables
private $m_PrivateVar;
// Can use protected variables
protected $m_ProtectedVar;
// Can use public variables
public $m_PublicVar
function __construct()
{
// Constructor
}
//etc
}
作为对问题2的回应:对象总是通过引用传递,所以当将它们传递给函数时,您不是为该函数创建副本,它是相同的对象(就像传递指针给标准变量一样)。赋值也是如此,在执行$y = $x
之后,你的新对象$y实际上不再是一个新对象,它现在是一个指向$x的指针。如果您希望复制,则必须手动在对象上创建复制/克隆函数。