網頁設計 EP07-PHP 函式

更新 發佈閱讀 13 分鐘

在前面幾集的章節中提到很多內建函式,ex: gettype() var_dump() 等等,如果內建的功能無法滿足我現在的需求,這時就可以嘗試自己寫一個函式,由此可知函式主要分為:內建函式與自訂函式。

函式就像是一個功能,特別是需要執行相同或類似邏輯的事就可以使用,可以想像如果一直重複寫一樣的程式,一直複製貼上很沒有效率,函式就是將這些常用邏輯的程式獨立成一個個的個體,方便重複使用,達到減少程式碼檔案大小、增加可讀性與加快開發速度的功用。

建立函式

宣告方式使用 function 關鍵字,空一格接著函式名稱以及用括號包裹著的參數列表(每個參數需以逗號做分隔),最後在以左大括號做為開始,右大括號為結束,其中參數可以多個參數且回傳值不需要有也能執行。

function funcName(argument) 
{
statement;
return value;//也可以不使用,通常都會加
}

回傳值

使用關鍵字 return ,可回傳任意類型像是陣列與物件等等以往提到過的資料型別,不過一次只能回傳一個值,也意味著不能以逗號做分割,會報錯。

function test($num) 
{
$a = 60;
echo "num is : ".$num;
return $num, $a;
}

test(50);//會報錯

呼叫函式

頁面載入時,函式不會自動執行,函式只有在被呼叫時才會執行。

自身呼叫

函式名稱加小括號()。

<?PHP
function test($num)
{
echo "num is : ".$num;
return $num;
}

test(50);//輸出 num is : 50
?>

呼叫其他檔案 include vs ​require

在 PHP 引入其他檔案,就會使用到 includerequire

include 通常放在流程控制中,程式執行碰到或條件達成才會引用,

require 一般放在 PHP 文件的最前面,在程式執行前先導入需要的文件。

include require 的差別在於,前者發生錯誤的時候會產生 Warning 但會繼續執行之後的程式碼,後者則是發生錯誤後(Error)程式停止運作。

還有一個更進階的用法 : include_oncerequire_once,相信看到once已經猜到是什麼意思,顧名思義會檢查該檔案在先前是否引入過,如果有就不再重複引入。

<?PHP
function test($num)
{
if($num >50){
include("test4.php");//假設test4.php不存在
}
echo "num is : ".$num;
return $num;
}
$a = test(55);
/*Warning: include(test4.php): Failed to open stream: No such file or directory in D:\xampp\htdocs\test\test2.php on line 7

Warning: include(): Failed opening 'test4.php' for inclusion (include_path='D:\xampp\php\PEAR') in D:\xampp\htdocs\test\test2.php on line 7
num is : 55*/
?>
<?PHP
require("class.php");

function test($num)
{
echo "num is :".$num;
return $num;
}
$a = test1(50);
$b = test(50)+$a;
echo "total is :".$b;
?>//輸出value is :50 num is :50 total is :100
echo "---------------------------";
//副程式 class.php
<?php
function test1(int $value){
$c = 60;
echo "value is :".$value;
return $value;
}
?>

引用參數

PHP 的引用是在變數或函式、物件等前面加上 & 符號,允許透過不同的變數名稱指向同一內容(不是另一個變數指向另一個變數),與常見的C語言指標有些差別(指標變數儲存的是變數在記憶體中的位址,透過解參考運算子 * (Dereference Operator)才能取得該位址中的內容)。常見的是引用賦值,而本篇要介紹的是引用參數。

<?PHP
function test(&$num)
{
​$num++;
return $num;
}
$a = 5;
echo test($a);//輸出6
echo $a;//輸出6
?>

參數預設值

避免函式被呼叫時沒有參數值傳入,這時就可以替函式的參數加上預設值,此時參數值就會等於預設值,由於參數是由左而右傳入值,所以默認參數需放在非默認參數的右側,否則會被認定傳入參數不足,若參數預設值沒設定,表示該參數必填。

