【问题标题】:Class extending DateTime calls to parent constructor and gets NULL类将 DateTime 调用扩展到父构造函数并获取 NULL
【发布时间】:2021-01-30 20:20:57
【问题描述】:

我正在尝试创建一个扩展 DateTime 的类,实现调用父级的构造函数。 这总是返回 NULL 而不是对象的实例。这种行为的原因是什么?

class TimeHandler extends DateTime{
        
       public function __construct(){
            $somevar = parent::__construct();
            echo gettype($somevar); //This always outputs NULL instead of object
        } 

}

$instanTH = new TimeHandler();

【问题讨论】:

  • 构造函数通常不返回值,它适用于当前对象。
  • 这能回答你的问题吗? Purpose of PHP constructors
  • 我想我对术语 NigelRen 有点困惑。我在 PHP.net 中读到 PDO::__construct 在成功时返回一个 PDO 对象(这使得类似于上面代码的内容适用于 PDO),同时它为 DateTime::__construct 声明以下内容:返回一个新的 DateTime 实例。我想当然地认为 DateTime 实例与对象相同。
  • 您可以认为new 关键字返回的是实例,而不是构造函数本身,它只是初始化状态。你可以调用new parent获取实例,但是TimeHandler不会被初始化。

标签: php datetime extends


【解决方案1】:

如果您不想在 parent::__construct() 中执行任何操作,则不需要在类扩展中使用构造函数。

class TimeHandler extends DateTime{}       

$instanceTH = new TimeHandler('today UTC');

var_dump($instanceTH);
//object(TimeHandler)#2 (3) { ["date"]=> string(26) "2020-10-16 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }

如果扩展包含一个构造函数,那么一个父 :: __ 构造也必须在这个构造中执行,以便正确初始化扩展对象。

class TimeHandler extends DateTime{
  
  public function __construct($dt = null, $timeZone = null){

    parent::__construct($dt, $timeZone);

  }
  
}       

可以在 here 找到一个 DateTime 扩展的示例。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2014-05-29
    • 2011-07-28
    • 2014-04-18
    • 1970-01-01
    • 2013-11-15
    • 2018-09-26
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多