4.3.2_WEB——WEB后端语言——PHP

前言:本文是对PHP语言的环境搭建,基本语法,构成要素等做了详细介绍。

一.概述

PHP(HyperText Preprocessor):超文本预处理器。

PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,尤其适用于Web开发。PHP可以嵌入到HTML中,并与多种数据库集成,最常用的是MySQL。其灵活性、易学性和强大的社区支持使得PHP成为开发动态网页和Web应用程序的首选语言之一。PHP代码在服务器上执行,生成的HTML发送到客户端,从而实现网页的动态交互。

二.功能特点

  • 服务器端脚本执行

PHP主要用于服务器端脚本执行,可以生成动态网页内容。服务器在处理请求时执行 PHP 代码,将结果发送到客户端浏览器。

  • 数据库集成

PHP 支持与多种数据库的集成,如 MySQL、PostgreSQL、SQLite 等,提供了丰富的数据库操作函数和 PDO(PHP Data Objects)接口,便于开发者进行数据库操作。

  • 跨平台兼容

PHP 是跨平台的,能够在多种操作系统上运行,如 Linux、Windows、macOS 和 Unix。这使得 PHP 程序具有高度的移植性。

  • 丰富的内置函数库

PHP 拥有大量内置函数库,涵盖字符串处理、数组处理、文件操作、网络通信、加密解密等常见功能,极大地方便了开发者的编程工作。

  • 面向对象编程(OOP)

PHP 从 PHP 5 开始支持面向对象编程,提供了类和对象的支持,具备继承、多态和封装等特性。OOP 的支持使得 PHP 适合开发大型和复杂的应用程序。

  • 支持多种协议

PHP 支持 HTTP、HTTPS、FTP、IMAP、POP3 和 SMTP 等多种网络协议,使得它可以处理多种网络通信任务。

  • 扩展性强

PHP 拥有丰富的扩展库,开发者可以通过 PECL(PHP Extension Community Library)安装和使用各种扩展功能。此外,开发者还可以使用 C 语言编写自定义扩展。

三.工作流程

1:网页服务器接收请求

当用户在浏览器中输入url时,浏览器会向后端服务器发出一个 HTTP请求,服务器中的网页服务器(如 Apache、Nginx等)接收此请求。此时,网页服务器会根据url的后缀名判断出该请求的处理方式,如果后缀名是php,则网页服务器会重定向到php程序来处理,而如果是其他后缀,如html或者jsp等,则不会重定向到php程序,而是直接从服务器上返回静态页面给浏览器。

2:php解释器解释程序

当网页服务器将请求重定向到php程序时,php解释器就会开始解释程序。php解释器会按照顺序一行一行地解析php代码,并将其转换为机器可执行的指令,这些指令构成了php程序的执行步骤。

3:调用php函数

在php程序的执行过程中,解释器会遇到调用函数的请求,此时它会从它自身及其他模块中搜索具有相应功能的函数,以便执行。

4:处理请求

php程序会根据执行的具体内容来处理请求。它会对用户的输入数据进行检查,自动与网站的数据库进行交互,从而返回客户端所需的结果。

5:生成网页返回到客户端

当php程序执行完毕之后,它会将结果转换成html格式的文档,并将其发送回客户端浏览器,以供显示。

四.PHP环境搭建(内网)

由前边介绍可知。运行php代码必须具备服务器环境。所以这里需要单独介绍下PHP环境搭建。

外网的搭建需要购买ip地址和租用服务器。其它配置与内网基本一致。

1.搭建服务器环境的两种基本模式

1.)LAMP

LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:

  • Linux,操作系统
  • Apache,网页服务器软件
  • MariaDB或MySQL,数据库管理系统(或者数据库服务器)
  • PHP、Perl或Python,脚本语言
2.)WAMP

WAMP的组成:

  • Windows,操作系统
  • Apache,网页服务器软件
  • MariaDB或MySQL,数据库管理系统(或者数据库服务器)
  • PHP、Perl或Python,脚本语言

2.搭建方法

1.)分开搭建

对 LAMP 或 WAMP 搭建模式中的各个软件单独安装,并进行配置。对于网安学习和相关操作,较浪费时间和系统空间。

注意:所有软件不支持有中文和空格的安装路径

2.)集成搭建

使用 操作系统 + AMP集成软件 + php代码编辑器

注意:所有软件不支持有中文和空格的安装路径

(1)操作系统

Windows操作系统

(2) AMP集成软件

这里选择 phpstudy 官方下载链接

