3

PHPのポインタについて質問があります。

Aクラスで私は持っています:

protected $startDate;
public function getStartDate()
{
    return $this->startDate;
}
public function setStartDate($startDate)
{
    $this->startDate = $startDate;
}

私はこのように私のコードでそれを使用します:

$day = new \DateInterval('P1D');
$a->startDate->add($day);

結果:「保護されたプロパティにアクセスできません」(予想どおり)


私が試してみると:

$day = new \DateInterval('P1D');

print_r($a->getStartDate());

$date = $a->getStartDate();
$date->add($day);

print_r($a->getStartDate());
die();

結果 :

DateTime Object
(
    [date] => 2012-11-08 00:00:00
    [timezone_type] => 3
    [timezone] => Europe/Paris
)

DateTime Object
(
    [date] => 2012-11-09 00:00:00
    [timezone_type] => 3
    [timezone] => Europe/Paris
)

セッターなしで保護された値を変更しました

getterメソッドでポインタとして返されたので、日付の値を変更したと思います。セッターメソッドを使用せずに保護された値を変更する方法がわかりません。

なぜなのかご存知ですか?

ありがとう

編集:わかりました。説明したように、私のAクラスのメンバーはDateTimeオブジェクトです。本当に保護したい場合は、「タイムスタンプ」メンバーを作成して、タイムスタンプの新しいDateTimeを返す(またはメンバーのクローンを作成する)必要があります。

再度、感謝します !

4

3 に答える 3

2

オブジェクトは常に参照によって渡されます。より正確には、オブジェクトは 1 つだけで、変数はオブジェクトへの参照を保持するだけです。変数値を別の変数に代入することにより、値をコピーしますが、その値はオブジェクトへの参照に過ぎません。

要するに、PHP でオブジェクトを操作するときは、常にオブジェクトを渡しているため、オブジェクトに対するすべての変更は、オブジェクトを見ることができるすべての人に表示されます。

その参照を壊したい場合はclone、オブジェクト.

于 2012-11-09T11:20:48.787 に答える
0

これを試して:

protected $startDate;
public function getStartDate()
{
    return clone $this->startDate;
}
public function setStartDate($startDate)
{
    $this->startDate = $startDate;
}
于 2012-11-09T11:23:38.233 に答える