当前位置: 首页 > news >正文

系统学习·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 和 $_COOKIE 的数据(直接使用有一定的

安全风险)

$_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 文件夹的文件夹里面,否则放其他文件夹会报错)

相关文章:

  • JVM(1)——运行时数据区
  • Java求职者面试题解析:Spring、Spring Boot、MyBatis框架与源码原理
  • JasperReport生成PDF/A类型文档
  • Docker run 子命令与运行优化相关的参数
  • 【CSS-13】CSS 网页布局三大机制详解:普通流、浮动与定位
  • 采用微服务的预期收益是什么?我们如何衡量成功?
  • MapReduce技术详解
  • Python Day51
  • Go语言---闭包
  • BeckHoff <---> Keyence (LJ-8000) 2D相机 Profinet 通讯
  • C#里与嵌入式系统W5500网络通讯(7)
  • SNMP中BER编码解析
  • JavaScript性能优化实战指南:从理论到案例的全面解析
  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,
  • CQF预备知识:Python相关库 -- 核密度估计 scipy.stats
  • 关于cv::solvePnP算法的理解
  • R语言文本探索与预处理:入门指南
  • iOS 审核 cocos 4.3a【苹果机审的“分层阈值”设计】
  • 【Tip】工具网站
  • Python爬虫-爬取票牛明星演唱会数据,进行数据分析
  • 网站 被攻击_主业篡改 被黑了 织梦做的站/百度自动优化
  • 平台推广员是干嘛的/账号seo是什么
  • 做理财网站需要办理icp证吗/网站制作免费
  • 网站样式模板/网站设计模板网站
  • 国内景观设计公司前十名/seo查询友情链接
  • 那个平台的网页游戏好玩/baiduseoguide