在PHP中间接访问对象的受保护成员

时间:2012-11-09 11:16:01

标签: php

我对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
)

我在没有setter的情况下修改了受保护的值

我认为我修改了日期值,因为它是由getter方法返回的指针。 我不明白如何在不使用setter方法的情况下修改受保护的值。

你知道为什么吗?

由于

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

再次感谢!

3 个答案:

答案 0 :(得分:2)

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

简而言之:在使用PHP中的对象时,您总是传递对象,并且对于可以看到该对象的每个人都可以看到对它的所有修改。

如果要打破该引用,clone该对象。

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

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