如何检查变量类型是否为DateTime

18

请问在PHP中如何检查一个变量是否是datetime类型?我尝试了以下代码,但好像不起作用。

public function setRegistrationDate ($registrationDate) {

   if (!is_date($registrationDate, "dd/mm/yyyy hh:mm:ss")) {
       trigger_error('registrationDate != DateTime', E_USER_WARNING);
       return;
   }

   $this->_registrationDate = $registrationDate;
}
4个回答

59

我认为这种方式更加简单:

if (is_a($myVar, 'DateTime')) ...

如果$myVar是一个PHP的DateTime对象,那么这个表达式为真。

自PHP 5起,这可以进一步简化为:

if ($myVar instanceof DateTime) ...

4
这应该是正确的答案。由于其他答案过时了,它们的方法已经过时了。这是在PHP中验证类类型的正确方法。另外,需要注意的是,在这种情况下应使用单引号,因为双引号会导致不必要的变量内插步骤。 - Ryan Rentfro
你是对的。我只是把表达式从双引号改成了单引号。谢谢 Ryan。 - Hokusai
我认为原问题是如何确定给定的字符串是否与特定格式匹配,而不是特定PHP变量是否是特定类的实例。至于单引号和双引号之间的区别,差异微不足道,并且担心这些事情只是微观优化。如果你的代码慢,那并不是因为你使用了双引号。 https://nikic.github.io/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html - GordonM
问题中的代码实际上是在第3行尝试验证类型。至于微观优化,那并不是重点。它关乎使用正确的字符串封闭符号。这虽然微不足道,但却是一种惯例。这不是关于速度慢与否,而是关于正确的实践。请参见https://en.wikipedia.org/wiki/Coding_conventions。 - Ryan Rentfro
+1 Ryan。使用正确的引号是有意义的,唯一不这样做的原因是懒惰(尽管公平地说,PHP文档本身通常使用错误的引号)。此外,虽然这是一个“微”优化,但在大型代码库中会被无数次乘以。它不会决定成败,但不这样做是没有逻辑的。 - Ian
到目前为止,这是我看过的最好的简单答案。 - Budianto IP

10

1分钟来验证一下,当我们进行面向对象的PHP编程时,将所有业务类都合并到一个文件中是否是一个好的实践方法? - rzqr

6
最简单的回答是:使用strtotime()函数来检查
$date = strtotime($datevariable);

如果是有效日期,它将返回时间戳,否则返回FALSE

谢谢您的回复,还有一个问题,请问在面向对象的PHP编程中,将所有业务类重新分组到一个文件中是否是一个好的实践方法? - rzqr
1
理想情况下,我们应该将一个类放在一个文件中。 - Nishu Tayal
1
不,我没有得到false,我得到了一个错误:警告:strtotime()期望参数1为字符串,但给出的是对象。 - peace_love

2
我会使用以下方法:

public function setRegistrationDate ($registrationDate) {
  if(!($registrationDate instanceof DateTime)) {
    $registrationDate = date_create_from_format("dd/mm/yyyy hh:mm:ss", $registrationDate)
  }

  if(!($registrationDate instanceof DateTime)) {
    trigger_error('registrationDate is not a valid date', E_USER_WARNING);
    return false;
  }

  $this->_registrationDate = $registrationDate;
  return true
}

谢谢您的回复,还有一个问题,请问在面向对象的PHP编程中,将所有的业务类都放在一个文件中重新组织是否是一个好的实践呢? - rzqr
1
我通常倾向于将一个类放在一个文件中,遵循这个约定(https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md)以获得更好的自动加载。 - Matteo Tassinari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接