PHP 程式語法的基礎教學:一步步帶你深入 PHP 的世界,從基礎語法到進階函數,通過每個章節的簡短範例與註解,幫助打造堅實的開發根基。
Table of Contents
基本語法
PHP 的開始與結束標籤
PHP 腳本以 <?php
開始,並以 ?>
結束。如果一個文件完全由 PHP 編寫,則結束標籤可以省略,這有助於避免在輸出中意外添加空格或換行。
<?php
// 這是 PHP 代碼的開始
echo "Hello, World!";
// 這是 PHP 代碼的結束
?>
如何在網頁中嵌入 PHP 代碼
PHP 代碼可以嵌入 HTML 文件中,以創建動態內容。PHP 代碼可以放置在 HTML 標籤之間。
<!DOCTYPE html>
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php echo "<p>Hello, World!</p>"; ?>
</body>
</html>
基本的輸出命令:echo 與 print
echo
和 print
是 PHP 中的兩個基本輸出命令。echo
是一個語言結構,可以快速輸出一個或多個字符串。print
也是類似的,但它只能輸出一個字符串,並且始終返回 1。
<?php
echo "Hello, ", "World!"; // 輸出多個字符串
print "I'm about to learn PHP!"; // 輸出一個字符串
?>
註釋的正確使用方法
註釋是解釋代碼或防止執行代碼的重要工具。PHP 中有單行註釋和多行註釋。
<?php
// 這是單行註釋
/*
這是多行註釋
可以跨越多行。
*/
?>
變數
變數的宣告與命名規則
在 PHP 中,所有變數都以 $
符號開始,其後是變數的名稱。變數名稱必須以字母或下底線開頭,後面可以跟字母、數字或下底線。
<?php
$varName = "John"; // 正確的變數宣告
$_varName = "Doe"; // 以下劃線開頭的變數宣告
?>
不同類型的變數(整數、浮點數、字串、布林值等)
PHP 支持多種數據類型,包括整數、浮點數(或雙精度數)、字串和布林值。
<?php
$integer = 42; // 整數
$float = 42.24; // 浮點數
$string = "Hello World"; // 字串
$boolean = true; // 布林值
?>
變數的作用域(local、global、static)
變數的作用域決定了在哪裡可以訪問該變數。在 PHP 中,變數可以有局部作用域、全局作用域或靜態作用域。
<?php
$globalVar = "global"; // 全局變數
function testFunction() {
$localVar = "local"; // 局部變數
echo $globalVar; // 這會產生錯誤,因為無法在函數內訪問全局變數
}
testFunction();
?>
預定義的超全局變數
PHP 提供了許多預定義的超全局變數,這些變數在全局範圍內始終可用。
<?php
// 使用 $_GET 超全局變數從 URL 獲取數據
echo "Hi " . $_GET['name'] . "!";
?>
更多超全局變數請參考:Predefined Variables
條件判斷
if、else 與 elseif 的基本使用
if
語句用於根據條件執行代碼。如果條件為真,則執行代碼;else
與 elseif
提供了額外的條件判斷。
<?php
$age = 20;
if ($age >= 18) {
echo "您是成年人。";
} elseif ($age < 18 && $age > 0) {
echo "您是未成年人。";
} else {
echo "無效的年齡。";
}
?>
switch 語句的使用場景
當您需要依據同一變數的值,來區分多個條件時,switch
語句是一個更好的選擇。
<?php
$today = "Monday";
switch ($today) {
case "Monday":
echo "今天是星期一。";
break;
case "Tuesday":
echo "今天是星期二。";
break;
// 其他情況...
default:
echo "查無此日。";
}
?>
比較與邏輯運算符的使用
比較運算符(如 ==
, !=
, >
, <
)用於比較兩個值,而邏輯運算符(如 &&
, ||
, !
)用於組合比較運算符。
<?php
$age = 20;
$hasPermission = true;
if ($age >= 18 && $hasPermission) {
echo "您可以進入。";
} else {
echo "您無法進入。";
}
?>
迴圈
for
for
迴圈是當您知道迴圈應該執行的次數時使用。
<?php
for ($i = 0; $i < 5; $i++) {
echo "迴圈次數: $i ";
}
?>
while
當您不知道迴圈應該執行的次數時,使用 while
迴圈。
<?php
$i = 0;
while ($i < 5) {
echo "迴圈次數: $i ";
$i++;
}
?>
do-while
do-while
迴圈至少執行一次代碼,然後才檢查條件。
<?php
$i = 0;
do {
echo "迴圈次數: $i ";
$i++;
} while ($i < 5);
?>
foreach
foreach
迴圈用於遍歷陣列的元素。
<?php
$colors = ["red", "green", "blue"];
foreach ($colors as $color) {
echo "顏色: $color ";
}
?>
迴圈控制語句(break、continue)
break
用於立即退出迴圈,continue
用於跳過當前迴圈的剩餘代碼並開始下一次迴圈。
<?php
for ($i = 0; $i < 10; $i++) {
if ($i == 3) continue; // 跳過數值 3
if ($i == 8) break; // 當數值達到 8 時退出迴圈
echo "迴圈次數: $i ";
}
?>
陣列
陣列的創建與基本操作(添加、刪除、排序)
陣列是存儲多個值的變數。在 PHP 中,有多種方式可以創建和操作陣列。
<?php
// 創建陣列
$fruits = array("apple", "banana", "cherry");
// 添加元素
$fruits[] = "durian";
// 刪除元素
unset($fruits[1]); // 移除 "banana"
// 排序
sort($fruits); // 升序排序
?>
數值與關聯陣列的區別
數值陣列使用數字作為索引,而關聯陣列使用您指定的 KEY。
<?php
// 數值陣列
$colors = array("red", "green", "blue");
// 關聯陣列
$ages = array("Peter"=>22, "Clark"=>32, "John"=>28);
?>
陣列的遍歷方法
遍歷陣列即是訪問陣列中的每個元素。foreach
是最常用的遍歷方法。
<?php
// 關聯陣列的遍歷
foreach ($ages as $name => $age) {
echo "$name is $age years old.";
}
?>
進階陣列
陣列的內建函數
PHP 提供了許多內建函數來操作陣列。
<?php
// array_filter 用於過濾陣列
$numbers = [1, 2, 3, 4, 5];
$even = array_filter($numbers, function($number) {
return $number % 2 == 0;
});
// array_map 用於對每個元素應用回調函數
$squared = array_map(function($number) {
return $number * $number;
}, $numbers);
?>
陣列的合併、分割與比較
合併陣列可以使用 array_merge
,分割陣列可以使用 array_slice
,比較陣列可以使用 array_diff
和 array_intersect
。
<?php
// 合併陣列
$combined = array_merge($fruits, $colors);
// 分割陣列
$sliced = array_slice($combined, 1, 3);
// 比較陣列
$difference = array_diff($combined, $fruits);
?>
函數
自定義函數的創建與參數
在 PHP 中,自定義函數是一種封裝代碼以便重用的方式。函數可以接受參數,這些參數可以是任何類型的數據。
<?php
// 定義一個函數
function greet($name) {
return "Hello, " . $name . "!";
}
// 調用函數
echo greet("World"); // 輸出: Hello, World!
?>
返回值的類型與作用
函數可以返回值,返回值可以是任何類型,包括數組和對象。
<?php
// 定義一個函數返回數組
function getFruitColors() {
return array('apple' => 'red', 'banana' => 'yellow');
}
// 獲取返回值
$fruitColors = getFruitColors();
echo $fruitColors['apple']; // 輸出: red
?>
匿名函數與閉包(anonymous or closures)
匿名函數,也稱為閉包,允許臨時創建一個沒有指定名稱的函數。
<?php
// 匿名函數
$greet = function($name) {
return "Hello, " . $name . "!";
};
// 調用匿名函數
echo $greet("PHP"); // 輸出: Hello, PHP!
?>
進階函數
引用傳遞與值傳遞的差異
在 PHP 中,默認情況下函數參數是通過值傳遞的。如果希望通過引用傳遞,可以在參數前加上 &
符號。
<?php
// 通過引用傳遞
function addExclamation(&$string) {
$string .= "!";
}
$str = "Hello";
addExclamation($str);
echo $str; // 輸出: Hello!
?>
可變參數函數的使用
可變參數函數允許接受任意數量的參數。
<?php
// 可變參數函數
function sum(...$numbers) {
return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 輸出: 10
?>
類型聲明與嚴格模式的使用
類型聲明允許函數指定參數和返回值的類型。自 PHP 7 起,可以啟用嚴格模式。
<?php
// 啟用嚴格模式
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
echo add(5, "5"); // 類型錯誤
?>
預設狀況下不會有錯誤,因為啟用了嚴格模式,數字 5 和字串 “5” 是不同的。
生成器(generators)的使用
生成器提供了一種簡單的方式來實現迭代器,允許你通過 yield
關鍵字來生成一系列的值。
<?php
// 使用生成器
function getNumbers() {
for ($i = 0; $i < 5; ++$i) {
yield $i;
}
}
foreach (getNumbers() as $number) {
echo $number . PHP_EOL; // 輸出: 0 1 2 3 4
}
?>
最後
在學習了 PHP 的基礎知識後,您已經具備了開始建立網頁應用程式的能力。但是,程式設計和網頁開發是一個不斷進步的領域,有許多進階主題和相關技術等待您的探索。
以下是一些您可以繼續學習的方向:
物件導向程式設計(OOP)
深入了解類別、物件、繼承、多態性和封裝等概念,這些都是物件導向程式設計的核心。透過OOP,您可以寫出更模組化、可重用和易於維護的代碼。
設計模式
設計模式是前人的心血結晶,實作經由驗證過的解決方案,解決特定問題領域。這些模式提供了一個重用軟件設計的方法,可以在許多不同情境中使用,而不必每次都重新發明輪子。
PHP 框架
學習如 Laravel、Symfony 或 CodeIgniter 等流行的PHP框架。這些框架提供了許多功能,如路由、模板引擎、ORM、安全性和緩存,可以幫助您更快速、更高效地開發複雜的應用程式。
資料庫
除了MySQL,您可以探索其他類型的資料庫,如 PostgreSQL、MongoDB 或 Redis。了解如何設計資料庫、執行複雜查詢和優化資料存取效能。
安全性
網站安全是一個廣泛且複雜的主題,包括了解如何防範 SQL 注入、跨站腳本(XSS)、跨站請求偽造(CSRF)和其他安全漏洞。
API 開發
學習如何創建和使用 Web API,包括 REST 和 GraphQL。了解如何設計良好的 API 介面,以及如何使用OAuth 等方式來保護您的 API 和資料。
測試和維護
學習自動化測試,包括單元測試、功能測試和集成測試,以確保您的代碼品質。了解如何使用版本控制系統,如 Git,來管理代碼變更和協作。
性能優化
探索如何優化 PHP 代碼的性能,包括使用 OPcache、瞭解資料庫索引、緩存策略和代碼剖析。
現代前端技術
PHP 通常用於後端開發,但了解前端技術如 HTML、CSS、JavaScript 及框架如 React 或 Vue.js,將使您成為一名全端開發者。
透過不斷學習和實踐,將能夠擴展更多技能,並在網頁開發的世界中保持競爭力。
更多參考教學:PHP Language Reference