(3)php代码编辑器

可以选择 phpstrom 官方下载链接

phpstrom 2024.2.2破解版链接 未测试,谨慎选择。

这里选择(VSC) Visual Studio Code 官方下载链接

Visual Studio Code 插件配置信息:

注意

使用 Visual Studio Code 编辑php代码,不能在 Visual Studio Code 中直接运行。因为没有安装php解析器。需要通过启用 phpstudy 和操作系统的浏览器来运行(必须具备服务器环境)。

使用 phpstrom 编辑php代码,可以在 phpstrom 中直接运行。因为 phpstrom 本身具有php解析器和自带的浏览器。

3.创建web网站

1.)打开 phpstudy 选择创建网站
2.)配置网站信息

注意:

1.填写域名时,必须是三级域名,否则无法从 phpstudy 打开网站。

2.创建域名时,网站的根目录会自动创建。最后一级目录名称可随意更改。为方便维护,不建议更改路径中的其它名称。

3.)测试网站

查看网站的主页设置

网站首页支持的文件 index.php 、 index.html 、 error/index.html

因此创建网站的主页,需要在网站根目录创建对应的文件 或 在此规则页面中添加 自定义的文件名。建议考虑前者。

4.新建网站主页

进入创建网站的根目录,按照创建网站的主页规则新建文件 index.php

5.测试

打开 phpstudy 打开网站

如果打开网站后显示空白页面,说明网页创建成功。

测试不成功的主要原因

  1. 服务没有打开,要保证 Apache 和 Mysql 是开启状态
  1. Apache 和 Mysql 没有正确刷新,需要关闭后重启。
  2. 文件名没有遵循创建网站的主页规则

五.PHP语言基础

1.语法:

PHP标记符 ''<?php 代码 ?>''

// 单行注释

/多行注释/

2.变量名:

  • 所有自定义的变量名 以 $ 符号开始,后边直接跟变量名
  • 变量名必须以字母或者下划线字符开始
  • 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
  • 变量名不能包含空格
  • 变量名是区分大小写的(y 和 Y 是两个不同的变量)

注意:当赋一个文本值给变量时,需要在文本值两侧加上引号。

3.页面输出

  • echo :输出单一类型,多个用逗号隔开
  • print :输出单个字符串
  • print_r() :输出复合类型,一般用于输出数组
  • var_dump() :打印数据详细信息
3.1 echo
  • 类型‌:语言结构(非函数)。
  • 用途‌:输出一个或多个字符串。
  • ‌特点:
    • 可以输出多个值,用逗号分隔:echo "Hello", " World";。
    • 没有返回值‌,因此不能在表达式中使用。
    • 性能略优于 print(差异微小,通常可忽略)。
  • 示例:
plain 复制代码
echo "Hello World"; // 输出:Hello World
echo $a, $b;        // 输出 $a 和 $b 的值
‌3.2 print
  • 类型‌:语言结构(非函数)。
  • 用途‌:输出单个字符串。
  • ‌特点:
    • 只能输出‌一个值‌,如 print "Hello";。
    • 总是‌返回 1‌,因此可以用于表达式:if (print "Hello") { ... }。
  • 示例:
plain 复制代码
print "Hello World"; // 输出:Hello World
$result = print "Hi"; // $result 的值为 1
  • 类型‌:函数。
  • 用途‌:以人类可读的格式打印变量的详细信息(如数组、对象)。
  • ‌特点:
    • 主要用于调试复杂数据类型(数组、对象)。
    • 第二个参数可选:print_r($var, true) 会返回字符串而不直接输出。
    • 返回值为 true(直接输出时)或字符串(启用第二个参数时)。
  • 示例:
plain 复制代码
$arr = [1, 2, 3];
print_r($arr);
// 输出:Array ( [0] => 1 [1] => 2 [2] => 3 )

$output = print_r($arr, true); // 将结果保存到 $output
3.4 var_dump()
  • 类型‌:内置调试函数
  • 用途 ‌:用于输出变量的‌类型、值、长度及结构信息‌,递归展开数组/对象等复杂数据,适合调试时快速了解变量细节
  • ‌特点:
    • 显示变量类型(如 int、string)及长度(字符串长度、数组元素数量)
    • ‌可同时输出多个变量的信息(如 var_dump(a, b))
    • 直接输出内容,不返回任何值
    • 对数组和对象递归解析,显示内部元素或属性的详细结构
    • 输出内容包含原始数据类型标记,适合调试但不宜直接用于生产环境展示
  • 示例:
