0

オブジェクトのプロパティ(文字列や整数などのスカラーデータを保持するクラスメンバー変数)への参照を別のクラスのオブジェクト内に格納することは可能ですか?

次の2つのechoステートメントで同じ結果が得られるようにしようとしています。

<?php

$x = new Type;
$x->name = 'abcd';

echo "x.name=" . $x->name . '<br/>';
echo "x.obj.name=" . $x->obj->value . '<br/>';

class Type
{
    public $obj; //Instance of Property (Property class defined below)
    public $name;

    function __construct()
    {
        $this->obj = new Property($this->name);
    }
}

class Property
{
    public $value;

    function __construct($v)
    {
        $this->value = $v;
    }
}
4

3 に答える 3

1

$this->obj = new Property($this->name);

オブジェクトの作成時に呼び出されます。これは、割り当ての前に実行されます。つまり、 $x = new Type; を呼び出すとき。コンストラクターが呼び出され、それまでに空の 'name' をコピーしようとしました

値を渡すのではなく、$this を渡して参照を保持することで、次のようにすることができます。

<?php


class Type
{
    public $obj; //Instance of Property (Property class defined below)
    public $name;

    function __construct()
    {
        $this->obj = new Property($this);
    }
}

class Property
{
    public $value;

    function __construct($ref)
    {
        $this->value = $ref;
    }
}


$x = new Type;
$x->name = 'abcd';

echo "x.name=" . $x->name . '<br/>';
echo "x.obj.name=" . $x->obj->value->name . '<br/>';
于 2012-10-21T00:10:30.280 に答える
0

nameコンストラクター内で値を渡すことができます。

$x = new Type('abcd');

そうしないと、コンストラクターはまだ何であるかを知り$this->nameません。したがって、コンストラクターで使用し、使用する前にclassesプロパティを設定します。

function __construct($p_name){
  $this->name = $p_name;
  $this->obj = new Property($this->name);
}

コンストラクターを呼び出した後で同じように簡単に値を設定し、後で参照を初期化することができます-

class Type {
  public $obj;
  public $name;

  function setProperty(){
    $this->obj = new Property($this->name);
  }
}

$x = new Type;
$x->name = 'abcd';
$x->setProperty();

echo "x.name=" . $x->name;
echo "x.obj.name=" . $x->obj->value;
于 2012-10-21T00:10:24.277 に答える