系统学习·PHP语言
由于之前没系统的学习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 文件夹的文件夹里面,否则放其他文件夹会报错)