<?PHP
function test($num1, $num = 50)
{
echo "num total is : ".$num + $num1;
return $num + $num1;
}
$a = ​test(50);
echo $a;//輸出num total is : 100 100
?>

參數資料型別指定

單一型別

PHP 是動態(dynamic)弱型別(weak type)程式語言,由於沒有指定資料型別,就有可能導致該函式最終運行結果不如預期,像是下方的例子傳入一個資料型別位字串的數字,在嚴格模式下字串無法做運算,進而發生錯誤。

<?PHP
declare(strict_types=1);//嚴格模式
function test(int $num)
{
echo "num is : ".$num+50;
return $num;
}
$a = test("50");
echo $a;
echo $a+50;
?>
/*致命錯誤:未捕獲的 TypeError:test():參數 #1 ($num) 必須是 int 類型,但傳入的是 string 類型,
該錯誤在 D:\xampp\htdocs\test\test2.php 的第 8 行被調用,定義於 D:\xampptest\htdocs\test\23.php 的
第 3.堆疊追蹤:#0 D:\xampp\htdocs\test\test2.php(8): test('50') #1 {main} 拋出異常於D:\xampp\htdocs\test\test2.php的第3行。*/

聯合型別

單一型別進階版,允許參數可接受多個資料型別。

<?PHP
declare(strict_types=1);//嚴格模式
function test(int | string | float $num)
{
echo "num is : ".$num+50;
"<br>";
return $num;
}
$a = test("50");
echo $a;
echo $a+50;//輸出num is : 100 50 100
?>

可變參數數量

用於傳入參數數量不確定時,使用 ... 語法的參數會變成一個陣列。

<?PHP
function test(...$num)
{
$a = 0;
for($i=0;$i<count($num);$i++){

echo "data list".$i."is".$num[$i];
$a += $num[$i];
}
echo $a;
}
$a = test(1, 2, 3, 4, 5);//輸出15
?>

具名參數

具名參數(Named argument)透過 : 允許根據參數名稱傳參數給函式而不是參數位置,這樣一來就無需遵守順序且程式可讀性提升,可搭配參數預設值混合使用。

<?PHP
function test($num1, $num = 50)
{
echo "num total is : ".$num + $num1;
return $num + $num1;
}
$a = test(num1:50, num:100);
echo $a;//輸出num total is : 150 150
?>

可變函式

可變函式 (Variable functions)允許將函式名稱賦值給變數,再透過變數名稱調用,使用方式跟呼叫函式的方式一樣在變數名稱後加上小括號(),並傳入對應的參數,這種特性可用於實現回調函式 (callback)、函式表或根據條件動態執行不同函式,大大增加了程式碼的靈活性。

<?PHP
function test($num1, $num = 50)
{
echo "num total is : ".$num + $num1;
return $num + $num1;
}
$a = "test";
echo $a(50);//num total is : 100 100
?>

此外,在自訂函式中還有箭頭函式、匿名函式。

匿名函式

匿名函式(Anonymous Function)又稱為閉包函式(Closure Function),大部分的程式語言都有該功能,使用關鍵字 function 宣告,因為沒有名稱,所以需要變數來儲存,需要使用時用變數名稱加小括號呼叫,最常用作回調函式(callback)參數的值,以下方的例子來說$sum就是藉由參數傳遞到另一個函式使用的函式。

<?php
$sum = function($a, $b){return $a+$b;};

function cal($num1, $num2, $action){
  echo $num1+$num2+$action(1, 2);
}
cal(3, 4, $sum)//輸出10
?>

使用 use 關鍵字可以讓匿名函式存取外部變數。

<?PHP
$c = 50;
$d = 60;
$sum = function($a, $b)use($c, $d){echo $a+$b;return $c+$d;};
$sum(1, 2);//輸出3
echo "num is : ".$sum(1, 2);//輸出3 num is : 110
?>

箭頭函式

