1 <?php 2 function divide($dividend, $divisor){ 3 return $dividend / $divisor; 4 } 5 echo divide(12, 4); 6 echo divide('sa', 'sd');
這段代碼乍一看沒毛病,但是如果你向它傳遞「任意」引數,它就會出問題,
寫出好的代碼是一個學無止境的程序,讓我們來改進我們撰寫 PHP 函式的方式, 看下上面的代碼,想想第二個函式呼叫那里會發生什么情況? 它會接受你輸入的任何引數,并且嘗試執行然后拋出一個數學錯誤, 但是我們怎么才能讓一個函式嚴格接收能使其正確執行的引數呢? 現代的 PHP 解決了這個問題,并且有更多妙法能讓你的代碼質量更進一層,沒有 bug,
函式引數與它們的資料型別
你可以嚴格控制你的函式,使其只接收讓它正確運行的引數,讓我們改變上面的函式定義:
<?php function divide(int $dividend, int $divisor){ return $dividend / $divisor; } echo divide(12, 4); echo divide('sa', 'sd');
現在,第二次呼叫這個函式將會拋出一個致命錯誤,指出其需要的引數必須是整數型別,你可以用不同的方式處理引數,
1 <?php 2 // 可選引數 3 function getName(string $firstName, string $lastName = ''){ 4 return $firstName . ' ' . $lastName; 5 } 6 echo getName('Muhammad', 'Nauman'); // Muhammad Nauman 7 echo getName('Adam'); // Adam 8 function divide(int $dividend, int $divisor = 2){ 9 return $dividend / $divisor; 10 } 11 echo divide(12, 4); // 3 12 echo divide(12); // 6 13 // 僅接收 Request 類的實體引數 $request 14 function getReuestParams(Request $request){ 15 return $request->only('name', 'email'); 16 }
在定義的時候,將可選引數或帶默認值的引數作為最后一個引數,
PHP 7.1 也給可迭代資料介紹了一種偽型別,它能接收任何可迭代的資料,

上圖是使用了 iterable 資料型別的函式,
現在通過代碼,我們可以控制的更多了,不是嗎?沒錯,確實如此!
函式與它們的回傳值
正如你可以控制傳遞給指定函式的引數型別一樣,你也可以控制函式的回傳值型別,它能確保你的函式總是回傳同一個資料型別,并且不會崩潰,我們改變一下上面的代碼:
1 <?php 2 // 可選引數 3 function getName(string $firstName, string $lastName = '') : string { 4 return $firstName . ' ' . $lastName; 5 } 6 echo getName('Muhammad', 'Nauman'); // Muhammad Nauman 7 echo getName('Adam'); // Adam 8 function divide(int $dividend, int $divisor = 2) : int { 9 return $dividend / $divisor; 10 } 11 echo divide(12, 4); // 3 12 echo divide(12); // 6 13 // 僅接收 Request 類的實體 $request 作為引數 14 function getReuestParams(Request $request) : array { 15 return $request->only('name', 'email'); 16 } 17 // 回傳 void 型別 18 $attribute = 2; 19 function changeAttribute(string &$param, $value) : void { 20 $param = $value; 21 } 22 changeAttribute($attribute, 5); 23 echo $attribute; // 5
PHP 逐漸引入了這些功能,如:5.1 版引入的陣列型別作為引數,5.4 版引入的可呼叫型別(callable type),以及 7.1 版引入的 void 回傳型別等,
可選引數 VS 可空引數
除了可選引數外,你還可以定義可空(nullable)引數,這意味著你可以定義一種可空引數型別,我們來看個例子:
1 <?php 2 function nullableParameter(?string $name) 3 { 4 return $name; 5 } 6 echo nullableParameter(null); // 不會回傳任何東西 7 echo nullableParameter('Nauman'); // Nauman 8 echo nullableParameter(); // 致命錯誤 9 function nullableParameterWithReturnType(?string $name) : string 10 { 11 return $name; 12 } 13 echo nullableParameter(null); // 致命錯誤,必須回傳 string 型別 14 echo nullableParameter('Nauman'); // Nauman 15 function nullableReturnType(string $name) : ?string 16 { 17 return $name; 18 } 19 echo nullableParameter(null); // 致命錯誤,$name 應該是 string 型別 20 echo nullableParameter('Nauman'); // Nauman
顯然,可空引數不是可選引數,你必須傳遞一個值或者是 null,我個人喜歡使用空值作為可選引數,但這取決于你的任務需求,
總結
從我開啟職業生涯的時候我就使用 PHP 了,我真的很愛這門語言,在過去很長一段時間里,它都是開發 web 應用的不二之選,現在 7.x 版本又填補了許多高級特性和現代化應用的需求,并且提高了開發者的效率,這門語言正不斷的發生改變,找出這些變化,并停止過去的寫法,放棄你原來的習慣并自豪的使用這些新特性,讓你的代碼更易讀易懂, Happy coding :)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/115600.html
標籤:PHP
