PHP 8.3 发布,包含类型化类常量、json_validate 函数等新特性
发布时间 作者 Paul Redmond
PHP 团队今天发布了 PHP 8.3,其中包含类型化类常量、json_validate() 函数、动态获取类常量、#[Override]
属性等等。
- 类型化类常量
- json_validate() 函数
- 动态类常量获取
- 标记重写方法
- mb_str_pad() 函数
- INI ENV 变量的回退值语法
- 支持一次性对多个文件进行 lint
- 更合适的日期/时间异常
- 只读属性的深度克隆
- 随机数生成器新增功能
- 等等...
类型化类常量
在 PHP 8.2 中,仍然无法声明常量 (const
) 类型,这会导致混淆或对正在使用的类型的含义产生误解。
interface I { const TEST = "Test"; // We may naively assume that the TEST constant is always a string} class Foo implements I { const TEST = []; // But it may be an array...} class Bar extends Foo { const TEST = null; // Or null}
以下是如何在 PHP 8.3 中使用类型化常量的示例。
interface I { const string TEST = E::TEST; // I::TEST is a string as well} class Foo implements I { use T; const string TEST = E::TEST; // Foo::TEST must also be a string} class Bar extends Foo { const string TEST = "Test2"; // Bar::TEST must also be a string, but the value can change} // Error example // Fatal error: Cannot use array as value for class constant// Foo::PHP of type stringclass Buzz implements I { const string PHP = [];}
json_validate() 函数
要在 PHP 中验证 JSON,你需要配置 JSON_THROW_ON_ERROR
标志,使用 json_last_error
,或者甚至只是检查 json_decode()
调用中的 null
。
json_decode(json: '{"foo": "bar}', flags: JSON_THROW_ON_ERROR); // JsonException Control character error, possibly incorrectly encoded.
从 PHP 8.3 开始,你也可以使用 json_validate()
函数来验证 JSON。
// Validjson_validate('{"framework": "Laravel"}'); // true // Invalidjson_validate('{"framework": "Laravel}'); // false json_last_error_msg(); // Control character error, possibly incorrectly encodedjson_last_error(); // 3
动态类常量获取
在 PHP >= 8.2 中,只能使用 constant()
函数来动态获取类常量的值。以下将导致语法错误。
class Framework { const NAME = 'Laravel';} $name = 'NAME'; // You could achieve this with the constant() functionconstant(Framework::class . '::' . $name); // Laravel // This following is a syntax error in >=v8.2.0echo Framework::{$name};// ParseError syntax error, unexpected token ";", expecting "(".
从 PHP 8.3 开始,你现在可以从类中动态访问常量。
class Framework { const NAME = 'Laravel';} $name = 'NAME'; // Syntax error in <= v8.2.0echo Framework::{$name}; // Laravel
INI 文件中环境变量的回退值
PHP 8.3 中我最喜欢的功能之一是使用环境变量定义 INI 设置时提供默认值。这将简化 Docker 默认值,而无需在 Dockerfile
中将默认值指定为 ENV
块。我相信还有许多其他用例将因其而简化。
例如,假设你想使用 DRUPAL_FPM_PORT
ENV 值来配置 www
FPM 池的 INI 值。
error_log = syslogdaemonize = false [www]listen = localhost:${DRUPAL_FPM_PORT}
必须定义 DRUPAL_FPM_PORT
,并且没有默认值!现在,你可以执行以下操作,这在 bash/shell 脚本中应该很熟悉。
[www]listen = localhost:${DRUPAL_FPM_PORT:-9000}
想象一下,将一个 xdebug.ini
文件作为你 Dockerfile 的一部分提供,用于开发,并带有明智的默认值,但允许开发人员重写他们认为合适的任何值。
随机数生成器新增功能
PHP 8.3 包含 随机数生成器新增功能,包括一个新的 getBytesFromString()
方法,该方法可以方便地从源字符串中获取随机字节。
$randomizer = new \Random\Randomizer(); printf( "%s.example.com", $randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz0123456789', 16)); // 3zsw04eiubcf82jd.example.com // Generate a random code for multi-factor authentication$randomizer = new \Random\Randomizer(new \Random\Engine\Secure()); echo implode('-', str_split($randomizer->getBytesFromString('0123456789', 20), 5)); // 11551-80418-27047-42075
了解更多
要快速了解这些新功能,请查看 PHP 8.3.0 发布公告 页面,了解 PHP 8.3 前后的示例。务必查看弃用和向后兼容性中断。