箭頭函式(Arrow Functions)為匿名函式更簡潔的寫法,理論上也是closure的一種,與匿名函式的差別在於想存取外部變數(父層作用域變數)不需要使用關鍵子 use ,能夠自動捕獲,以及箭頭函式僅限單一表達式,不能有多行程式或陳述式。

<?PHP
$c = 50;
$d = 60;
$sum = fn($b)=> $b+$c+$d;
echo $sum(50);//輸出160
?>

❗不過閉包建議要謹慎使用,因為閉包的特性會將變數保存在記憶體中,需避免佔用多餘的記憶體,造成記憶體洩漏(memory leak)。❗


本篇文章到這裡就結束了,匿名函式跟箭頭函式真的很少遇到,也花了一些時間理解一下Callback和Closure到底是什麼,如果有術語用法錯誤的地方也希望不吝指教。

如果喜歡我的文章或覺得有用的話,歡迎動動手指點擊愛心,你/妳的支持是我最大的動力,我們下篇文章見🙌。

留言
avatar-img
逃的沙龍
1會員
9內容數
分享學習路上的內容與心得
逃的沙龍的其他內容
2026/02/25
深入瞭解 PHP 運算子的種類與應用,包含算術、賦值、邏輯、字串、比較、位元、錯誤控制與執行運算子,助您掌握程式邏輯,提升程式開發效率。
Thumbnail
2026/02/25
深入瞭解 PHP 運算子的種類與應用,包含算術、賦值、邏輯、字串、比較、位元、錯誤控制與執行運算子,助您掌握程式邏輯,提升程式開發效率。
Thumbnail
2026/02/22
深入探討 PHP 中的各種邏輯判斷語句和迴圈結構,包括 for、foreach、while、do/while,以及 switch case 與 match 的差異,還有 if/else 的應用。本文提供清晰的宣告方式、實際應用場景和程式碼範例,幫助開發者掌握這些基礎但關鍵的程式設計概念。
Thumbnail
2026/02/22
深入探討 PHP 中的各種邏輯判斷語句和迴圈結構,包括 for、foreach、while、do/while,以及 switch case 與 match 的差異,還有 if/else 的應用。本文提供清晰的宣告方式、實際應用場景和程式碼範例,幫助開發者掌握這些基礎但關鍵的程式設計概念。
Thumbnail
2026/02/17
探討 PHP 變數範圍,包括全域變數、區域變數、靜態變數,並詳細介紹 $_GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE, $_SESSION 等超全域變數的用法與應用。
Thumbnail
2026/02/17
探討 PHP 變數範圍,包括全域變數、區域變數、靜態變數,並詳細介紹 $_GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE, $_SESSION 等超全域變數的用法與應用。
Thumbnail
看更多
你可能也想看
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
別再什麼都用 div 了。學會這 5 個 HTML 語意標籤,讓你的程式碼在短短兩週內變得無障礙、SEO 友善且易於維護。包含實際範例和前後對比。
Thumbnail
別再什麼都用 div 了。學會這 5 個 HTML 語意標籤,讓你的程式碼在短短兩週內變得無障礙、SEO 友善且易於維護。包含實際範例和前後對比。
Thumbnail
這篇文章分享了 CSS Battle 第 38 題的解法,並提供了相關的技術總結。文章內容包括了使用 flex 排版處理、背景漸層的方法處理等相關技術。透過這篇文章可以學習到如何解決 CSS 切版的問題。
Thumbnail
這篇文章分享了 CSS Battle 第 38 題的解法,並提供了相關的技術總結。文章內容包括了使用 flex 排版處理、背景漸層的方法處理等相關技術。透過這篇文章可以學習到如何解決 CSS 切版的問題。
Thumbnail
這篇文章介紹了CSS Battle每週切版#107的解題方法。它深入講解了使用grid來處理圖案的方法,同時介紹了圖層堆疊、border-radius和z-index的使用。文章中還分享了使用position: relative;調整位置的技巧。本篇文章是前端工程師們進行基礎切版學習和練習的好材料。
Thumbnail
這篇文章介紹了CSS Battle每週切版#107的解題方法。它深入講解了使用grid來處理圖案的方法,同時介紹了圖層堆疊、border-radius和z-index的使用。文章中還分享了使用position: relative;調整位置的技巧。本篇文章是前端工程師們進行基礎切版學習和練習的好材料。
Thumbnail
在CSS Battle的第153題,我們會使用grid、css選擇器、偽元素等技巧來解決西洋棋盤的排版問題。這篇文章分享了完整的解法,包括選擇器使用、偽元素的應用以及其他排版技巧,並激勵讀者分享自己的解法。
Thumbnail
在CSS Battle的第153題,我們會使用grid、css選擇器、偽元素等技巧來解決西洋棋盤的排版問題。這篇文章分享了完整的解法,包括選擇器使用、偽元素的應用以及其他排版技巧,並激勵讀者分享自己的解法。
Thumbnail
本篇文章介紹了路徑的概念和兩種不同的路徑運用。這些知識對於網頁開發非常重要,能夠幫助網站開發者更好地管理資源文件的位置。文章通過實際例子和相對路徑的範例來解釋這些概念。希望通過這篇文章,讀者能夠清楚地瞭解路徑的概念,並在日後的開發中能夠靈活運用。
Thumbnail
本篇文章介紹了路徑的概念和兩種不同的路徑運用。這些知識對於網頁開發非常重要,能夠幫助網站開發者更好地管理資源文件的位置。文章通過實際例子和相對路徑的範例來解釋這些概念。希望通過這篇文章,讀者能夠清楚地瞭解路徑的概念,並在日後的開發中能夠靈活運用。
Thumbnail
這篇文章分享了 CSS Battle #29 的解法,並提供了對於 grid、flex 和 nth-of-type 的使用技巧,讓讀者可以學習到基礎切版的相關知識。作者鼓勵讀者去分享自己的作法和進行交流。文章在每週三更新,歡迎有興趣的朋友參與互動。
Thumbnail
這篇文章分享了 CSS Battle #29 的解法,並提供了對於 grid、flex 和 nth-of-type 的使用技巧,讓讀者可以學習到基礎切版的相關知識。作者鼓勵讀者去分享自己的作法和進行交流。文章在每週三更新,歡迎有興趣的朋友參與互動。
Thumbnail
是的,身為前端工程師的基本功!還是需要時不時拿出來打磨一番! 很多大公司的切版與前端是分開的,但不能因為碰不到就不去理解,假如要系統性的調整樣式,那麼你就一定要懂基礎,就好像你要調整微前端的架構,總不能連包板工具的設定都不會吧! 回到正題,這系列文章每個禮拜三都會更新一題CSS Battle的題
Thumbnail
是的,身為前端工程師的基本功!還是需要時不時拿出來打磨一番! 很多大公司的切版與前端是分開的,但不能因為碰不到就不去理解,假如要系統性的調整樣式,那麼你就一定要懂基礎,就好像你要調整微前端的架構,總不能連包板工具的設定都不會吧! 回到正題,這系列文章每個禮拜三都會更新一題CSS Battle的題
Thumbnail
在這篇文章中,我們將探討網頁設計價錢這個話題。網頁設計價錢是指建立和設計一個網站所需的費用,取決於網站的複雜性、功能需求、設計風格和開發時間等。文章中還提供了影響網頁設計價錢的因素和如何選擇適合的價格的指南。希望本文能解決可能讓人困惑的網頁設計價格問題。
Thumbnail
在這篇文章中,我們將探討網頁設計價錢這個話題。網頁設計價錢是指建立和設計一個網站所需的費用,取決於網站的複雜性、功能需求、設計風格和開發時間等。文章中還提供了影響網頁設計價錢的因素和如何選擇適合的價格的指南。希望本文能解決可能讓人困惑的網頁設計價格問題。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News