plain 复制代码
$data = [1, "text", ["a" => true]];	// 定义数组
var_dump($data);
/*
输出内容:
array(3) {
  [0]=> int(1)
  [1]=> string(4) "text"
  [2]=> array(1) {
    ["a"]=> bool(true)
  }
}
*/

4.字符串中变量的引用

4.1 花括号{}

字符串中添加变量时,一般使用 {} 将变量名括起来,用以区分字符串和变量名

4.2 单引号 '' 和双引号 ""

在 PHP 中,‌**单引号(')和双引号(")**‌ 都用于定义字符串,但它们的行为有显著区别。

单引号字符串中出现的变量不会被变量的值替代。

双引号字符串中最重要的一点是其中的变量会被变量值替代。

示例:

plain 复制代码
$name = 'John';
echo 'Hello {$name}abc';	// 输出:Hello {$name}abc
echo "Hello {$name}abc";	// 输出:Hello Johnabc

5.运算符

  • 算术运算符:+ - * / %
  • 赋值运算符:=
  • 字符串运算符:. (点 - 字符串拼接符)
  • 递增 递减:++ --
  • 逻辑运算符:&& || !
  • 比较运算符:> < >= <= == === != !== <>
  • 三元运算符:? :

以下是重点要了解的:

5.1 自增 自减 ++ --

递增(++)和递减(--)运算符分为‌前置(前缀)‌和‌ 后置(后缀)‌两种形式,核心区别在于‌运算执行的时机 ‌和对‌表达式返回值的影响‌。以下是详细对比:

类型 执行顺序 运算符位置 返回值 示例
前置 先运算,后返回新值 变量左侧 运算后的新值 ++ a 或 − − a 或 -- a或−−a
后置 先返回原值,后运算 变量右侧 运算前的原值 a++ 或 a--

递增/递减示例:

plain 复制代码
$a = 5;

// 前置递增
$b = ++$a;  // $a 先自增到 6,再赋值给 $b
echo "$a, $b";  // 输出:6, 6 

// 后置递增
$c = $a++;  // 先赋值 $a 原值(6)给 $c,再自增到 7
echo "$a, $c";  // 输出:7, 6 
递减示例:
$x = 10;

// 前置递减
$y = --$x;  // $x 先自减到 9,再赋值给 $y
echo "$x, $y";  // 输出:9, 9 

// 后置递减
$z = $x--;  // 先赋值 $x 原值(9)给 $z,再自减到 8
echo "$x, $z";  // 输出:8, 9 
5.2 三元运算符:? :

三元运算符(? :)是 if-else 的简洁替代形式,用于‌单条件快速判断‌,语法如下:

条件 ? 表达式1 : 表达式2;

若条件为 true,返回 表达式1 的值;否则返回 表达式2 。

三元运算符示例:

plain 复制代码
$age = 20;
$status = ($age >= 18) ? "成年人" : "未成年人";
echo $status; // 输出"成年人"

注意事项:

  1. 优先级较低,复杂表达式建议用括号明确运算顺序
  2. 过度使用会降低代码可读性

6.流程控制

6.1 if-else

语法格式:

if(条件语句){条件成立时执行的代码}else{条件不成立时执行的代码}

if-else语法示例:

plain 复制代码
$age = 18;
if ($age >= 18) {
    echo "您已成年";
} else {
    echo "您未成年";
}

中间可以使用elseif{}语句增加多种条件

if-elseif-else语法示例:

plain 复制代码
$score = 85;
if ($score >= 90) {
    echo "优秀";
} elseif ($score >= 80) {
    echo "良好";
} elseif ($score >= 60) {
    echo "及格";
} else {
    echo "不及格";
}
6.2 switch-case

语法格式:

plain 复制代码
switch (表达式) {
    case value1:
        // 代码块1
        break;
    case value2:
        // 代码块2
        break;
    // 更多的 case 语句
    default:
        // 如果没有匹配的值
}

Switch-case 语句的核心组成部分包括:

  1. switch关键字 :启动Switch语句
  2. 表达式 :用于比较的表达式,表达式只计算一次,然后与每个case的值进行比较
  3. case关键字 :定义不同的情况分支
  4. break语句 :终止当前case的执行
  5. default分支 :处理所有其他未匹配的情况

注意:PHP的switch-case不支持直接使用范围比较(如90< g r a d e < = 100 这样的表达式在 P H P 中会被拆解为 ( 90 < grade<=100 这样的表达式在PHP中会被拆解为(90< grade<=100这样的表达式在PHP中会被拆解为(90<grade) <=100),这种写法会被解析为布尔表达式,最终转换为0或1

switch-case语法示例:

plain 复制代码
$grade = 85;

switch ($grade) {
    case ($grade > 90 && $grade <= 100):
        echo "优秀";
        break;
    case ($grade > 80 && $grade <= 90):
        echo "良好";
        break;
    case ($grade > 70 && $grade <= 80):
        echo "及格";
        break;
    default:
        echo "不及格";
};	// 输出为 良好
6.3 while || do-while

语法格式:

while (condition) {

复制代码
// 执行代码块

}

condition : 条件语句

while语法示例

plain 复制代码
$i = 1;
while ($i <= 5) {
    echo "数字是: $i <br>";
    $i++;
}

特点:

  1. 先判断后执行‌:while循环会先检查条件是否为true,如果是,则执行循环体内的代码。
  2. 可能不执行‌:如果初始条件为false,循环体内的代码一次也不会执行。
  3. 无限循环风险‌:如果条件始终为true,循环会无限执行,需确保条件最终会变为false。

变体:do-while循环

语法格式:

plain 复制代码
do {
    // 代码
} while (condition);

特点:

与while不同,do-while至少执行一次,再检查条件。

do-while语法示例:

plain 复制代码
$i = 8;
do {
    echo "数字是: $i <br>";
    $i++;
} while ($i < 6);	// 输出 数字是: 8
6.4 for

语法格式:

plain 复制代码
for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体
}

初始化表达式:在循环开始前执行一次,通常用于设置循环计数器或其他必要的变量。

条件表达式:在每次循环迭代前进行评估。只有当条件为真时,才会执行循环体。一旦条件变为假,循环立即终止。

更新表达式:在每次循环迭代后执行,通常用于修改循环计数器。

for语法示例:

plain 复制代码
for ($i = 0; $i < 10; $i++) {
    echo $i . "<br/>";
}

7.PHP函数

将实现某一功能的代码块封装到一个结构中,实现代码复用

语法格式:

函数的定义

function 函数名(参数){

// 函数体

}

函数的调用:

函数名(参数);

注意:

  • 函数名需唯一且遵循变量命名规则(不能以数字或$开头)
  • 支持可选参数和默认值
  • PHP 7.1+支持可为空的参数类型:?string $param
  • 命名参数需将带默认值的参数放在最后
  • PHP不支持函数重载,同名函数会覆盖之前的定义。对于字符串处理等常见需求,可优先考虑内置函数如strpos()、substr()等。

函数示例:

plain 复制代码
// 二分查找实现 查找数组某一段数据的中间下标
function bin_sch($array, $low, $high, $k){
    if($low <= $high){
        $mid = intval(($low+$high)/2);
        if($array[$mid] == $k) return $mid;
        elseif($k < $array[$mid]) return bin_sch($array, $low, $mid-1, $k);
        else return bin_sch($array, $mid+1, $high, $k);
    }
    return -1;
}

// 调用函数
$array = [11,22,33,44,55,66,77];

echo bin_sch($array,0, 6, 44);   // 输出 3 (为数组中 44 的下标)

8.常用内置函数

isset() 判断变量是否被设置 返回Bool值,变量非空 返回true

empty() 判断变量是否为空 返回Bool值,变量为空值 返回true

md5() 32位加密字符串,MD5加密格式的字符串

include() php包含文件 代码有错误时,会报警告,代码继续执行

include_once() php包含文件 只包含一次,代码有错误时,会报警告,代码继续执行

require() php包含文件 代码有错误时,会报致命错误,代码终止执行

require_once() php包含文件 只包含一次,代码有错误时,会报致命错误,代码终止执行

serialize() 序列话函数

unserialize() 反序列话函数

8.1文件包含函数

include() php包含文件 代码有错误时,会报警告,代码继续执行

include_once() php包含文件 只包含一次,代码有错误时,会报警告,代码继续执行

require() php包含文件 代码有错误时,会报致命错误,代码终止执行

require_once() php包含文件 只包含一次,代码有错误时,会报致命错误,代码终止执行

8.2序列和反序列函数

PHP的 serialize() 和 unserialize() 是一对用于数据序列化与反序列化的核心函数,主要用于复杂数据的存储和传输。

serialize() 和 unserialize() 代码示例:

plain 复制代码
// 序列化数组
$data = ["name" => "John", "age" => 30];
$serialized = serialize($data);  // 输出:a:2:{s:4:"name";s:4:"John";s:3:"age";i:30;}

// 反序列化还原
$original = unserialize($serialized);
print_r($original);  // 输出 Array ( [name] => John [age] => 30 )

如需深度处理对象序列化,可结合__sleep()和__wakeup()方法定制逻辑

__sleep()和__wakeup()‌的关系

方法 触发条件 主要用途
__sleep() serialize()调用 筛选序列化属性
__wakeup() unserialize()调用 重建对象资源
8.2.1**serialize()**‌ 序列化函数
  • 将PHP变量(数组/对象等)转换为可存储的字符串表示形式
  • 支持除resource类型外的所有数据类型
  • 序列化对象时会自动调用__sleep()方法

resource数据类型

  • resource(资源)类型是一种特殊数据类型,用于表示对外部系统资源的引用。
  • 保存的是对‌外部资源‌的句柄(如打开的文件、数据库连接、图形画布等)。
  • 只能通过‌特定函数‌生成(如fopen()创建文件资源、mysqli_connect()创建数据库连接资源)。
  • 使用is_resource()函数验证变量是否为资源类型

__sleep()方法

  • 是一个魔术方法,用于在对象序列化时控制哪些属性应被保存。
  • 当对象被serialize()处理时自动触发。
  • 必须返回‌需序列化的属性名数组‌,未包含的属性将被忽略。

序列化并触发__sleep()方法示例:

plain 复制代码
class User {
    public $username = 'admin';
    private $password = '123456';
    protected $session_id;

    public function __sleep() {
        // 仅序列化username和session_id
        return ['username', 'session_id'];
    }
}
$user = new User();
echo serialize($user);  // 触发 __sleep() 输出不包含password的序列化数组
‌8.2.2**unserialize()**‌ 反序列话函数
  • 将序列化字符串还原为原始PHP数据结构
  • 反序列化对象时会触发__wakeup()方法

__wakeup()方法:

  • 是一个魔术方法,在对象反序列化(unserialize())时自动触发,用于重建对象状态或执行初始化操作。
  • 当unserialize()处理包含对象的字符串时,若类中定义了__wakeup(),则优先调用该方法。
  • 与__sleep()形成互补:__sleep()控制序列化属性,__wakeup()处理反序列化后的恢复逻辑。

反序列化并触发__wakeup()方法示例:

plain 复制代码
class SessionHandler {
    private $db_conn;

    public function __wakeup() {
        $this->db_conn = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
        echo "数据库连接已重建";
    }
}

$data = 'O:13:"SessionHandler":0:{}';
$obj = unserialize($data); // 触发__wakeup()

9.PHP数组

PHP数组是一种数据结构,用于存储键值对集合,其中每个键可以是整数索引或字符串索引,而值可以是任何类型的数据。无需预先声明大小,可动态增减元素。

创建数组:array() 函数用于创建数组

count() 函数用于返回数组的长度(元素的数量)

遍历数值数组:可以使用for循环以及foreach循环

数组 代码示例:

plain 复制代码
// 创建数组
$arr1 = array(1, 2, 3);          // 传统语法
$arr2 = ['name' => 'John', 'age' => 30]; // 短数组语法(PHP 5.4+)

// 数组输出
print_f($arr2); // 输出 Array ( 'name' => 'John' 'age' => 30 )
echo $arr2['name'];  // 输出 John
echo count($arr1);   // 输出 3

// foreach 遍历数组
foreach ($arr2 as $key => $value) {
    echo "$key: $value\n";
}

// for 循环遍历数组
// 获取数组长度
$length = count($arr2);
for($i=0;$i<$length;$i++){
	echo "索引 {$i} 的值是: {$arr2[$i]}\n";
};

10.超全局变量

超全局变量(Superglobals)是PHP中预定义的全局变量数组,自PHP 4.1.0版本引入,其作用域覆盖脚本的所有层级(包括函数、类等),无需使用global关键字即可直接访问。

主要超全局变量及其功能:

  1. $GLOBALS
    • 包含当前脚本中所有全局变量的引用,变量名作为数组键
    • 示例:通过 G L O B A L S [ ′ x ′ ] 可在任何作用域访问 / 修改全局变量 GLOBALS['x']可在任何作用域访问/修改全局变量 GLOBALS[′x′]可在任何作用域访问/修改全局变量x
  2. ‌**$_SERVER**‌
    • 存储服务器和请求环境信息,如请求头、脚本路径等
    • 常用键值:PHPSELF(当前脚本路径)、SERVERNAME(服务器域名)
  3. ‌ G E T 和 _GET和 GET和_POST
    • $_GET:获取URL参数(GET方法提交的数据
    • $_POST:获取表单POST方法提交的数据
    • 表单需指定method属性为对应方法
  4. ‌**$_REQUEST**‌
    • 合并‌ G E T 、 _GET、 GET、_POST和$_COOKIE的数据(因安全性问题不推荐使用)
  5. ‌**$_FILES**‌
    • 处理HTTP文件上传时的文件信息(如文件名、临时路径等)
  6. ‌**$_SESSION**‌
    • 存取会话变量,需先调用session_start()
  7. ‌**$_COOKIE**‌
    • 读取客户端Cookie信息
  8. ‌**$_ENV**‌
    • 存储环境变量,可能需配置PHP才能获取

这些变量均由PHP自动填充数据,开发者可直接使用而无需初始化。其中** S E R V E R ∗ ∗ ‌和 ∗ ∗ _SERVER**‌和** SERVER∗∗‌和∗∗GLOBALS‌最常用于获取系统级信息,而 ‌ G E T 和 _GET和 GET和_POST**则是表单处理的核心变量。

11.表单操作

用户提交数据通常是使用表单进行提交,也可以使用网址中的参数传递数据,这些数据通过HTTP请求的方式发送,使web服务器获取。

PHP表单操作是Web开发中处理用户输入数据的关键技术,主要涉及表单创建、数据接收、验证和处理等环节。

注意:需要处理表单提交、用户认证或数据查询时,建议将PHP代码放在HTML前面

1.)HTML表单结构

使用标签定义,需设置action(处理脚本路径)和method(提交方式)

plain 复制代码
<form action="process.php" method="POST">
  <input type="text" name="username" required>
  <input type="password" name="pwd">
  <input type="submit" value="提交">
</form>
2.)数据接收方式
  • POST方法:
    通过$_POST超全局数组获取数据,适合敏感信息传输
plain 复制代码
$username = $_POST['username'];
  • GET方法:
    通过$_GET获取URL参数,适合非敏感数据
plain 复制代码
$search = $_GET['keyword'];
3.)安全处理建议

