首页 > 解决方案 > 为什么 IntlDateFormatter 即使使用明显虚构的语言环境/语言字符串也不返回“false”?

问题描述

资源:

https://www.php.net/manual/en/intldateformatter.create.php

引用:

返回值¶ 在失败的情况下创建的 IntlDateFormatter 或FALSE

代码:

$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
    'America/Los_Angeles',IntlDateFormatter::GREGORIAN  );
var_dump($fmt);

$fmt = new IntlDateFormatter( "madeupfakenonexistent" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
    'America/Los_Angeles',IntlDateFormatter::GREGORIAN  );
var_dump($fmt);

实际输出:

object(IntlDateFormatter)#3 (0) {
}
object(IntlDateFormatter)#2 (0) {
}

预期输出:

object(IntlDateFormatter)#3 (0) {
}
bool(false)

PHP:

7.4.12

结论:

手册在说谎,或者我误解了它。

标签: phpintldateformatter

解决方案


您误解了手册,但它似乎也不正确。

您的第一个错误是 PHP 中的构造函数只能返回指定类型的对象。它可以发出错误信号的唯一方法是抛出异常。然而,该页面还记录了静态方法IntlDateFormatter::create和普通函数datefmt_create,两者都可能返回 false。

您的第二个错误是假设“错误时返回 false”意味着将检测到每个可能的错误并返回 false。在这种特殊情况下,似乎没有验证指定的语言环境是否与任何特定列表中的一个匹配。为其他参数传递意外值视为错误,例如$fmt = new IntlDateFormatter ("en_US", 99999, IntlDateFormatter::FULL, 'America/Los_Angeles', IntlDateFormatter::GREGORIAN);.

您似乎意外正确的地方是这些函数似乎都没有返回false此类错误。对于new IntlDateFormatter,那将触发异常,因为它不能做任何其他事情;forIntlDateFormatter::create并且datefmt_create它会返回null,这是错误参数的标准 PHP 行为,如此处所述

我不是 100% 确定,但是查看相关的源代码,我认为这些函数在任何情况下都不会返回false,因此可能应该更正/更新手册。


推荐阅读