PHP8.3更新內容新特性及支持版本探究
支持版本
除了慶祝新的版本發(fā)布以后,也需要注意一下:PHP 8.0 的生命周期即將結束,PHP 8.0 早已在2022 年 11 月 26 日結束了積極支持,而安全支持也將在 PHP8.3 發(fā)布的三天后2023 年 11 月 26 日停止。
了解更多信息可查看Supported Versions。
新特性
PHP 8.3 引入了許多新功能。然而,它的功能比 PHP 8.1 或 PHP 8.2 相對較少。
PHP 8.3 的主要新特性:
- 類型化類常量
- 動態(tài)類常量獲取
#[\Override]屬性- 只讀修改
- 添加
json_validate函數 - 添加
Randomizer::getBytesFromString()方法 - 添加
Randomizer::getFloat()和Randomizer::nextFloat()方法
類型化類常量
現(xiàn)在可以在定義常量時,增加類型。
// PHP < 8.3
interface I {
// We may naively assume that the PHP constant is always a string
const PHP = 'PHP 8.2';
}
class Foo implements I {
const PHP = []; // But it may be an array...
}
// PHP 8.3
interface I {
const string PHP = 'PHP 8.3';
}
class Foo implements I {
const string PHP = [];
}
// Fatal error: Cannot use array as value for class constant Foo::PHP of type string動態(tài)類常量獲取
在之前的版本中獲取類的常量,除了直接調用以外,想要動態(tài)獲取只能通過拼接后使用constant來實現(xiàn),而現(xiàn)在可以直接使用變量來獲取常量。
這個方式在枚舉類型中也可以使用。
// PHP < 8.3
class Foo {
const PHP = 'PHP 8.2';
}
$searchableConstant = 'PHP';
var_dump(constant(Foo::class . "::{$searchableConstant}"));
// PHP 8.3
class Foo {
const PHP = 'PHP 8.3';
}
$searchableConstant = 'PHP';
var_dump(Foo::{$searchableConstant});添加#[\Override]屬性
通過給方法添加 #[\Override] 屬性,PHP 將確保在父類或實現(xiàn)的接口中存在同名的方法。
添加該屬性可以清楚地表明重載父類方法是有意為之,并簡化了重構過程,因為重載父類方法的刪除會被檢測到。
// PHP < 8.3
use PHPUnit\Framework\TestCase;
final class MyTest extends TestCase
{
protected $logFile;
protected function setUp(): void
{
$this->logFile = fopen('/tmp/logfile', 'w');
}
protected function taerDown(): void
{
fclose($this->logFile);
unlink('/tmp/logfile');
}
}
// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).
// PHP 8.3
use PHPUnit\Framework\TestCase;
final class MyTest extends TestCase
{
protected $logFile;
protected function setUp(): void
{
$this->logFile = fopen('/tmp/logfile', 'w');
}
#[\Override]
protected function taerDown(): void
{
fclose($this->logFile);
unlink('/tmp/logfile');
}
}
// Fatal error: MyTest::taerDown() has #[\Override] attribute,
// but no matching parent method exists只讀修改
只讀屬性現(xiàn)在可以在魔術方法 __clone 方法中修改一次,以實現(xiàn)只讀屬性的深度克隆。
// PHP < 8.3
readonly class Foo {
public \DateTime $dateTime;
function __construct(\DateTime $dateTime) {
$this->dateTime = $dateTime;
}
public function __clone()
{
$this->dateTime = clone $this->dateTime;
}
}
$today = new Foo(new \DateTime());
$tomorrow = clone $today;
// Fatal error: Cannot modify readonly property Foo::$dateTime
// PHP 8.3
readonly class Foo {
public \DateTime $dateTime;
function __construct(\DateTime $dateTime) {
$this->dateTime = $dateTime;
}
public function __clone()
{
$this->dateTime = clone $this->dateTime;
}
}
$today = new Foo(new \DateTime());
$tomorrow = clone $today;
$tomorrow->dateTime->modify('+1 day');添加json_validate函數
在之前的版本中想要驗證一個字符是否是語法上有效的JSON,需要先decode然后判斷錯誤碼,而現(xiàn)在可以直接調用json_validate函數。
同時 json_validate() 性能比 json_decode() 要好不少,并且使用更加簡單。
// PHP < 8.3
function json_validate(string $string): bool {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true
// PHP 8.3
var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true一次 Lint 多個文件
PHP CLI 二進制文件的 -l 允許檢查 PHP 文件以確保它沒有語法錯誤。
以前只允許一次檢查一個文件,這意味著如果想檢查整個項目,則必須為每個應用程序文件調用一次它。從 PHP 8.3 開始允許傳遞多個文件。
// PHP < 8.3 php -l index.php // PHP 8.3 php -l src/**/*.php
除此之外,還有一些新的類、接口和函數,以及棄用和向后兼容性中斷。
具體的內容可以期待 PHP 8.3 發(fā)布后查看官方的發(fā)布公告和文檔。
以上就是PHP8.3發(fā)布內容新特性及支持版本探究的詳細內容,更多關于PHP8.3版本特性的資料請關注腳本之家其它相關文章!
相關文章
eval(cmd)與eval($cmd)的區(qū)別與聯(lián)系
這篇文章主要介紹了eval(cmd)與eval($cmd)的區(qū)別與聯(lián)系,希望對屏幕前的你有所幫助2021-07-07
jQuery EasyUI API 中文文檔 - DateBox日期框
jQuery EasyUI API 中文文檔 - DateBox日期框,需要的朋友可以參考下。2011-10-10
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安裝全功略
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安裝全功略...2006-07-07

