CleanMyMac

PHP 程式語法基礎教學,從簡短範例學習 PHP 的核心概念

Feature image for PHP 程式語法基礎教學,從簡短範例學習 PHP 的核心概念

PHP 程式語法的基礎教學:一步步帶你深入 PHP 的世界,從基礎語法到進階函數,通過每個章節的簡短範例與註解,幫助打造堅實的開發根基。

為什麼要學習 PHP?

PHP 是一種廣泛使用的伺服器端腳本語言,特別適合網頁開發。它易於學習,功能強大,並且有豐富的社群支援。無論你是想要建立動態網站、開發 Web 應用程式,還是想要進入後端開發領域,PHP 都是一個很好的起點。

基本語法

PHP 的開始與結束標籤

PHP 腳本以 <?php 開始,並以 ?> 結束。如果一個文件完全由 PHP 編寫,則結束標籤可以省略,這有助於避免在輸出中意外添加空格或換行。

最佳實踐:

在純 PHP 檔案中,建議省略結束標籤 ?>,這樣可以避免在檔案末尾意外輸出空白字元,這些空白字元可能會導致 header 已經發送後無法修改的問題。

<?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

echoprint 是 PHP 中的兩個基本輸出命令。echo 是一個語言結構,可以快速輸出一個或多個字符串。print 也是類似的,但它只能輸出一個字符串,並且始終返回 1。

兩者的差異:

  • echo 可以輸出多個字符串,執行速度稍快
  • print 只能輸出一個字符串,但可以作為表達式使用(因為它會返回值)

在實際開發中,echo 更常被使用,因為它更靈活且執行效率較高。

<?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 中,變數可以有局部作用域、全局作用域或靜態作用域。

作用域說明:

  • 局部變數(Local):在函數內部宣告的變數,只能在該函數內部使用
  • 全局變數(Global):在函數外部宣告的變數,可以在函數外部使用,但在函數內部需要使用 global 關鍵字才能訪問
  • 靜態變數(Static):在函數內部使用 static 關鍵字宣告的變數,其值在函數調用之間會保留
<?php
$globalVar = "global"; // 全局變數

function testFunction() {
  global $globalVar; // 在函數內訪問全局變數需要使用 global 關鍵字
  $localVar = "local"; // 局部變數
  echo $globalVar; // 現在可以正常訪問全局變數
}

testFunction();
?>

預定義的超全局變數

PHP 提供了許多預定義的超全局變數,這些變數在全局範圍內始終可用,不需要使用 global 關鍵字就可以在任何地方訪問。

常用的超全局變數:

  • $_GET:從 URL 參數獲取數據
  • $_POST:從表單 POST 請求獲取數據
  • $_SESSION:存儲會話數據
  • $_COOKIE:獲取 Cookie 數據
  • $_SERVER:包含伺服器和執行環境的資訊
<?php
// 使用 $_GET 超全局變數從 URL 獲取數據
// 例如:http://example.com/index.php?name=John
if (isset($_GET['name'])) {
    echo "Hi " . $_GET['name'] . "!";
}
?>

安全提醒:

使用超全局變數時,務必進行資料驗證和過濾,以防止安全漏洞(如 XSS 攻擊)。可以使用 htmlspecialchars()filter_input() 函數來處理輸入資料。

更多超全局變數請參考:Predefined Variables

條件判斷

if、else 與 elseif 的基本使用

if 語句用於根據條件執行代碼。如果條件為真,則執行代碼;elseelseif 提供了額外的條件判斷。

<?php
$age = 20;

if ($age >= 18) {
    echo "您是成年人。";
} elseif ($age < 18 && $age > 0) {
    echo "您是未成年人。";
} else {
    echo "無效的年齡。";
}
?>

switch 語句的使用場景

當您需要依據同一變數的值,來區分多個條件時,switch 語句是一個更好的選擇。它比多個 if-elseif 語句更清晰、更容易維護。

使用 switch 的優點:

  • 程式碼更簡潔易讀
  • 執行效率通常比多個 if-elseif 更高
  • 更容易維護和擴展
<?php
$today = "Monday";

switch ($today) {
    case "Monday":
        echo "今天是星期一。";
        break;
    case "Tuesday":
        echo "今天是星期二。";
        break;
    // 其他情況...
    default:
        echo "查無此日。";
}
?>

比較與邏輯運算符的使用

比較運算符(如 ==, !=, >, <)用於比較兩個值,而邏輯運算符(如 &&, ||, !)用於組合比較運算符。

重要的比較運算符:

  • ==:相等(只比較值,不比較類型)
  • ===:全等(比較值和類型)
  • !=<>:不等於
  • !==:不全等

建議:

在 PHP 中,建議使用 ===!== 進行嚴格比較,這樣可以避免類型轉換帶來的意外結果。

<?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); // 升序排序
?>

數值與關聯陣列的區別

數值陣列使用數字作為索引(從 0 開始),而關聯陣列使用您指定的 KEY(可以是字串)。

選擇建議:

  • 使用數值陣列:當你需要按順序存儲數據,且不需要特定的鍵名時
  • 使用關聯陣列:當你需要用有意義的鍵名來存取數據時(例如:用戶 ID、產品名稱等)
<?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_diffarray_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)

匿名函數,也稱為閉包,允許臨時創建一個沒有指定名稱的函數。閉包可以捕獲外部變數,這使得它們非常適合用於回調函數和高階函數。

使用場景:

  • 作為回調函數傳遞給其他函數
  • 在陣列操作中使用(如 array_maparray_filter
  • 創建事件處理器
<?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"); // 類型錯誤
?>

嚴格模式的重要性:

預設狀況下,PHP 會進行類型轉換,所以 add(5, "5") 不會有錯誤。但啟用了嚴格模式(declare(strict_types=1);)後,數字 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,將使您成為一名全端開發者。

持續學習的重要性:

透過不斷學習和實踐,將能夠擴展更多技能,並在網頁開發的世界中保持競爭力。記住,程式設計是一個需要持續學習的領域,技術不斷更新,保持學習的熱忱和好奇心是成功的關鍵。

實作建議:

學習程式設計最好的方式就是動手實作。建議你:

  1. 從簡單的專案開始,逐步增加複雜度
  2. 閱讀其他人的程式碼,學習最佳實踐
  3. 參與開源專案,與其他開發者交流
  4. 建立自己的專案作品集

更多參考教學:PHP Language Reference