防SQL注入,使用预处理语句

plain 复制代码
$stmt = $conn->prepare("INSERT INTO users (name) VALUES (?)");
$stmt->bind_param("s", $_POST['name']);

代码解释:

1.预处理语句创建

stmt = conn->prepare("INSERT INTO users (name) VALUES (?)");

  • prepare()方法将SQL模板发送到数据库服务器
  • 问号?是参数占位符,表示后续绑定实际值
  • 该语句准备将数据插入users表的name字段

2.参数绑定

stmt-\>bind_param("s", _POST['name']);

  • bind_param()将变量绑定到预处理语句的参数
  • 第一个参数"s"表示数据类型(string),其他常见类型:
    "i" - integer
    "d" - double
    "b" - blob
  • 第二个参数$_POST['name']是要插入的实际表单数据

3.安全优势

  • 实现数据与SQL指令分离,彻底防止SQL注入
  • 自动处理特殊字符转义
  • 类型安全校验(如字符串不会作为SQL指令执行)

4.完整使用流程通常还包括:

plain 复制代码
$stmt->execute();  // 执行预处理语句
$stmt->close();    // 关闭语句
4.)文件上传处理

文件上传必要条件:

method属性:表单提交方式必须为POST

enctype属性:form表单属性,主要是规范表单数据的编码方式,需要添加参数 enctype="multipart/form-data"

