为什么 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
我正在尝试按如下方式扩展 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