PHP中的对象赋值


Object assignments in PHP

我是一个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

问题:

  1. 当我们说$x->name = "Chandan";它是否创建了一个公共属性?在c++中从未见过这样的赋值

  2. 对$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的指针。如果您希望复制,则必须手动在对象上创建复制/克隆函数。