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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/83692.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/83692.shtml
英文地址,请注明出处:http://en.pswp.cn/web/83692.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode2-两数相加

leetcode 2 思路 链表特性利用&#xff1a;由于数字按逆序存储&#xff0c;个位在链表头部&#xff0c;因此可以直接从前往后遍历链表进行逐位相加 比如题目中的 2->4->3 和 5->6->4 其实可以直接按位从第一位开始往后相加&#xff0c;就得到啦708 这样比把数字…

Java的Arrays.sort():排序算法与优化分析

文章目录 前言一、基本类型数组&#xff1a;双轴快速排序关键优化策略 二、对象数组&#xff1a;TimSort关键优化策略 三、性能对比总结总结 前言 在Java中&#xff0c;Arrays.sort()是开发者最常用的排序方法之一。但你是否思考过它的底层实现&#xff1f;本文将基于OpenJDK …

软件测试质量的“防”与“治”

引言: 想象一下,你正在建造一座摩天大楼。你是愿意在打地基时就严格检查材料规格和设计图纸(主动防患),还是等到大楼封顶后才开始拿着锤子敲敲打打找裂缝(被动补救)?软件世界亦是如此!今天,我们就来聊聊软件测试这个“质量守护神”的两大战略思维和三大实战招式,让你…

TDengine 如何从 2.x 迁移到 3.0

本节讲述如何通过 Explorer 界面创建数据迁移任务&#xff0c;从旧版 TDengine2 迁移数据到 TDengine 3.0 集群。 功能概述 taosX 通过 SQL 查询源集群数据&#xff0c;并把查询结果写入到目标数据库。具体实现上&#xff0c;taosX 以一个子表的一个时间段的数据作为查询的基…

免下载苹果 IPA 文件重签名工具:快速更换应用名称和 BID的教程

在iOS设备的使用和开发过程中&#xff0c;我们有时需要对IPA文件进行重签名&#xff0c;以便更换应用名称、Bundle ID&#xff08;软件包标识符&#xff09;或其他相关信息。这一过程通常需要使用到特定的工具&#xff0c;然而&#xff0c;市面上的一些工具可能需要下载和安装&…

Python全栈开发:前后端分离项目架构详解

文章目录 技术栈选择后端技术栈前端技术栈 项目整体结构详细目录结构说明后端架构&#xff08;backend/&#xff09;1. 应用核心&#xff08;app/&#xff09;2. 数据层&#xff08;models/&#xff09;3. API模式层&#xff08;schemas/&#xff09;4. API路由层&#xff08;a…

微信小程序使用图片实现红包雨功能

微信小程序红包雨功能实现&#xff1a;从组件封装到页面调用的完整实践 先看示例截图&#xff1a; 一、背景与技术选型 在微信小程序营销活动中&#xff0c;红包雨是一种极具吸引力的互动形式。实现红包雨效果主要有 Canvas 和图片两种方案&#xff1a; &#xff08;1&…

Python day31

浙大疏锦行 数据拆分的基本框架&#xff0c;拆分后让项目结构更加清晰

Chapter10-XXE

文章目录 1.XXE介绍1.1 XXE产生的原因1.1.1 什么是XML&#xff1f;1.1.2 什么是XML实体1.1.3 什么是文档类型定义&#xff08;document type definition&#xff09;1.1.4 什么是XML自定义实体1.1.5 什么是XML外部实体 2.XXE攻击类型2.1 利用XXE检索文件2.2 利用XXE执行SSRF攻击…

Ribbon负载均衡实战指南:7种策略选择与生产避坑

引言&#xff1a;客户端负载均衡的不可替代性 当面试官问你&#xff1a;“Ribbon 和 Nginx 有什么区别&#xff1f;”——Ribbon 是进程内 LB 这一句话值 20K 月薪。 作为微服务调用的核心枢纽&#xff0c;Ribbon 通过 ​​本地服务清单动态分发请求​​&#xff0c;避免中心化…

Webpack:现代前端构建工具的核心解析

