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 方法作为指针返回的。我不明白如何在不使用 setter 方法的情况下修改受保护的值。

你知道为什么吗?

谢谢

编辑:好的,正如我解释的那样,我的 A 类的成员是 DateTime 对象。如果我希望它真正受到保护,也许我必须创建一个“时间戳”成员并返回我的时间戳的新 DateTime(或克隆成员)。

再次感谢 !

4

3 回答 3

2

对象总是通过引用传递。更准确地说,只有一个对象,而一个变量只是保存对该对象的引用。通过将变量值分配给另一个变量,您可以复制该值,但该值只是对该对象的引用。

简而言之:在 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 回答
0

$date = $a->getStartDate();您一起创建一个新变量。随着$date->add($day);您更改新变量的值,而不是原点。

于 2017-09-30T10:26:29.073 回答