为什么 php 扩展 class 属性没有更新

why are php extended class properties not updated

我正在尝试按如下方式扩展 DateTime:

class testdate extends DateTime {
public $sqldate;

public function __construct($time)
{
    parent::__construct($time);
    //?? parent::modify();

    $this->sqldate = $this->format ("Y-m-d"); 
}

}
echo "<pre>";

$td = new testdate("2020-08-23");
echo "       Today's Date: ".$td->format ("m/d/Y").br;
echo "   Today's SQL Date: ".$td->sqldate.br.br;
$td->modify ("+24 hour");
echo "    Tomorrow;s Date: ".$td->format ("m/d/Y").br;    // 1 day added correctly
echo " Tomorrow Formatted: ".$td->format ("Y-m-d").br;
echo "  Tomorrow Sql Date: ".$td->sqldate.br.br;          //not updated
print_r ($td);

正如您在 print_r 语句中所见,日期已更新但 sqldate 未更新。

我必须做什么才能确保扩展 class 的属性得到更新?

正如已经评论过的那样,实际问题是您只设置了在构造函数中定义的 sqldate 属性,因此在实例化对象时只设置一次。您无处实施了对 属性.

的更新

可以进一步扩展派生的 class,以便 sqldate 属性 每次修改都会更新,但这很麻烦且容易出错。原因是 属性 保留了需要同步的冗余信息。

对于这种情况,使用格式化方法而不是同步属性要优雅得多:

<?php
define("br", "\n");

class testdate extends DateTime {
  public function getSqlDate() {
    return $this->format("Y.m.d");
  }
}

$td = new testdate("2020-08-23");
echo "       Today's Date: ".$td->format ("m/d/Y").br;
echo "   Today's SQL Date: ".$td->getSqlDate().br.br;
$td->modify ("+24 hour");
echo "    Tomorrow's Date: ".$td->format ("m/d/Y").br;
echo " Tomorrow Formatted: ".$td->format ("Y-m-d").br;
echo "  Tomorrow Sql Date: ".$td->getSqlDate().br.br;

明显的输出是:

       Today's Date: 08/23/2020
   Today's SQL Date: 2020.08.23

    Tomorrow's Date: 08/24/2020
 Tomorrow Formatted: 2020-08-24
  Tomorrow Sql Date: 2020.08.24