示例:

plain 复制代码
<!DOCTYPE html>
<html>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
    选择要上传的文件:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="上传文件" name="submit">
</form>
</body>
</html>

使用$_FILES数组,需配置php.ini的uploadmax_filesiz

plain 复制代码
$tmp_name = $_FILES['avatar']['tmp_name'];
move_uploaded_file($tmp_name, "uploads/".$name);

1.tmp_name = _FILES['avatar']['tmp_name'];

  • $_FILES是PHP接收上传文件的超全局数组
  • 'avatar'对应表单中的name属性
  • 'tmp_name'表示服务器上的临时存储路径(如:/tmp/php3h8j2f)
  • 文件上传后会被自动存放到临时目录,需要手动移动到目标位置

2.move_uploaded_file( t m p n a m e , " u p l o a d s / " . tmp_name, "uploads/". tmpname,"uploads/".name);

  • 第一个参数是临时文件路径
  • 第二个参数是目标路径(建议使用basename()过滤文件名)
  • 该函数会执行安全检查后移动文件
  • 需要确保"uploads/"目录存在且有写入权限

3.安全注意事项:

  • 必须配合is_uploaded_file()验证文件合法性
  • 应限制文件类型(检查$_FILES['avatar']['type'])
  • 建议重命名文件(避免同名覆盖和特殊字符问题)
  • 设置php.ini中的upload_max_filesize限制

