【问题标题】:Passing a null DateTime to php function将 null DateTime 传递给 php 函数
【发布时间】:2013-07-31 14:54:10
【问题描述】:

我在 php 中有一个函数,我想接受 DateTime 对象或 null。例如

function foo(DateTime $aDate){
   if ($aDate == null){
       echo "You passed a null variable";
   } else {
       echo "You passed the date " . $aDate->format('Y-m-d');
   }
}

问题是,因为该函数需要一个 DateTime 对象,当我将 null 传递给它时它会翻转并给出错误:

Catchable fatal error: Argument 1 passed to foo() must be an instance of DateTime, null given,...

如何将 null 传递给函数并避免此错误?

【问题讨论】:

    标签: php datetime


    【解决方案1】:

    在类型提示中添加?

        function foo(?DateTime $aDate){
            if ($aDate == null){
                echo "You passed a null variable";
            } else {
                echo "You passed the date " . $aDate->format('Y-m-d');
            }
        }
    

    这种方式只允许显式 NULL 或 DateTime。

    【讨论】:

    • 请注意,这仅适用于 PHP >= 7.1。
    • 刚刚来不及编辑:调用函数的文件必须将declare(strict_types = 1);作为其第一条语句,否则不会被强制执行。
    【解决方案2】:

    从此改变:

    function foo(DateTime $aDate){
    

    到这里:

    function foo($aDate){
    

    但如果您仍想确保传递的对象是 DateTime 对象,您可以这样做:

    function foo(DateTime $aDate = null){
    

    有关类型提示的更多示例,请参阅 here

    【讨论】:

    • 有趣的是它不允许 null 带有类型提示。我的一部分认为应该这样做。
    • 好吧,如果你仍然可以在没有它的情况下传递 DateTime,那么将 DateTime 放入函数的参数列表有什么意义?
    • @JasonMcCreary Ahh 找到了解决方案!
    • 是的,更新更有意义。我想强制传递DateTimenull
    • 这在 PHP 7.1 及更高版本中是可能的,请参阅@pcmoreno 的回答。 IMO,他的答案现在应该被接受了。
    【解决方案3】:

    将 $aDate 设为可选。

    function foo(DateTime $aDate = null) {
        if($aDate) {
            //parse date
        } else {
            //null given
        }
    }
    

    【讨论】:

      【解决方案4】:

      这样做的方法是在函数声明中分配一个默认值:-

      function foo(DateTime $aDate = null){
         if (!$aDate){
             echo "You passed a null variable";
         } else {
             echo "You passed the date " . $aDate->format('Y-m-d');
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-03-07
        • 2015-05-13
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 2013-01-16
        • 1970-01-01
        相关资源
        最近更新 更多