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

If you want to create a dynamic object:

$obj = new STDClass(); //Just a simple container, pretty much like array
$obj->anyStuff = "string" ; //Declare some public variables outside the class.

Otherwise you have to declare variables in your class explicitly.

Also, objects are always passed by reference (or assigned), because $obj in fact is not an object, it is just a reference, a link to it. The object itself is contained in memory.

$another = $obj ; Will just create another reference to the same object.

To clone object you must use: $clone = clone $obj ;

Also you can define a magic method __clone() that may be executed when cloning an object.

More info 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クラスの新しいインスタンスを作成します。その$x->nameため、クラスではなく、このインスタンスにのみ割り当てられました。これはプロパティですが、インスタンスpublic内にのみ存在します。$x


$x->name への変更は $y オブジェクトにも反映されます..なぜですか? $y = $x は $x のコピーを作成する必要があります。

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

最初の行yでは、を拡張するクラスを宣言しましたx。クラスyは からすべてを取得しましたが、 s のプライベート メンバーxにはまだアクセスできません。このプロパティはクラス内ではなくインスタンス内に存在するため、x継承されていません。$x->name$xx

$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 に答える