PHP 8 has been mentioned quite a lot lately (at least for me), and after 5 release candidate, it’s finally ready to be used today – 11/26/2020, instead of bundled Please DO NOT use this version in production, it is an early test version.
warning line Please DO NOT use this version in production, it is an early test version.
As a major update, PHP 8 comes with a lot of new features and performance improvements. However, if you are using php7.2 or below, chances are your project will need a little change to run smoothly on PHP 8, if you plan to upgrade: 3 but probably not many people. Where are the environment changes for the project running
New feature
Let’s take a look at some of the cool new features of PHP 8, that I think you will enjoy PHP
Union types
Makes PHP’s data type more flexible. Union types
are a collection of 2 or more data types for the same variable
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> |
Be a little careful that void
cannot be part of the union types
declaration, since it returns nothing =]]. In addition, nullable
can be used in unions type
by syntax |null
, or using ?
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
Everyone’s familiar with the null coalescing operator
, of type $a ?? 'baro'
is well known, this toy doesn’t work with functions. So you still have to check with rice via if else, or if you use laravel, there is an optional()
helper optional()
. Eg:
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> |
Then with PHP 8, you can summarize it like this:
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
This toy allows you to pass a value to a parameter, but through the key for that parameter. So you no longer have to care about the parameter order, as well as omit some optional parameters
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
Sibling relative to switch case
, match
returns the value directly and omits 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
Anyone using php must be familiar with this scene
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> |
And the next toy will save quite a bit of code just to declare the propertise as above, especially whoever is using Laravel Livewire will love it
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
With this version, throw
will be an expression instead of statement as before. Ie you can write like this
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> |
And much more …
This version has a lot of changes, I temporarily bait some interesting things here for you to care about
See more details at the PHP 8 homepage