3

我是一名 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 的副本。

4

3 回答 3

3

如果要创建动态对象:

$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

于 2013-04-24T08:29:53.623 回答
1

当我们说 $x->name = "Chandan"; 它会创建公共属性吗?在 C++ 中从未见过这样的分配。

当你执行:

$x = new x; 
$x->name = "Chandan";

它创建x类的新实例。所以,then$x->name只分配给这个实例,而不是一个类。它是一个public属性,但仅存在于$x实例中。


对 $x->name 的更改也反映在 $y 对象中。为什么?$y = $x 应该创建一个 $x 的副本。

class y extends x {}  // Inheritance
$y = new y;

在第一行中,您声明y了扩展类x。类y从 中拿走了所有东西x,但仍然无法访问xs 的私人成员。它没有继承$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;

一些有用的链接:

于 2013-04-24T08:49:41.950 回答
0

如果对象定义让您感到困惑,您可以采取不同的做法。我通常像在其他语言中那样构造对象,唯一的区别是您不必定义类型:

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 实际上不再是一个新对象$y = $x,它现在是一个指向 $x 的指针。如果您想制作副本,则必须在对象上手动创建复制/克隆功能。

于 2013-04-24T08:33:24.167 回答