PHP 目前依舊是其它腳本語言強勁的競爭對手,這主要歸功於其核心維護團隊的快速更新。
自從 PHP 7.0 發布以來,社群見證了許多新功能的誕生,大大改善了開發者在專案中應用 PHP 的方式。提高 PHP 應用的效能和安全性,是這些改進的主要目的。
PHP 最近又實現了一個里程碑 —— 發佈 PHP 7.3。新版本帶來了一些急需的更新。
在本文中,我將論述新推出的 PHP 7.3 特性 和更新。好消息是,你可以在你的測試伺服器上自行安裝新版本、檢視新功能。但老生常談,切勿在生產伺服器上使用 RC 版本更新,可能會破壞你已經上線的應用程式。
以下是7.3版中引入的一些更新,與先前的版本相比,它們大大提高了 PHP 7.3 的效能 。
- 靈活的Heredoc 和Nowdoc 語法
- 函數呼叫時允許尾隨逗號
- JSON_THROW_ON_ERROR
- #PCRE2 遷移
- #list( ) 指派參考
- is_countable 函數
- array_key_first(), array_key_last()
- Argon2 密碼雜湊增強功能
- 已棄用與刪除image2wbmp()
- 棄用和刪除不區分大小寫的常數
- 相同網站Cookie
- FPM 更新
- 是改進Windows 下的檔案刪除
讓我們逐一討論上述的每一個更新。
靈活的 Heredoc 和 Nowdoc 語法
Heredoc 和 Nowdoc 語法能夠在使用多行長字串時起到很大幫助。它要求結束標識符應為出現在新行的首個字串。
// 除了这样: $query = <p>總的來說,此更新提出了兩個改進,如下:</p><ol> <li>閉合標識符前支援縮排</li> <li>閉合標識符後不再強制換行</li> </ol><p>在上面的例子裡,可以很容易看出這些改變。 </p><h2 id="函數呼叫中允許尾部逗號">函數呼叫中允許尾部逗號</h2><p>在參數、元素、變數清單結尾,追加尾部逗號。有時我們在數組內以及函數呼叫(尤其是可變參函數)時需要傳遞大量元素,若是漏掉一個逗號,便會報錯。鑑於如上情況,尾部逗號便顯得十分有用。這個特性已經允許在陣列內使用,並且從 PHP 7.2 開始,分組命名空間(<code>Grouped Namespaces</code>)語法也開始支援尾部逗號。 </p><pre class="brush:php;toolbar:false">use Foo\Bar\{ Foo, Bar, }; $foo = [ 'foo', 'bar', ];
當新值需要被追加在此處時,尾部逗號便顯得十分實用。在可變參函數例如 unset()
內,更是如此。
unset( $foo, $bar, $baz, );
同時,當你使用 compact()
函數給模版引擎傳遞一批變數時,也是個能用到的例子。
echo $twig->render( 'index.html', compact( 'title', 'body', 'comments', ) );
在某些需要建構連續或分組資料情況下,經常要使用 array_merge()
函式合併陣列。也可以利用尾部逗號:
$newArray = array_merge( $arrayOne, $arrayTwo, ['foo', 'bar'], );
同樣,你也可以在呼叫任意方法、函數以及閉包時使用此特性。
class Foo { public function __construct(...$args) { // } public function bar(...$args) { // } public function __invoke(...$args) { // } } $foo = new Foo( 'constructor', 'bar', ); $foo->bar( 'method', 'bar', ); $foo( 'invoke', 'bar', );
JSON_THROW_ON_ERROR
解析 JSON 回應數據,有 json_encode()
以及 json_decode()
兩個函數可供使用。不幸的是,它們都沒有恰當的錯誤拋出表現。 json_encode
失敗時只會傳回false
;json_decode
失敗時則會傳回null
,而null
可作為合法的JSON 數值。唯一取得錯誤的方法是,呼叫 json_last_error()
或 json_last_error_msg()
,它們將分別傳回機器可讀和人類可讀的全域錯誤狀態。
該 RFC 提出的解決方案是,為 JSON 函數新增 JSON_THROW_ON_ERROR
常數用於忽略全域錯誤狀態。當錯誤發生時,JSON 函數將會拋出JsonException
異常,異常訊息(message
)為json_last_error()
的回傳值,例外碼(code
)為json_last_error_msg()
的回傳值。如下是呼叫範例:
json_encode($data, JSON_THROW_ON_ERROR); json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR); // 抛出 JsonException 异常
升級 PCRE2
PHP 使用 PCRE 作為正規表示式引擎。但從 PHP 7.3 開始,PCRE2 將作為新的正規引擎大顯身手。所以,你需要將現有的正規表示式遷移到符合 PCRE2 的規則。這些規則比以前更具侵入性。請看以下實例:
preg_match('/[\w-.]+/', '');
這個表達式在新版 PHP 內將會符合失敗且不會觸發警告。因為 PCRE2 現嚴格要求,若需匹配連字符(-
)而非用於表示範圍,則必須移動到末尾或將其轉義。
更新到 PCRE2 10.x 後,支援了以下以及更多特性:
- 相对后向引用
\g{+2}
(等效于已存在的\g{-2}
) - PCRE2 版本检查
(?(VERSION>=x)...)
-
(*NOTEMPTY)
和(*NOTEMPTY_ATSTART)
告知引擎勿返回空匹配 -
(*NO_JIT)
禁用 JIT 优化 -
(*LIMIT_HEAP=d)
限制堆大小为d
KB -
(*LIMIT_DEPTH=d)
设置回溯深度限制为d
-
(*LIMIT_MATCH=d)
设置匹配数量限制为d
译者注:国内正则术语参差不一,「后向引用」——
Back References
,又称「反向引用」、「回溯引用」等,此处参考 PHP 官方手册的中文译本。
list() 赋值引用
PHP 中的 list() 现在可以赋值给引用,在当前版本中 list() 中赋值不能使用引用,在 PHP 7.3 中将允许使用引用,新改进的语法如下:
$array = [1, 2]; list($a, &$b) = $array;
相当于
$array = [1, 2]; $a = $array[0]; $b =& $array[1];
在 PHP 7.3 的变更中,我们还可以与 foreach() 方法一起嵌套使用
$array = [[1, 2], [3, 4]]; foreach ($array as list(&$a, $b)) { $a = 7; } var_dump($array);
is_countable 函数
在 PHP 7.2 中,用 count() 获取对象和数组的数量。如果对象不可数,PHP 会抛出警告⚠️ 。所以需要检查对象或者数组是否可数。 PHP 7.3 提供新的函数 is_countable() 来解决这个问题。
该 RFC 提供新的函数 is_countable(),对数组类型或者实现了 Countable
接口的实例的变量返回 true 。
之前:
if (is_array($foo) || $foo instanceof Countable) { // $foo 是可数的 }
之后:
if (is_countable($foo)) { // $foo 是可数的 }
array_key_first(), array_key_last()
当前版本的 PHP 允许使用 reset()
,end()
和 key()
等方法,通过改变数组的内部指针来获取数组首尾的键和值。现在,为了避免这种内部干扰,PHP 7.3 推出了新的函数来解决这个问题:
-
$key = array_key_first($array);
获取数组第一个元素的键名 -
$key = array_key_last($array);
获取数组最后一个元素的键名
让我们看一个例子:
// 关联数组的用法 $array = ['a' => 1, 'b' => 2, 'c' => 3]; $firstKey = array_key_first($array); $lastKey = array_key_last($array); assert($firstKey === 'a'); assert($lastKey === 'c'); // 索引数组的用法 $array = [1 => 'a', 2 => 'b', 3 => 'c']; $firstKey = array_key_first($array); $lastKey = array_key_last($array); assert($firstKey === 1); assert($lastKey === 3);
译者注:
array_value_first()
和array_value_last()
并没有通过 RFC 表决;因此 PHP 7.3 内仅提供了array_key_first()
以及array_key_last()
函数。
参考链接:https://wiki.php.net/rfc/array_key_first_l...
Argon2 和 Hash 密码加密性能增强
在PHP的早期版本中,我们增加了Argon2和哈希密码加密算法,这是一种使用哈希加密算法来保护密码的现代算法。它有三种不同的类型,Argon2i,Argon2d和Argon 2id。 我们针对Argon2i密码散列和基于密码的密钥生成进行了优化。 Argon2d性能更快,并使用依赖于内存的数据访问。 Argon2i使用与内存无关的数据访问。 Argon2id是Argon2i和Argon2d的混合体,使用依赖于数据和与数据独立的存储器访问的组合。
password_hash():
Argon2id现在是在paswword_ *函数中使用的推荐的Argon2变量。
具有自定义成员方法的名称的Argon2id与PASSWORD_ARGON2I的使用方法相同 password_hash('password',PASSWORD_ARGON2ID,['memory_cost'=> 1 4,'threads'=> 2]);
password_verify();
除了Argon2i之外,password_verify()函数也适用于Argon2id。
password_needs_rehash();
此函数也将接受Argon2id哈希值,如果任何变量成员发生变化,则返回true。
$hash = password_hash('password', PASSWORD_ARGON2ID); password_needs_rehash($hash, PASSWORD_ARGON2ID); // 返回假 password_needs_rehash($hash, PASSWORD_ARGON2ID, ['memory_cost' => 1<h2 id="废弃并移除-image-wbmp">废弃并移除 image2wbmp()</h2><p>该函数能够将图像输出为 WBMP 格式。另一个名为 <code>imagewbmp()</code> 的函数也同样具备单色转换的作用。因此,出于重复原因,<a href="https://wiki.php.net/rfc/image2wbmp">image2wbmp()</a> 现已被废弃,你可使用 <code>imagewbmp()</code> 代替它。此函数被弃用后,再次调用它将会触发已弃用警告。待后续此函数被移除后,再次调用它将会触发致命错误。</p><h2 id="废弃并移除大小写不敏感的常量">废弃并移除大小写不敏感的常量</h2><p>使用先前版本的 PHP,你可以同时使用大小写敏感和大小写不敏感的常量。但大小写不敏感的常量会在使用中造成一点麻烦。所以,为了解决这个问题,PHP 7.3 废弃了大小写不敏感的常量。</p><p>原先的情况是:</p>
- 类常量始终为「大小写敏感」。
- 使用
const
关键字定义的全局常量始终为「大小写敏感」。注意此处仅仅是常量自身的名称,不包含命名空间名的部分,PHP 的命名空间始终为「大小写不敏感」。 - 使用
define()
函数定义的常量默认为「大小写敏感」。 - 使用
define()
函数并将第三个参数设为true
定义的常量为「大小写不敏感」。
如今 PHP 7.3 提议废弃并移除以下用法:
- In PHP 7.3: 废弃使用
true
作为define()
的第三个参数。 - In PHP 7.3: 废弃使用与定义时的大小写不一致的名称,访问大小写不敏感的常量。
true
、false
以及null
除外。
同站点 Cookie
PHP 7.3 在建议在使用 cookies 时,增加同站点标志。这个 RFC 会影响4个系统函数。
- setcookie
- setrawcookie
- session_set_cookie_params
- session_get_cookie_params
这个影响会在两种情况下起作用。其中一种方式会添加函数的新参数
,另一种方式允许以数组形式的选项代替其他单独选项。
bool setcookie( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] ) bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, array $options ]]] ) // 两种方式均可.
FPM 更新
FastCGI 进程管理器也进行了更新,现在提供了新的方式来记录 FPM 日志。
log_limit: 设置允许的日志长度,可以超过 1024 字符。
log_buffering: 允许不需要额外缓冲去操作日志。
decorate _workers_output: 当启用了 catch_workers_output 时,系统会去禁用渲染输出。
改进 Windows 下的文件删除
如官方文档所述:
默认情况下,文件描述符以共享读、写、删除的方式去操作。 这很有效的去映射 POSIX 并允许去删除正在使用中的文件。但这并不是100%都是一样的,不同的平台可能仍存在一些差异。删除操作之后,文件目录仍存在直到所有的文件操作被关闭。
结束语
之前我们已经讲解了最新版本的 PHP7.3 的特点,包含了许多新增跟弃用的功能。这些功能都可以在 php.net 网站上找到,并且已经合并到主分支上了。你现在就可以使用这些新功能部署在自己的服务器上,你也可以打开官方RFC页面查阅每一个详细版本。如果你对着新版 PHP7.3 有任何问题,你可以在评论下写下自己的想法。
相关PHP视频教程推荐:《PHP视频教程》
以上是一篇文章幫你了解 PHP 7.3 更新的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器