4.完整流程

plain 复制代码
if(isset($_FILES['avatar'])){
    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["avatar"]["name"]);

    if(move_uploaded_file($_FILES["avatar"]["tmp_name"], $target_file)) {
        echo "文件上传成功";
    } else {
        echo "文件上传失败";
    }
}

12.常用字符串处理函数

ltrim() :删除字符串左边的空白字符,或指定字符

rtrim() : 删除字符串右边的空白字符,或指定字符

trim() : 删除字符串两边的空白字符,或指定字符

strlen() :获取字符串长度

substr() :字符串截取

str_replace() : 字符串替换

strtolower() :将字符串转换为小写字母

strtoupper() :将字符串转换为大写字母

strip_tags() :删除字符串中HTML XML PHP JS 标签

htmlspecialchars() : 函数把一些预定义的字符转换为 HTML 实体字符

常见实体字符示例:

字符 实体名称 实体编号 用途
< < < 小于号
> > > 大于号
& & & 和号
" " " 双引号
© © © 版权符号
不间断空格(防空格压缩)

13.类和对象

1.)类(Class):

类可以包含属性(变量)和方法(函数)属性用于存储数据,而方法用于执行操作 new 关键字直接跟类名来创建对象

  • 类是对象的蓝图或模板
  • 使用class关键字定义

