php 为什么IntlDateFormatter不返回“false”,即使是明显虚构的区域设置/语言字符串?

tzdcorbm  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(95)

来源:

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

结论:

手册在撒谎或者是我误解了。

hc2pp10m

hc2pp10m1#

您误解了手册,但它似乎也不正确。
第一个错误是PHP中的构造函数 * 不能 * 返回指定类型的对象以外的任何东西。它发出错误信号的唯一方法是抛出异常。然而,该页面还记录了静态方法IntlDateFormatter::create和普通函数datefmt_create,两者都可能返回false。
你的第二个错误是假设“在出错时返回false”意味着每一个可能的错误都将被检测到并返回false。在这个特定的例子中,似乎没有验证指定的区域设置是否与任何特定列表中的区域设置相匹配。为其他参数传递非预期值 * 被 * 视为错误,例如$fmt = new IntlDateFormatter ("en_US", 99999, IntlDateFormatter::FULL, 'America/Los_Angeles', IntlDateFormatter::GREGORIAN);
您似乎偶然正确的地方是,这些函数都没有返回false。对于new IntlDateFormatter,这将触发一个异常,因为它不能做任何其他事情;对于IntlDateFormatter::createdatefmt_create,它将返回null,这是错误参数as noted here的标准PHP行为。
我不是100%确定,但是看看the relevant source code,我不认为有任何情况下这些函数返回false,所以手册可能需要更正/更新。

y1aodyip

y1aodyip2#

这个问题已经在PHP中解决了。请参见Issue #12282

相关问题