Hi&#xff0c;我是布兰妮甜 &#xff01;在前端工程化日益重要的今天&#xff0c;Webpack作为主流构建工具&#xff0c;已成为现代前端开发的核心基础设施。它通过模块化打包机制&#xff0c;优雅地解决了复杂应用中的资源管理问题&#xff0c;使开发者能够专注于业务逻辑的实…

Elasticsearch索引wildcard查询

在之前的文章 Elasticsearch索引的字段映射 中介绍过关于索引中字段查询的多种方式。可以根据需要通过设置索引字段的type以及fields来实现分词,精确匹配等多种方式的查询。 elasticSearch中检索核心类型大概可以分为:精准匹配检索(Term-level queries)和基于分词的全文匹…

1.3、SDH光接口类型

接口类型的命名遵循一个特定的代码结构&#xff0c;格式通常为&#xff1a;应用代码-速率等级.波长/距离代码。 代码的第一位字母表示应用场合&#xff1a;I 表示局内通信&#xff1b;S 表示短距离局间通信&#xff1b;L 表示长距离局间通信。字母横杠后的第一位表示 STM 的速率…

浅析MySQL数据迁移与恢复:从SQLServer转型到MySQL

文章目录 前言一、MySQL与SQLServer数据管理方式对比1.1 文件结构差异&#xff1a;1.2 存储引擎多样性&#xff1a;1.3 备份恢复方式&#xff1a; 二、MySQL数据迁移方法与技术2.1 逻辑备份与恢复2.2 物理备份与恢复2.3 异构数据库迁移(从SQLServer到MySQL) 三、MySQL数据恢复策…

HarmonyOS 5中UniApp的调试步骤

在 HarmonyOS 5 中调试 UniApp 应用的完整步骤如下&#xff0c;涵盖环境配置、设备连接及调试方法&#xff1a; 一、环境准备 ‌开发工具‌ 安装 HBuilderX 4.64&#xff08;需启用鸿蒙插件&#xff09;可选安装 DevEco Studio 5.0.3&#xff08;用于真机调试&#xff09;配置 …

使用centos服务器和Let‘s Encypted配置SpingBoot项目的https证书

一、Centos安装Certbot客户端 yum install certbot 二、生成证书 certbot certonly --standalone -d 你的域名 执行该命令后会生成如下文件 privkey.pem : the private key for your certificate. fullchain.pem: the certificate file used in most server software. c…

AWS Well-Architected Framework详解

一、六大支柱&#xff08;Well-Architected Framework&#xff09; AWS Well-Architected Framework 的实际操作可以通过其五大支柱&#xff08;或六大支柱&#xff0c;包括可持续性&#xff09;的具体实践来证明。以下是每个支柱对应的实际操作示例&#xff1a; 卓越运营&am…

【特征工程】机器学习的特征构造和筛选

调研论文中&#xff0c;看到datafun的一篇agent文章“智能不够&#xff0c;知识来凑”——知识驱动的金融决策智能体&#xff0c;里面提到了自动因子挖掘&#xff0c;感觉可以用来做机器学习的“特征工程”。 第一部分介绍如何“构造特征”&#xff0c;第二部分介绍如何“分析…

第21节 Node.js 多进程

Node.js本身是以单线程的模式运行的&#xff0c;但它使用的是事件驱动来处理并发&#xff0c;这样有助于我们在多核 cpu 的系统上创建多个子进程&#xff0c;从而提高性能。 每个子进程总是带有三个流对象&#xff1a;child.stdin, child.stdout和child.stderr。他们可能会共享…

【走进Golang】测试SDK环境搭建成功,配置path环境变量

[1]进入控制命令台&#xff1a;win R -->cmd [2]证明SDK环境成功 1.此电脑 2.高级系统设置 3.环境变量 4.点击环境变量&#xff0c;进入找到 path&#xff0c;点击编辑 5.进入编辑,找到对应目录&#xff0c;配置成功 添加完成后&#xff0c;点击确定&#xff0c;确定&#…