语法格式:

plain 复制代码
class MyClass{
//类的属性和方法
};
  • 包含属性和方法

示例:

plain 复制代码
class Person {
 public $name;
 public function sayHello() {
 	echo "Hello!";
	}
 }
  • 类修饰符

pubilic :公有的。类内、子类、外部均可访问,无任何限制

protected :受保护的。类内和子类可访问,外部不可访问

private :私有的。仅类内可访问,子类和外部均不可访问

2.)对象(Object):
  • 对象是类的实例
  • 使用new关键字创建
  • 可以访问类中定义的属性和方法

示例:

plain 复制代码
$person1=new Person();
$person1->name = "张三";
$person1->sayHello();

主要特性:

  • 封装:通过访问修饰符(public/protected/private)控制访问
  • 继承:使用extends实现类继承
  • 多态:子类可以重写父类方法
3.)构造函数:
  • 在对象创建时自动调用
  • 使用__construct()定义

示例:

plain 复制代码
class Person {
 public function __construct(name) { 
 		this->name = $name;
 	}
 }
4.)魔术方法:
  • __get()/__set():访问不存在的属性时调用
  • __call():调用不存在的方法时调用
  • __toString():对象被当作字符串使用时调用
5.)示例

以下是一个完整的PHP类和对象使用示例,展示了一个简单的用户管理系统。

a. 创建 index.php 文件用于用户信息的输入

plain 复制代码
<?php
require_once 'User.php';

// 创建用户对象
$user1 = new User("张三", "zhangsan@example.com");
$user2 = new User("李四", "lisi@example.com");

// 调用方法
$user1->displayInfo();
echo "<br>";

// 更新邮箱
if($user2->updateEmail("new_lisi@example.com")) {
    echo "邮箱更新成功<br>";
} else {
    echo "邮箱格式无效<br>";
}

// 获取属性值
echo "用户1的用户名: " . $user1->getUsername() . "<br>";
echo "用户2的注册时间: " . $user2->getRegistrationDate() . "<br>";
?>

b.创建 User.php 文件用于用户信息的处理

plain 复制代码
<?php
class User {
    // 属性
    private $username;
    private $email;
    private $registrationDate;

    // 构造函数
    public function __construct($username, $email) {
        $this->username = $username;
        $this->email = $email;
        $this->registrationDate = date('Y-m-d H:i:s');
    }

    // 方法
    public function getUsername() {
        return $this->username;
    }

    public function getEmail() {
        return $this->email;
    }

    public function getRegistrationDate() {
        return $this->registrationDate;
    }

    public function updateEmail($newEmail) {
        if(filter_var($newEmail, FILTER_VALIDATE_EMAIL)) {
            $this->email = $newEmail;
            return true;
        }
        return false;
    }

