【PHP 函數從入門到精通】

🧠 PHP 函數從入門到精通

PHP 函數是編程中最基礎、也是最強大的工具之一。它不僅可以簡化代碼、提高復用性,還能通過各種高級用法,讓你寫出更靈活、更現代的代碼。

下面我們從函數的基礎講起,逐步深入,帶你掌握函數的核心用法和高級技巧,即使是編程小白也能輕松理解!


🧩 一、函數基礎:定義與調用

函數是將一段代碼封裝起來,方便重復使用的代碼塊。

function greet($name) {echo "Hello, $name";
}greet("Tom"); // 輸出:Hello, Tom
  • function 是定義函數的關鍵字
  • $name 是參數
  • greet("Tom") 是調用函數

📦 二、傳參方式:值傳參 vs 引用傳參

1?? 值傳參(默認)

function add($a) {$a++;
}$a = 1;
add($a);
echo $a; // 輸出:1

函數內部操作的是變量的副本,不會影響原始變量。


2?? 引用傳參(使用 &

function add(&$a) {$a++;
}$a = 1;
add($a);
echo $a; // 輸出:2

&$a 表示傳入的是變量的引用,函數內部對變量的修改會影響外部。


🎁 三、默認參數:讓函數更靈活

你可以為函數參數設置默認值,這樣在調用時可以省略這些參數。

function greet($name = "Guest") {echo "Hello, $name";
}greet(); // 輸出:Hello, Guest
greet("Tom"); // 輸出:Hello, Tom

? 支持類型:

  • 標量類型(int, string, bool, float
  • array
  • null
  • 從 PHP 8.1 開始支持對象
class User {public function __construct(public string $name = "Guest") {}
}function greet(User $user = new User()) {echo "Hello, " . $user->name;
}greet(); // 輸出:Hello, Guest

🧩 四、命名參數(PHP 8.0+)

命名參數允許你按參數名傳參,跳過中間的可選參數。

function makeYogurt($container = "bowl",$flavour = "raspberry",$style = "Greek"
) {return "Making a $container of $flavour $style yogurt.\n";
}echo makeYogurt(style: "natural");
// 輸出:Making a bowl of raspberry natural yogurt.

? 更清晰、更靈活,推薦使用。


🧮 五、可變參數(Variadic Parameters)

當函數需要接收不確定數量的參數時,可以使用可變參數語法 ...$params

function sum(...$nums) {return array_sum($nums);
}echo sum(1, 2, 3, 4); // 輸出:10
  • ...$nums 會把所有傳入的參數收集成一個數組。
  • 你還可以用它來“展開”數組傳參:
$values = [1, 2, 3];
echo sum(...$values); // 輸出:6

? 可變參數與正常參數結合使用

可變參數必須是函數參數列表中的最后一個參數,前面可以有正常參數。

function logMessage($level, ...$messages) {echo "[$level] ";foreach ($messages as $msg) {echo "$msg ";}echo "\n";
}logMessage("INFO", "User", "logged", "in");
// 輸出:[INFO] User logged in

🔄 六、可變函數(動態調用函數)

你可以將函數名保存在變量中,并動態調用它。

function add($a, $b) {return $a + $b;
}$func = "add";
echo $func(1, 2); // 輸出:3

? 常用于回調、插件系統等場景。


🧩 七、實戰示例:結合命名參數 + 可變參數 + 可變函數

下面是一個非常實用的綜合示例,展示了三者如何結合使用:

function formatData(string $type = "json", bool $pretty = false, ...$data) {if ($pretty) {print_r($data);} else {echo json_encode($data);}
}

? 使用可變函數調用 + 命名參數

$formatter = 'formatData';// 使用命名參數 + 可變參數調用
$formatter(type: "json",pretty: true,"name", "age", "email"
);

📌 輸出結果:

Array
([0] => name[1] => age[2] => email
)

😶?🌫? 八、匿名函數(閉包)

匿名函數是沒有名字的函數,通常用于作為參數傳遞給其他函數,或者作為返回值。

$add = function($a, $b) {return $a + $b;
};echo $add(1, 2); // 輸出:3

你還可以在閉包中使用外部變量,只需要加上 use

$prefix = "結果是:";
$add = function($a, $b) use ($prefix) {return $prefix . ($a + $b);
};echo $add(2, 3); // 輸出:結果是:5

? use 可以讓閉包訪問它外部的變量。


🔗 bindTo:綁定閉包的上下文

有時候你想讓閉包訪問類的私有屬性或方法,可以使用 bindTo()

class User {private $name = "Alice";
}$getName = function() {return $this->name;
};$user = new User();
$bound = $getName->bindTo($user, 'User');echo $bound(); // 輸出:Alice
  • 第一個參數是綁定的對象($this
  • 第二個參數是類名,表示閉包可以訪問這個類的私有成員

🔄 Closure::fromCallable:將方法轉為閉包

你可以把一個類的方法轉換成閉包對象,這樣就能像函數一樣使用它:

class Greeter {private function sayHello($name) {return "Hello, $name";}
}$greeter = new Greeter();
$hello = Closure::fromCallable([$greeter, 'sayHello']);echo $hello("Tom"); // 輸出:Hello, Tom

?? 九、箭頭函數(PHP 7.4+)

箭頭函數是匿名函數的簡化版,寫法更簡潔,自動繼承外部變量。

$add = fn($a, $b) => $a + $b;echo $add(1, 2); // 輸出:3

它有幾個特點:

  • ? 自動繼承外部變量(不需要寫 use
  • ? 對外部變量只有讀權限(不能修改)
  • ? 只能寫一行表達式(不能寫多行邏輯)

🔖 十、First-class Callable(PHP 8.1+)

PHP 8.1 引入了一種新的方式,可以更方便地引用函數或方法:

$fn = strlen(...); // 獲取 strlen 函數的引用
echo $fn("hello"); // 輸出:5
  • ... 是語法的一部分,表示你不是在調用函數,而是在引用它。

  • 這種方式可以引用:

    • 普通函數:strlen(...)
    • 靜態方法:Math::add(...)
    • 實例方法:$greeter->sayHello(...)

它返回的是一個 Closure,可以像閉包一樣調用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916100.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CGA老年綜合評估漢密爾頓抑郁量表與認知評估聯用

一、CGA老年綜合評估漢密爾頓抑郁量表與認知評估聯用的基礎CGA老年綜合評估 (一)二者評估內容的互補性 CGA老年綜合評估漢密爾頓抑郁量表主要聚焦于老年人的抑郁情緒及相關癥狀,而認知評估則著重考察老年人的記憶力、注意力、思維能力等認知…

教培機構如何開發自己的證件照拍照采集小程序

職業教培機構對學員的證件照采集是進行學生培訓管理、考試報名、證書發放的前置工作,傳統拍照和收集證件照的方式往往面臨效率低、質量參差不齊等問題。開發一款專屬的證件照拍照采集小程序,不僅能提升機構形象,還能大幅優化工作流程。借助“…

GC8872刷式直流電機驅動器詳解:3.6A驅動能力與PWM控制

概述GC8872是一款具有故障報告功能的刷式直流電機驅動芯片,專為打印機、電器、工業設備等機電一體化應用設計。這款芯片采用ESOP8封裝,集成了H橋驅動電路和多種保護功能,支持高達3.6A的峰值電流輸出。關鍵特性寬電壓工作范圍:6.5V…

從0開始學習R語言--Day54--雙重固定模型

對于具有空間差異的數據,如果不知道數據的特征關系或意義,直接用杜賓模型來處理是一個比較通用的思路,只是后續還需要很多檢驗去證明結果的可解釋性和統計性。但如果我們已經知道特征的意義,比如企業經濟發展的數據中有著員工的科…

三生篩法在計算數論中的極限是什么?

AI輔助創作:三生篩法在計算數論中的極限主要體現在?規模邊界?、?算法適應性?及?理論兼容性?三個維度,其核心瓶頸與突破路徑如下:一、規模邊界:計算效率的斷崖式衰減??低維高效區的上限?在 10^15 以內數域,三生…

iOS WebView 加載失敗與緩存刷新問題排查實戰指南

在移動 App 中嵌入網頁后,不少團隊都會遇到一個詭異的問題:用戶看到的是“舊內容”,或“資源加載失敗”,但在瀏覽器調試中一切正常。特別是在 iOS WebView 中,這類緩存和加載問題常常隱匿、難以復現。 這篇文章將通過一…

GoLand 項目從 0 到 1:第二天 —— 數據庫自動化

第二天核心任務:自動化與多數據庫支持第二天的開發聚焦于數據庫自動化流程構建與MongoDB 業務鏈路擴展,通過工具化手段解決數據庫操作的重復性問題,同時完善多數據庫支持能力。經過一天的開發,項目已實現數據庫初始化、遷移、種子…

qt框架,使用webEngine如何調試前端

解決 Qt 5.14.2 中啟用開發者工具的問題問題在于 Qt 5.14.2 中 QWebEngineSettings::DeveloperExtrasEnabled 屬性已被棄用或更改。正確啟用開發者工具的完整方法&#xff08;Qt 5.14.2&#xff09;1. 修改 main.cpp#include <QWebEngineView> #include <QWebEngineSe…

【Atlassian生態】Jira Cloud單站點現可支持10萬用戶:架構升級與龍智云遷移服務

作為Atlassian全球白金合作伙伴&#xff0c;龍智團隊非常激動地宣布&#xff1a;Jira迎來歷史性突破——Jira Cloud單個站點最高可支持10萬用戶&#xff01;覆蓋Enterprise、Premium和Standard版本。現在&#xff0c;更多的團隊可以將Jira作為核心協作中樞&#xff0c;以加速目…

深入解析JVM垃圾回收調優:性能優化實踐指南

深入解析JVM垃圾回收調優&#xff1a;性能優化實踐指南 一、技術背景與應用場景 隨著互聯網業務的飛速發展&#xff0c;Java 應用在高并發、大內存場景下對 JVM 性能提出了更高要求。垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;作為 JVM 的核心組件之一…

萬字解析Redission ---深入理解Redission上鎖過程

Redisson獲取鎖過程 RLock lock redissonClient.getLock("lock:order" userId); boolean isLock lock.tryLock(1L, TimeUnit.SECONDS);調用tyrLock其實就是下面的方法&#xff0c;如果說沒有指定鎖的過期時間&#xff0c;可以看到這邊設置為了-1Overridepublic bo…

NVM踩坑實錄:配置了npm的阿里云cdn之后,下載nodejs老版本(如:12.18.4)時,報404異常,下載失敗的問題解決

文章目錄一、情景還原二、分析原因三、解決方案一、情景還原 有個老項目&#xff0c;需要用到 node 的 12.18.4 版本。 小case&#xff0c;我裝了 nvm 的&#xff0c;根本構不成挑戰&#xff0c;敲敲命令就可以了&#xff1a; # 安裝12.18.4版本的nodejs nvm install 12.18.…

優秀案例:基于python django的智能家居銷售數據采集和分析系統設計與實現,使用混合推薦算法和LSTM算法情感分析

1 緒論1.1 研究的背景和意義本文所研究設計的智能家居銷售數據采集與分析系統主要是為了提升數據的采集效率&#xff0c;并且實現及時采集到的線上電商平臺及線下店面的多重渠道銷售數據的采集與分析&#xff0c;精確地進行相關的數據采集并應用先進的數據挖掘算法進行分析挖掘…

【傳感器標定(四):多傳感器融合定位系統中的標定與時間同步方案】

1. 系統框架概述 本方案采用"三層標定框架"&#xff0c;整體架構如下圖所示&#xff1a; #mermaid-svg-WhuG9fzKdHSAzSNh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WhuG9fzKdHSAzSNh .error-icon{f…

PostgreSQL 跨庫查詢方法

問題描述&#xff1a; PostgreSQL 跨庫查詢方法 select rc.tm,fq,fq_old,sccd,unitcd from resource_calc_scene_section_result as rc inner join "mxpt_yushuiqingsrc_databases"."public".st_river_r_hi as st on st.stcd rc.bscd and st.tm rc.tmwher…

畢業論文參考文檔(免費)—DHT11 溫濕度傳感器的硬件與軟件系統設計

畢業論文參考文檔&#xff08;免費&#xff09;—DHT11 溫濕度傳感器的硬件與軟件系統設計第一章 硬件系統設計 1.1 硬件組成與接口設計 DHT11 采用 4 引腳封裝&#xff08;SOP-4&#xff09;&#xff0c;如圖 1-1 所示。核心硬件由三部分構成&#xff1a;電阻式濕度檢測元件、…

壁紙管理 API 文檔

壁紙管理 API 文檔環境&#xff1a;Python 3.9、Flask 2.x、PyMySQL 1.x 運行&#xff1a;python app.py 監聽&#xff1a;http://0.0.0.0:5000通用響應格式 {"code": 200, // 業務碼&#xff1a;200 成功&#xff0c;201 創建成功&#xff0c;400 參數錯誤&am…

常見問題三

在前端開發中&#xff0c;Vue 的數據響應機制、腳本加載策略以及函數式編程技巧是高頻考點和日常開發的核心基礎。本文將圍繞這幾個關鍵點展開詳細解析&#xff0c;幫助開發者深入理解其原理與應用。一、Vue2 與 Vue3 的數據響應原理對比Vue 的核心特性之一是數據響應式—— 當…

清華大學頂刊發表|破解無人機抓取與投遞難題

在城市配送、應急物資投放和倉儲揀選等場景&#xff0c;人們期待無人機能夠獨立完成“取-運-投”全流程。然而主流多旋翼通常采用下掛式夾爪或機械臂&#xff0c;包裹懸在機體下方&#xff0c;帶來重心下移、轉動慣量增加等問題。為突破這一結構瓶頸&#xff0c;清華大學機械工…

【機器學習之推薦算法】基于矩陣分解和損失函數梯度下降的協同過濾算法實現

基于矩陣分解的CF算法實現&#xff08;一&#xff09;&#xff1a;LFM LFM也就是前面提到的Funk SVD矩陣分解 LFM原理解析 LFM(latent factor model) 隱語義模型核心思想是通過隱含特征聯系用戶和物品&#xff0c;如下圖&#xff1a;P矩陣是User-LF矩陣&#xff0c;即用戶和隱含…