PHP 8 đã được nhắc đến khá nhiều gần đây (ít nhất đối với mình), và sau tới 5 bản release candidate, cuối cùng nó đã có thể sử dụng chính thức vào ngày hôm nay – 26/11/2020, thay vì kèm dòng cảnh báo Please DO NOT use this version in production, it is an early test version.
Là một bản cập nhật lớn, PHP 8 đi kèm với rất nhiều tính năng mới và cải thiện hiệu suất. Tuy nhiên, nếu bạn đang xài php7.2 trở xuống, khả năng cao dự án của bạn sẽ cần thay đổi chút ít để có thể chạy mượt mà trên PHP 8, nếu bạn có dự định nâng cấp :3 nhưng chắc không mấy ai thay đổi môi trường cho dự án đang chạy đâu
Tính năng mới
Hãy điểm qua vài tính năng hay ho mới của PHP 8, mà mình nghĩ các bạn theo PHP sẽ thích thú
Union types
Giúp cho kiểu dữ liệu của PHP có thể linh hoạt hơn. Union types
là một tập hợp 2 hoặc nhiều kiểu dữ liệu cho cùng 1 biến
1 2 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token operator">|</span>string <span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">:</span> int<span class="token operator">|</span>float<span class="token punctuation">;</span> |
Cẩn thận một chút là void
không thể là 1 phần của khai báo union types
, vì nó chẳng trả về giá trị gì cả =]]. Ngoài ra nullable
có thể xài trong unions type
bằng cú pháp |null
, hoặc sử dụng dấu ?
1 2 3 4 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token operator">|</span><span class="token constant">null</span> <span class="token variable">$foo</span><span class="token punctuation">)</span><span class="token punctuation">:</span> void<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">bar</span><span class="token punctuation">(</span><span class="token operator">?</span>string <span class="token variable">$bar</span><span class="token punctuation">)</span><span class="token punctuation">:</span> void<span class="token punctuation">;</span> |
Nullsafe operator
Mọi người mà quen thuộc cái null coalescing operator
, kiểu $a ?? 'baro'
thì chắc cũng biết, cái đồ chơi này không hoạt động với function. Nên bạn vẫn phải check bằng cơm qua if else, hoặc nếu xài laravel thì có thêm helper optional()
. Ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token variable">$country</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$session</span> <span class="token operator">!==</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token variable">$session</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">user</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$user</span> <span class="token operator">!==</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$address</span> <span class="token operator">=</span> <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getAddress</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$address</span> <span class="token operator">!==</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$country</span> <span class="token operator">=</span> <span class="token variable">$address</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">country</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Thì với PHP 8, các bạn có thể tóm gọn nó như này:
1 2 | <span class="token variable">$country</span> <span class="token operator">=</span> <span class="token variable">$session</span><span class="token operator">?</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">user</span><span class="token operator">?</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getAddress</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">?</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">country</span><span class="token punctuation">;</span> |
Named arguments
Đồ chơi này cho phép các bạn truyền giá trị cho tham số, nhưng thông qua key của tham số đó. Vì thế bạn không còn phải quan tâm tới thứ tự tham số, cũng như bỏ qua một số tham số không bắt buộc
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">function</span> <span class="token function">foo</span><span class="token punctuation">(</span>string <span class="token variable">$a</span><span class="token punctuation">,</span> string <span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token operator">?</span>string <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token operator">?</span>string <span class="token variable">$d</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token operator">?</span>string <span class="token variable">$e</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">/* … */</span> <span class="token punctuation">}</span> <span class="token function">foo</span><span class="token punctuation">(</span> e<span class="token punctuation">:</span> <span class="token single-quoted-string string">'value b'</span><span class="token punctuation">,</span> a<span class="token punctuation">:</span> <span class="token single-quoted-string string">'value a'</span><span class="token punctuation">,</span> c<span class="token punctuation">:</span> <span class="token single-quoted-string string">'value r'</span><span class="token punctuation">,</span> b<span class="token punctuation">:</span> <span class="token single-quoted-string string">'value o'</span><span class="token punctuation">,</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> |
Match expression
Họ hàng anh em với switch case
, match
trả về trực tiếp giá trị và lược bỏ break
1 2 3 4 5 6 | <span class="token keyword">echo</span> match <span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token single-quoted-string string">'200'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'401'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'404'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"Oh no!"</span><span class="token punctuation">,</span> <span class="token number">200</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"It seems good."</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">//> It seems good.</span> |
Constructor property promotion
Bạn nào xài php chắc đã quá quen với cảnh này
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">class</span> <span class="token class-name">Point</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> float <span class="token variable">$x</span><span class="token punctuation">;</span> <span class="token keyword">public</span> float <span class="token variable">$y</span><span class="token punctuation">;</span> <span class="token keyword">public</span> float <span class="token variable">$z</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span> float <span class="token variable">$x</span> <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">,</span> float <span class="token variable">$y</span> <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">,</span> float <span class="token variable">$z</span> <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">x</span> <span class="token operator">=</span> <span class="token variable">$x</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">y</span> <span class="token operator">=</span> <span class="token variable">$y</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">z</span> <span class="token operator">=</span> <span class="token variable">$z</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Và đồ chơi tiếp theo sẽ giúp tiết kiệm kha khá dòng code chỉ để khai báo mấy cái propertise như trên, đặc biệt là ai đang xài Laravel Livewire chắc sẽ thích
1 2 3 4 5 6 7 8 | <span class="token keyword">class</span> <span class="token class-name">Point</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span> <span class="token keyword">public</span> float <span class="token variable">$x</span> <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">,</span> <span class="token keyword">public</span> float <span class="token variable">$y</span> <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">,</span> <span class="token keyword">public</span> float <span class="token variable">$z</span> <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Throw expression
Với phiên bản này, throw
sẽ là một expression thay vì statement như trước. Tức là bạn có thể viết như này
1 2 3 4 | <span class="token variable">$triggerException</span> <span class="token operator">=</span> fn <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">ApiException</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$order</span> <span class="token operator">=</span> <span class="token variable">$list</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'order'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">OrderNotFound</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'order'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Và còn nhiều nhiều nữa…
Phiên bản này có rất nhiều thay đổi, mình tạm thời mồi chài vài thứ hay ho ra đây cho các bạn quan tâm đã
Xem thêm chi tiết tại Trang chủ PHP 8 nhé