由于之前沒系統的學習PHP語言,都是在做題時遇到不會的才去查,后來發現這樣的效率非常低,審代碼別人一眼掃出漏洞,而我還需要去查一下這行代碼的意思,那個函數的作用,查當然要查,但連簡單的語法都不懂就太說不過去了,有時候甚至直接將一整段代碼扔給AI讓它解讀,這樣對代碼審計的能力根本不能提升
所以我這次決定系統的學習一次PHP語言,為了在后續的解題過程中不用總依賴AI也可以很快審清代碼邏輯。
PHP語言的功能非常強大,在Web開發中也占據著非常重要的地位,這些都懂,就不詳細舉例,直接開始著手對PHP語言進行學習。
1、PHP語言的基本結構
PHP腳本通常以 <?php 開始,以 ?> 結束,這些標簽告訴 PHP 解釋器,其中的內容是 PHP 代碼。
<?php
// PHP 代碼
?>
2、輸出內容
使用 echo 或 print 語句輸出內容
<?php
echo "Hello, World!";
print "Hello, World!";
?>
3、變量
變量以 $ 開頭,變量名區分大小寫
<?php
$variable = "Hello, World!";
echo $variable;
?>
說到變量就不得不提全局變量了
全局變量
超全局變量(Superglobals)是PHP中內置的特殊變量,它們在腳本的任何作用域(全局、函數、類方法等)中都可以直接訪問,無需使用 global?關鍵字聲明。這些變量由PHP預定義,用于收集來自不同來源的數據。
完整的PHP超全局變量列表:
超全局變量 | 作用 |
---|---|
$_GET | 獲取 URL 查詢字符串(?key=value)傳遞的參數 |
$_POST | 獲取 HTTP POST 請求提交的表單數據 |
$_REQUEST | 包含 $_GET、$_POST 安全風險) |
$_SERVER | 包含服務器和執行環境信息(如 IP、User-Agent、請求方法等) |
$_SESSION | 存儲會話數據(需先 session_start()?) |
$_COOKIE | 獲取客戶端發送的 HTTP Cookies |
$_FILES | 獲取上傳文件的信息(如$_FILES['file']['name']) |
$_ENV | 獲取系統環境變量(如 $_ENV['PATH']?) |
$GLOBALS | 引用全局作用域中的所有變量(如$GLOBALS['var']?) |
超全局變量 VS 普通變量
特性 | 超全局變量 | 普通全局變量 |
---|---|---|
作用域 | 全局(自動生效) | 需 global?聲明 |
命名前綴 | $_(如 $_GET?) | 自定義(如 $count?) |
用途 | 請求數據、服務器信息等 | 一般程序邏輯變量 |
是否可自定義 | 否(PHP預定義) | 是 |
4、數組
數組數組是存儲多個值的變量。?
5、常用符號
{}
大括號 {} 主要用于控制代碼塊的范圍和作用域 ,確保代碼的結構清晰和邏輯準確。
.
. 在PHP中用于連接字符串
//
注釋符用于在代碼中添加說明性文字,這些文字不會被執行。PHP 支持多種注釋方式,包括單行注釋和多行注釋
PHP中注釋符比較廣泛,例如 # 和? /* */ 都可以作為注釋符
例如
<?php? //這是一個單行注釋
? ? ? ?#這也是一個單行注釋? ? ? ?/*
? ? ? ?這是一個多行注釋
? ? ? ?可以包含多行內容
? ? ? ?不會被執行
? ? ? ?*/echo "Hello, World!";
?>
=>
=> 是用于鍵值對的語法,通常在數組定義中使用,表示鍵和值之間的映射關系。
這個有點抽象,例如:
<?php
$person = array(
? ? "name" => "China", //"name" => "China" 是鍵值對, name 是鍵(key),China 是值(value)
? ? "age" => 76,
? ? "city" => "Beijing"
);echo $person["name"]; // 輸出: China
echo $person["age"];? // 輸出: 76
echo $person["city"]; // 輸出: Beijing
?>
?[ ]
在PHP中,中括號 [ ]?有多種用途,主要用于數組操作(數組定義、訪問、修改)和字符串操作(訪問、修改字符串)
中括號 [ ] 也可以用于 列表解構?(特別是在 foreach 循環中處理多維數組或鍵值對)
列表解構
<?php
//定義一個二維數組
$array = [
? ? ["apple", "banana"],
? ? ["cherry", "orange"]? //包含兩個子數組的二維數組,每個子數組包含兩個水果名稱字符串
];
//使用foreach循環結合數組解構遍歷
foreach ($array as [[$fruit1, $fruit2]]) {? //當前子數組的元素會被自動解構賦值到變量 $fruit1 和 $fruit2? 第一次循環 $fruit1="apple" $fruit2="banana" 第二次循環 $fruit1="cherry" $fruit2="orange"
? ? echo $fruit1 . " " . $fruit2 . "\n";? ? //輸出 第一個數組與空格拼接后再與輸出的第二個數組拼接再換行 的值
}
// 輸出:
// apple banana
// cherry orange
?>
鍵值對解構
<?php
//定義一個關聯數組,包含3個元素:名字、年齡、城市
$array = [
? ? "name" => "China",
? ? "age" => 76,
? ? "city" => "Beijing"
];
//使用foreach循環遍歷數組 array()
foreach ($array as $key => $value) {? //$array as $key 表示每次循環中當前元素的鍵會賦值給 $key ,值會賦值給 $value。
? ? echo $key . ": " . $value . "\n";? 將鍵、冒號、值 連接起來輸出
}
// 輸出:
// name: China
// age: 76
// city: Beijing?>
6、數據類型
PHP?支持多種數據類型,包括字符串、整數、浮點數、布爾值、數組和對象
<?php
$string = "Hello, World!";? ? ? ? ? ? ? ? //字符串
$integer = 123;? ? ? ? ? ? ? ? ? ? ? ? ? ?//整數
$float = 123.45;? ? ? ? ? ? ? ? ? ? ? ? ? //浮點數
$boolean = true;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//布爾值
$array = array("apple", "banana", "cherry"); //數組
$object = new stdClass();? ? ? ? ? ? ? ? ? ? //對象? ?stdClass是 PHP 的一個內置類,它是一個空的類,沒有任何屬性和方法。它通常用于創建一個通用的對象。
$object->name = "John";? ? ? ? ? ? ? ? ? ? ? //表示訪問 $object 對象的 name 屬性,name 是一個屬性名,它在 $object 對象中被動態創建;將字符串 John 賦值給 name 屬性。
?>
7、控制結構
條件語句
if 條件語句(最簡單)
<?php $age = 18; //這里的年齡為了簡單就直接賦值,而通常條件判斷中需要獲取用戶輸入if ($age >= 18) {echo "您已成年,可以進入。"; } ?>
?if else 語句
<?php $age = 18; if ($age >= 18) {echo "您已成年,可以進入。"; } else {echo "您未成年,禁止進入!"; } ?>
?if - elseif - else 多重結構
<?php $grade = 85;if ($grade >= 90) {echo "優秀!"; } elseif ($grade >= 80) {echo "良好!"; } elseif ($grade >= 60) {echo "及格!"; } else {echo "不及格!"; } ?>
三元運算符?
<?php $isMember = true; //創建一個名為 $isMember 的布爾型變量,并將值 ture 賦值給它,ture 表示 "是會員",如果改為 false 則表示 "不是會員"。 $message = $isMember ? "歡迎會員!" : "請注冊成為會員!"; //檢查 $isMember 的值,如果為 ture 則選擇 ? 后面的第一個值("歡迎會員!");如果為 false 則選擇 : 后面的第二個值 ("請注冊成為會員!") echo $message; ?>
switch語句
<?php $day = "Monday";switch ($day) {case "Monday":echo "今天是星期一";break;case "Tuesday":echo "今天是星期二";break;case "Wednesday":echo "今天是星期三";break;default:echo "今天是周末或其他日子"; } ?>
空值合并運算符(??)?
但這個有 PHP7.0版本 + 引入的特性 的要求,作用是檢查左側值是否存在且不為null (空值),如果是則返回左側值,否則返回右側值
<?php $username = $_GET['user'] ?? '訪客'; echo "歡迎," . $username; ?>
循環語句
for循環
<?php // 打印1到5的數字 for ($i = 1; $i <= 5; $i++) {echo $i . " "; } // 輸出: 1 2 3 4 5 ?>
while循環
<?php // 打印1到5的數字 $i = 1; while ($i <= 5) {echo $i . " ";$i++; } // 輸出: 1 2 3 4 5 ?>
do - while 循環?
<?php // 至少執行一次,打印1到5的數字 $i = 1; do {echo $i . " ";$i++; } while ($i <= 5); // 輸出: 1 2 3 4 5 ?>
foreach 循環(遍歷數組)?
<?php // 遍歷數組 $colors = ["紅色", "綠色", "藍色"];foreach ($colors as $color) {echo $color . " "; } // 輸出: 紅色 綠色 藍色// 帶鍵名的遍歷 $age = ["小明" => 18, "小紅" => 20];foreach ($age as $name => $value) {echo "$name 的年齡是 $value 歲<br>"; } /* 輸出: 小明的年齡是18歲 小紅的年齡是20歲 */ ?>
循環控制語句
<?php // break 示例 for ($i = 1; $i <= 10; $i++) {if ($i == 5) {break; // 當$i等于5時退出循環}echo $i . " "; } // 輸出: 1 2 3 4// continue 示例 for ($i = 1; $i <= 5; $i++) {if ($i == 3) {continue; // 跳過當前迭代}echo $i . " "; } // 輸出: 1 2 4 5 ?>
嵌套循環
<?php // 打印乘法表 for ($i = 1; $i <= 9; $i++) {for ($j = 1; $j <= $i; $j++) {echo "$j × $i = " . ($i * $j) . " ";}echo "<br>"; } ?>
8、函數
PHP函數是一段可重復執行的代碼塊。
<?php
function sayHello($name) {? ?//定義一個函數
? ? echo "Hello, " . $name . "!";
}
sayHello("John");? ?//調用函數
?>
9、文件操作
讀取和寫入文件
// 寫入文件(如果文件不存在會自動創建) $file = 'example.txt'; $content = "這是要寫入文件的內容\n第二行內容";// 寫入文件 file_put_contents($file, $content);echo "內容已寫入文件";
$file = 'example.txt';// 讀取整個文件內容 $content = file_get_contents($file); echo "文件內容:<br>" . nl2br($content); // nl2br() 將換行符轉為HTML的<br>// 或者逐行讀取 $lines = file($file); echo "<br><br>逐行讀取:"; foreach($lines as $line) {echo "<br>" . htmlspecialchars($line); }
10、表單處理
處理HTML表單提交的數據
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
? ? $name = htmlspecialchars($_POST["name"]);
? ? echo "Hello, " . $name . "!";
}
?><!DOCTYPE html>
<html lang="en">
<head>
? ? <meta charset="UTF-8">
? ? <title>Simple PHP App</title>
</head>
<body>
? ? <form method="post">
? ? ? ? <label for="name">Name:</label>
? ? ? ? <input type="text" id="name" name="name">
? ? ? ? <input type="submit" value="Submit">
? ? </form>
</body>
</html>
11、錯誤處理
處理錯誤和異常
<?php
if (!file_exists("example.txt")) {
? ? die("File not found");
}try {
? ? $content = file_get_contents("example.txt");
? ? echo $content;
} catch (Exception $e) {
? ? echo "Error: " . $e->getMessage();
}
?>
12、會話管理
使用會話管理用戶狀態
<?php
session_start();
if (!isset($_SESSION['count'])) {
? ? $_SESSION['count'] = 0;
}
$_SESSION['count']++;
echo "You have visited this page " . $_SESSION['count'] . " times.";
?>
13、日期和時間
處理日期和時間
<?php
echo date("Y-m-d H:i:s"); //Y
- 4位數的年份(如 2023,m
- 2位數的月份(01 到 12,d
- 2位數的日期(01 到 31,H
- 24小時制的小時(00 到 23),i
- 分鐘(00 到 59),s
- 秒(00 到 59)
?>
14、正則表達式
使用正則表達式進行字符串匹配和替換.
<?php
// 要驗證的電子郵件地址
$email = "example@test.com";// 正則表達式模式
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';// 使用preg_match函數進行匹配
if (preg_match($pattern, $email)) {
? ? echo "電子郵件地址 $email 是有效的。";
} else {
? ? echo "電子郵件地址 $email 是無效的。";
}
?>
15、PHP語言的實戰學習及運用
對于學習PHP語言,更多的都是選擇 VScode 這個程序,VScode 中文官網:vscode中文網 下載 Visual Studio Code
下載安裝好后進行漢化
VScode 使用 g++ 編譯 .c文件 或 .cpp文件 :
進行 g++ 的配置
g++ 也叫GCC,在Windows 中,使用MinGW方式實現 g++(分32和64位)
下載配置 g++?
網盤地址:通過網盤分享的文件:x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0.7z
鏈接: https://pan.baidu.com/s/1OrfIbrLm58TKlv2dTsnBLQ?pwd=ydby 提取碼: ydby
下載后解壓到當前文件夾
接下來需要把 g++ 的 bin 路徑添加到系統環境變量的 Path 里:
打開菜單欄的設置,找到系統環境變量?
進入環境變量的系統環境變量的Path路徑
編輯添加 g++ 的 bin 路徑
添加?
然后確定
驗證 g++
g++ -v
可以看到 g++ 的版本號,說明 g++ 環境配置成功
在桌面新建一個 code 文件夾
然后回到 VScode ,打開剛剛的新建文件夾,選擇信任父級文件夾
點擊第二個加號新建文件名為 .vscode(注意必須是這個名字)
然后分別再新建 四個文件,文件名分別為:
c_cpp_properties.json launch.json settings.json tasks.json
然后分別為四個文件添加內容
c_cpp_properties.json :
{"configurations": [{"name": "Win64","includePath": ["${workspaceFolder}/**"],"defines": ["_DEBUG", "UNICODE", "_UNICODE"],"windowsSdkVersion": "10.0.18362.0","compilerPath": "D:\VScode\MinGW-W64 GCC\mingw64\bin\g++.exe","cStandard": "c17","cppStandard": "c++17","intelliSenseMode": "gcc-x64"}],"version": 4
}
但是要注意把?
compilerPath 替換為剛剛配置的 g++ 路徑
launch.json :
{"version": "0.2.0","configurations": [{"name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false,"cwd": "${workspaceRoot}","environment": [],"externalConsole": true, "MIMode": "gdb","miDebuggerPath": "D:\VScode\MinGW-W64 GCC\mingw64\bin\g++.exe","preLaunchTask": "g++","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}]}]
}
miDebuggerPath? 路徑也要替換為 g++ 配置路徑
settings.json :
{"files.associations": {"*.py": "python","iostream": "cpp","*.tcc": "cpp","string": "cpp","unordered_map": "cpp","vector": "cpp","ostream": "cpp","new": "cpp","typeinfo": "cpp","deque": "cpp","initializer_list": "cpp","iosfwd": "cpp","fstream": "cpp","sstream": "cpp","map": "c","stdio.h": "c","algorithm": "cpp","atomic": "cpp","bit": "cpp","cctype": "cpp","clocale": "cpp","cmath": "cpp","compare": "cpp","concepts": "cpp","cstddef": "cpp","cstdint": "cpp","cstdio": "cpp","cstdlib": "cpp","cstring": "cpp","ctime": "cpp","cwchar": "cpp","exception": "cpp","ios": "cpp","istream": "cpp","iterator": "cpp","limits": "cpp","memory": "cpp","random": "cpp","set": "cpp","stack": "cpp","stdexcept": "cpp","streambuf": "cpp","system_error": "cpp","tuple": "cpp","type_traits": "cpp","utility": "cpp","xfacet": "cpp","xiosbase": "cpp","xlocale": "cpp","xlocinfo": "cpp","xlocnum": "cpp","xmemory": "cpp","xstddef": "cpp","xstring": "cpp","xtr1common": "cpp","xtree": "cpp","xutility": "cpp","stdlib.h": "c","string.h": "c"},"editor.suggest.snippetsPreventQuickSuggestions": false,"aiXcoder.showTrayIcon": true
}
tasks.json :
{"version": "2.0.0","tasks": [{"label": "g++","command": "g++","args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.exe"],"problemMatcher": {"owner": "cpp","fileLocation": ["relative", "${workspaceRoot}"],"pattern": {"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$","file": 1,"line": 2,"column": 3,"severity": 4,"message": 5}},"group": {"kind": "build","isDefault": true}}]
}
保存四個文件后就配置完成了。(以后的C/C++代碼文件必須放在這個code文件夾里,或者有 .vscode 文件夾的文件夾里面,否則放其他文件夾會報錯)