    public function displayInfo() {
        echo "用户名: " . $this->username . "<br>";
        echo "邮箱: " . $this->email . "<br>";
        echo "注册时间: " . $this->registrationDate . "<br>";
    }
}

14.魔术方法

HP中的魔术方法是指以双下划线(__)开头的一组特殊方法,它们在特定情况下会被自动调用,为面向对象编程提供了强大的灵活性。

魔术方法通常以两个下划线__开头,后跟方法名称,如__construct()、__destruct()等。

魔术方法不需要显式调用,而是由PHP解释器在特定时机自动触发。

常见的魔术方法及其功能:

  1. 构造与析构方法
  • __construct():对象实例化时自动调用,用于初始化属性
  • 构造方法__construct()是一个特殊的方法,当使用new实例化对象时,该方法会自动被调用,用于初始化对象的状态或执行其他必要的操作。

主要用途

• 初始化对象属性值

• 执行启动逻辑(如数据库连接)

• 设置默认值或依赖注入

参数列表

__construct()方法可以接受任意数量的参数,这些参数用于在创建对象时传递初始化数据。

使用示例

在类中定义__construct()方法,并在创建对象时传递参数来初始化对象的状态。

plain 复制代码
class User {
    public function __construct($name) {
        $this->name = $name;
        echo "对象已初始化";
    }
}

注意事项

  • 如果类中定义了__construct()方法,则必须在创建对象时提供所需的参数,否则会导致错误。
  • __destruct():对象销毁前自动调用,用于资源清理
  • 析构方法__destruct()是另一个特殊的方法,当对象不再被引用或脚本执行结束时,该方法会自动被调用,用于执行清理操作,如释放资源、关闭数据库连接等。

典型应用场景:

• 关闭数据库连接

• 释放文件句柄

• 清理内存资源

参数列表

__destruct()方法不接受任何参数,且无需手动调用

使用示例

在类中定义__destruct()方法,并在其中执行必要的清理操作。

plain 复制代码
class DB {
    private $conn;
    
    public function __construct($host, $user, $pass) {
        $this->conn = new PDO("mysql:host=$host", $user, $pass);
    }
    
    public function __destruct() {
        $this->conn = null; // 释放连接
    }
}
  1. 属性访问方法
  • __get($name):访问未定义/不可访问属性时触发
  • __set( n a m e , name, name,value):给未定义/不可访问属性赋值时触发
  • __isset($name):对不可访问属性调用isset()时触发
  • __unset($name):对不可访问属性调用unset()时触发
  1. 方法调用处理
  • __call( n a m e , name, name,args):调用未定义/不可访问方法时触发
  • __callStatic( n a m e , name, name,args):静态调用未定义方法时触发
  1. 序列化相关
  • __sleep():serialize()执行前调用,返回需序列化的属性数组
  • __wakeup():unserialize()执行后调用,用于重建资源
  1. 其他特殊方法
  • __toString():对象被当作字符串处理时调用
  • __invoke():以函数方式调用对象时触发
  • __clone():对象被克隆时自动调用
  • __debugInfo():var_dump()对象时控制输出内容

典型应用场景包括:动态属性处理、方法拦截、对象序列化控制、错误处理等

相关推荐
恋猫de小郭1 小时前
Claude Code 已经 100% 自己写代码,为什么 Anthropic 还有上百个工程职位空缺?
前端·人工智能·ai编程
是欢欢啊2 小时前
前端纯原生canvas图片裁剪工具,不依赖任何插件
前端
元让_vincent2 小时前
DailyCoding C++ | SLAM里的“幽灵数据”:从一个未初始化的四元数谈C++类设计
开发语言·c++·slam·构造函数·类设计·激光里程计
zheshiyangyang2 小时前
前端面试基础知识整理【Day-4】
前端·面试·职场和发展
A9better2 小时前
C++——指针与内存
c语言·开发语言·c++·学习
byzh_rc2 小时前
[深度学习网络从入门到入土] 含并行连结的网络GoogLeNet
网络·人工智能·深度学习
乾元2 小时前
对抗性攻击:一张贴纸如何让自动驾驶视觉系统失效?
运维·网络·人工智能·安全·机器学习·自动驾驶
FunW1n2 小时前
tmf.js Hook Shark框架相关疑问归纳总结报告
java·前端·javascript
武帝为此2 小时前
【Shell 变量作用域详解】
前端·chrome