当今最强大的PHP技巧,让你成为编程巨匠

当今最强大的PHP技巧,让你成为编程巨匠

PHP 简单介绍

1、语言介绍

标题 描述
Web开发 PHP在Web开发领域非常强大。它具有丰富的内置函数和库,使得开发Web应用程序变得高效和简单。PHP可以轻松处理表单处理、数据验证和数据库操作等任务,并与各种数据库系统(如MySQL)无缝集成。
快速开发 HP的语法简单易学,开发速度相对较快。它提供了丰富的框架和工具,如Laravel、Symfony和CodeIgniter等,可以加快应用程序的开发过程。
社区支持 PHP拥有庞大的开发者社区,提供丰富的文档、教程和资源。这使得开发者能够轻松获取支持和解决问题,共享经验和知识。
特色 它拥有良好的扩展性和可维护性,可以通过面向对象编程和模块化设计来构建可扩展的应用程序。开源的,可以免费使用和分发。这使得它成为许多开发者和组织的首选语言之一。
缺点 PHP是解释执行的语言,每次请求都需要解析和执行代码。尽管PHP在性能方面有所改进,但在处理大量并发请求或高负载情况下可能表现不佳。

2、运行模式

名称 介绍
CLI模式 CLI模式是在命令行终端中直接运行PHP脚本的模式。它适用于编写命令行脚本、系统管理任务和工具开发等场景。
Web服务器模式 PHP最常见的用途是在Web服务器上运行,处理来自Web浏览器的HTTP请求。在这种模式下,PHP脚本通过Web服务器(如Apache、Nginx)与浏览器进行交互,生成并返回动态的Web页面。
CGI模式 CGI模式是一种通过Web服务器将HTTP请求传递给PHP解释器的方式。在这种模式下,PHP解释器作为独立的进程执行,并将结果返回给Web服务器,再由Web服务器传递给浏览器。
FastCGI模式 FastCGI是一种改进的CGI模式,通过保持PHP解释器进程的持久性来提高性能。在FastCGI模式下,PHP解释器作为一个独立的后台进程运行,并通过与Web服务器之间的通信管道处理HTTP请求。
模块模式 在某些Web服务器(如Apache)中,PHP可以作为一个模块(例如mod_php)嵌入到Web服务器中。在这种模式下,PHP解释器与Web服务器共享同一个进程空间,提供更快的性能和更好的集成。

详细模式使用方法可以参考官方文档:PHP: PHP 手册 - Manual

3、运行环境搭建及IDE推荐

3.1 PHP&Mysql 版本推荐:8.0 +
3.2 运行服务器环境选: Apache 或者 Nginx
  • 如果您需要一个成熟稳定、功能丰富且具有广泛扩展性的Web服务器,以及良好的.htaccess支持,那么Apache可能是更合适的选择。
  • 如果您关注高性能、低内存消耗和高度可扩展性,并且对简洁易懂的配置语法有需求,那么Nginx可能是更适合的选择。
3.3 集成环境选择
名称 适配系统 官网
Wamp Windows www.wampserver.com
Mamp Macos www.mamp.info
Lamp Linux 具体需要根据Linux系统查找
Xampp Win/Macos www.apachefriends.org

PHP基础知识

1、标记风格

推荐使用

这 是一种短标记风格,用于在PHP中嵌入代码块。它是一种较早期的标记风格,但在一些PHP配置中可能被禁用或不推荐使用。

2、分号、空白、换行符

在PHP中分号“ ;”用作语句的结束符号。每个语句应该以分号结尾,以表示语句的结束。

空白和换行符(包括空格、制表符和换行符)通常被解释器忽略,因此它们在大多数情况下对代码的执行没有直接影响。

提示: 通过在适当的位置使用空白和换行符,可以使代码更易于阅读和理解,并且有助于代码的组织和格式化。

3、注释

//............ 单行注释

#.............. 单行注释

/*..................*/ 多行注释

4、内容输出

  1. echo语句:echo是PHP中最常用的输出方法之一,用于将内容输出到浏览器或命令行。

    `echo "Hello Php!";`
    
  2. print语句:print是另一种常见的输出方法,与echo类似,用于将内容输出到浏览器或命令行。

    print "Hello Php!";
    
  3. print_r函数:print_r函数用于打印复杂数据类型(如数组、对象)的可读性较好的表示形式。

    $demoArr = ['apple','banana','orange];
    print_r($demoArr);
    
  4. var_dump函数:var_dump函数用于打印变量的详细信息,包括数据类型和值。

    $name = "John_lee";
    var_dump($name);
    
  5. printf函数:printf函数用于格式化输出字符串,可以根据指定的格式打印变量的值。

    $number = 42;
    printf("The answer is %d", $number);
    

    5.1 常用的占位符:

    占位符 说明
    %d 带符号的十进制数
    %u 不带符号的十进制数
    %o 不带符号的八进制数
    %x 不带符号的十六进制数(小写字母)
    %X 不带符号的十六进制数(大写字母)
    %f 浮点数(本地设置)
    %F 浮点数(不本地设置)
    %e 科学计数法(小写e)
    %E 科学计数法(大写E)
    %s 字符串
    %c ASCII码值相应的字符
    %b 二进制数
    %a 十六进制数(小写字母)
    %A 十六进制数(大写字母)
  6. sprintf函数:sprintf函数与printf函数类似,但它返回格式化后的字符串 (用变量保存),而不是直接将其打印出来。

$number = 42;
$formattedString = sprintf("The answer is %d", $number);
echo $formattedString;

5、变量与常量

5.1 变量命名规则

在PHP中,变量名必须以美元符号“ ”开头,后面跟着变量名。变量名可以包含字母、数字和下划线,但必须以字母或下划线开头。此外, P H P 是区分大小写的,因此 ‘ ”开头,后面跟着变量名。变量名可以包含字母、数字和下划线,但必须以字母或下划线开头。此外,PHP是区分大小写的,因此` 开头,后面跟着变量名。变量名可以包含字母、数字和下划线,但必须以字母或下划线开头。此外,PHP是区分大小写的,因此name$Name`是两个不同的变量。

5.2 变量声明

PHP是一种动态弱类型语言,这意味着您无需显式声明变量的类型。变量的类型是根据其值自动确定的。例如:

$name = "John"; // 字符串类型
$age = 25; // 整数类型
$isStudent = true; // 布尔类型
5.3 变量赋值

要为变量赋值,只需使用赋值操作符(=)将值分配给变量。例如:

$name = "John";
$age = 25;
5.4 变量输出

要在PHP中输出变量的值,可以使用echo语句或print函数。例如:

$name = "John";
echo $name; // 输出:John
5.5 变量类型
字符串(String)

字符串是由一串字符组成的数据类型。可以使用单引号或双引号来定义字符串。例如:

$name = "John";
$message = 'Hello, World!';
整数(Integer)

整数是不带小数点的数字。例如:

$age = 25;
浮点数(Float)

浮点数是带有小数点的数字。例如:

$pi = 3.14;
布尔(Boolean)

布尔类型表示真或假的值。可以是truefalse。例如:

$isStudent = true;
数组(Array)

数组是一种用于存储多个值的数据结构。可以使用array()函数或简化的[]语法来创建数组。例如:

$fruits = array("apple", "banana", "orange");
// 或者
$fruits = ["apple", "banana", "orange"];
对象(Object)

对象是类的实例。对象具有属性和方法。例如:

class Person {
    public $name;
    public function sayHello() {
        echo "Hello, my name is " . $this->name;
    }
}

$person = new Person();
$person->name = "John";
$person->sayHello(); // 输出:Hello, my name is John
空(Null)

null表示变量没有值。例如:

$foo = null;
5.6 变量作用域

变量的作用域指的是变量在程序中有效的区域。在PHP中,有以下几种作用域:

5.6.1 局部作用域

局部作用域是指在函数或代码块内部声明的变量。这些变量只在其声明的函数或代码块内部可见。例如:

function myFunction() {
    $name = "John"; // 局部变量
    echo $name;
}

myFunction(); // 输出:John
echo $name; // 错误:变量$name在该作用域外部不可见
5.6.2全局作用域

全局作用域是指在函数外部声明的变量。这些变量在整个程序中都可见。例如:

$name = "John"; // 全局变量

function myFunction() {
    global $name; // 使用global关键声明全局变量
    echo $name;
}

myFunction(); // 输出:John
echo $name; // 输出:John
5.6.3 静态作用域

静态作用域用于在函数调用之间保持变量的持久性。静态变量在函数内部声明,但在函数调用之间保持其值。例如:

function myFunction() {
    static $count = 0; // 静态变量
    $count++;
    echo $count;
}

myFunction(); // 输出:1
myFunction(); // 输出:2
myFunction(); // 输出:3
5.7 变量技巧
5.7.1 变量的引用传递

默认情况下,PHP中的变量是通过值传递的,这意味着在函数内部对变量的更改不会影响函数外部的变量。但是,您可以使用引用传递来让函数修改外部变量。例如:

function increment(&$num) {
    $num++;
}

$count = 0;
increment($count);
echo $count; // 输出:1

在函数参数前加上&符号将参数声明为引用。

5.7.2 变量的动态变量名

在PHP中,您可以使用变量的值作为另一个变量的名称。这被称为动态变量名。例如:

$fruit = "apple";
$apple = "A delicious fruit";
echo $$fruit; // 输出:A delicious fruit

$$fruit将使用$fruit的值作为变量名称,即$apple

5.8 超全局变量

PHP提供了一些特殊的全局变量,称为超全局变量。这些变量在脚本的任何地方都可用,并且不需要使用global关键字来访问。一些常见的超全局变量包括$_GET$_POST$_SERVER等。例如:

echo $_GET['name']; // 输出URL参数中的name值
echo $_POST['email']; // 输出表单提交中的email值
echo $_SERVER['REMOTE_ADDR']; // 输出客户端IP地址
超全局变量 说明
$_GET 地址栏 GET 提交
$_POST 表单 POST 提交
$_FILES 文件上传变量
$_SESSION 会话变量
$_COOKIE cookie 值变量
$_GLOBALS 全局变量
$_REQUEST 包含$_GET,$_POST,$_COOKIE
$_SERVER 服务器环境变量
5.9 常量命名和规则
常量命名规则

在PHP中,常量名通常使用大写字母,并且建议使用下划线来分隔单词。

  • 常量前面没有定义变量符号 ”$“
  • 常量只能用 define() 函数定义,而不能通过赋值语句
  • 常量一旦定义就不能被重新定义或者取消定义
  • 常量的值用来定义 整型,浮点,字符串,布尔值,数组
  • 常量可以不用理会变量范围的可以在任何位置访问

例如:

define("PI", 3.14);
define("MAX_SIZE", 100);

//---------------------------------------

define("FRUITS", ["apple", "banana", "orange"]);
echo FRUITS[0]; // 输出:apple
echo FRUITS[1]; // 输出:banana
echo FRUITS[2]; // 输出:orange

5.9.1 常量声明

在PHP中,可以使用define()函数来定义常量。define()函数接受两个参数。例如:

define("PI", 3.14);

自PHP 7.3起,常量默认是大小写敏感的,并且不再支持通过第三个参数来声明大小写不敏感的常量。

5.9.2常量使用

定义常量后,可以在整个脚本中使用它们,无论是在函数内部还是在函数外部。要访问常量的值,只需使用常量名称即可。例如:

define("PI", 3.14);
echo PI; // 输出:3.14
5.9.3预定义常量

PHP还提供了一些预定义的常量,它们在整个脚本中都可用。一些常见的预定义常量包括:

  • __FILE__: 当前脚本的文件名(包含完整路径)
  • __LINE__: 当前脚本中的行号
  • __DIR__: 当前脚本所在的目录
  • __FUNCTION__: 当前函数的名称
  • __CLASS__: 当前类的名称
  • __METHOD__: 当前方法的名称

例如:

echo __FILE__; // 输出当前脚本的文件名
echo __LINE__; // 输出当前脚本中的行号
5.10常量用例
5.10.1 存储配置信息

常量非常适合存储配置信息,例如数据库连接信息、API密钥等。通过将这些敏感信息存储为常量,可以确保它们在整个脚本中不会被更改。

define("DB_HOST", "localhost");
define("DB_USERNAME", "myuser");
define("DB_PASSWORD", "mypassword");
5.10.2 枚举值

常量可以用于定义枚举值,即一组相关的命名常量。您可以使用这些常量来表示不同的颜色。例如,假设您想定义一些颜色常量:

define("COLOR_RED", "red");
define("COLOR_GREEN", "green");
define("COLOR_BLUE", "blue");
5.10.3 数学常量

PHP提供了一些内置的数学常量,方便在数学运算中使用,具体可以查阅PHP手册。例如:

echo M_PI; // 输出圆周率π的值
echo M_E; // 输出自然对数的底数e的值
5.10.4条件编译

常量还可以用于条件编译。根据不同的条件,您可以定义不同的常量值。然后,您可以根据这些常量的值来执行不同的代码块。例如:

define("DEBUG_MODE", true);

if (DEBUG_MODE) {
    // 执行调试模式下的代码
} else {
    // 执行非调试模式下的代码
}

6、运算符

6.1 算术运算符
运算符 说明
$a+$b 加法$a 和$b 的和
$a-$b 减法 $a 和$b 的差
$a*$b 乘法 $a 和$b 的积
$a/$b 除法 $a 除以$b 的商
$a%$b 取模 $a 除以$b 后的余
++$a 前加 $a 的值先加一,然后进行操作
$a++ 后加 $a 的值先进行操作,后加一
--$a 前减 $a 的值先减一,然后进行操作
$a-- 后减 $a 的值先进行操作,后减一
$a = 5;
$b = 3;
$result = $a + $b; // $result 的值为 8
$a = 5;
$b = 3;
$result = $a - $b; // $result 的值为 2
$a = 5;
$b = 3;
$result = $a * $b; // $result 的值为 15
$a = 10;
$b = 2;
$result = $a / $b; // $result 的值为 5
$a = 10;
$b = 3;
$result = $a % $b; // $result 的值为 1
$a = 2;
$b = 3;
$result = $a ** $b; // $result 的值为 8
$a = 5;
echo ++$a; // 输出:6
echo $a;   // 输出:6
$a = 5;
echo $a++; // 输出:5
echo $a;   // 输出:6
$a = 5;
echo $a--; // 输出:5
echo $a;   // 输出:4
$a = 5;
echo --$a; // 输出:4
echo $a;   // 输出:4
6.2 赋值运算符
运算符 说明
= 右边值赋值给左边变量
+= 左边值加上右边值赋值给左边变量
-= 左边值减掉右边值赋值给左边变量
*= 左边值乘以右边值赋值给左边变量
/= 左边值除以右边值赋值给左边变量
.= 左边字符串连接到右边变量后面
%= 左边值对右边值取余数后赋值给左边变量
6.3 字符串运算符
运算符 说明
. 它返回其左右参数连接后的字符串
.= 左边字符串连接到右边变量后面
6.4 比较运算符
运算符 说明
$a==$b 等于 TRUE,如果 a 等于 a 等于 a等于b
$a===$b 全等于 TRUE,如果 a 等于 a 等于 a等于b,并且类型也相同
$a!=$b 不等 TRUE,如果 a 不等于 a 不等于 a不等于b
$a<>$b 不等 TRUE,如果 a 不等于 a 不等于 a不等于b
$a!==$b 非全等 TRUE,如果 a 不等于 a 不等于 a不等于b,或者类型不同
$a<$b 小于 TRUE,如果 a 严格小于 a 严格小于 a严格小于b
$a>$b 大于 TRUE,如果 a 严格 a 严格 a严格b
$a<=$b 小于等于 TRUE,如果 a 小于或者等于 a 小于或者等于 a小于或者等于b
$a>=$b 大于等于 TRUE,如果 a 大于或者等于 a 大于或者等于 a大于或者等于b
6.5 逻辑运算符
运算符 说明
$a and $b 逻辑与 TRUE,如果 $a 与 $b 都为 TRUE
$a or $b 逻辑或 TRUE,如果 $a 或 $b 任一为 TRUE
!$a 逻辑非 TRUE,如果 $a 不为 TRUE
$a && $b 逻辑与 TRUE,如果 $a 与 $b 都为 TRUE
`$a
6.6 三元表达式
变量 = 条件 ? 值1 : 值2;

当表达式的条件 true 时, 变量 = 值 1 否则 变量 = 值 2

变量?? "默认值";

??操作符是空合并运算符,它用于简化对变量是否为null的判断,并在变量为null时提供一个默认值。 注意是:null

$s1 = null;
echo $s1?? "888"; //结果:888

$s2 = 0;
echo $s2?? 888; // 结果为:0

$s3 = flase;
echo $s3?? 888; // 结果为:不显示

$s4 = true;
echo $s4?? 888; // 结果为:1

7、流程控制

7.1 if/elseif/else

用于执行条件分支的控制结构。它们可以根据条件的真假执行不同的代码块

if (条件1) {
    // 当条件1为真时执行的代码块
} elseif (条件2) {
    // 当条件1为假而条件2为真时执行的代码块
} else {
    // 当所有条件都为假时执行的代码块
}

$age = 25;
if ($age < 18) {
    echo "未成年人";
} elseif ($age >= 18 && $age < 65) {
    echo "成年人";
} else {
    echo "老年人";
}
7.2 switch

用于执行多个条件分支的控制结构。根据表达式的值选择不同的代码块进行执行

switch (表达式) {
    case1:
        // 当表达式的值等于值1时执行的代码块
        break;
    case2:
        // 当表达式的值等于值2时执行的代码块
        break;
    // 可以有多个case块
    default:
        // 当表达式的值与所有case的值都不匹配时执行的代码块
        break;
}


$day = "Monday";

switch ($day) {
    case "Monday":
        echo "星期一";
        break;
    case "Tuesday":
        echo "星期二";
        break;
    case "Wednesday":
        echo "星期三";
        break;
    case "Thursday":
        echo "星期四";
        break;
    case "Friday":
        echo "星期五";
        break;
    default:
        echo "周末";
        break;
}

注意:如果在 switch 语句的 case 块中没有使用 break 语句,程序将会继续执行后续的 case 块,而不会跳出 switch 语句。

$day = "Monday";
switch ($day) {
    case "Monday":
        echo "Today is Monday.";
    case "Tuesday":
        echo "Tomorrow is Tuesday.";
    case "Wednesday":
        echo "The day after tomorrow is Wednesday.";
    default:
        echo "Other days.";
}

/** 
结果为:  Today is Monday.
        Tomorrow is Tuesday.
        The day after tomorrow is Wednesday.
        Other days.
*/
7.3 while

是一种常用的循环控制结构,用于在满足条件的情况下重复执行一段代码块。

while (条件) {
    // 循环体中的代码
}


$count = 1;
while ($count <= 5) {
    echo $count . " ";
    $count++;
}
7.4 do while

是一种循环控制结构,类似于 while 循环,但它会先执行一次循环体中的代码,然后再检查条件是否为真,如果条件为真,则继续执行循环。

do {
    // 循环体中的代码
} while (条件);

$count = 1;
do {
    echo $count . " ";
    $count++;
} while ($count <= 5);

7.5 for

是一种常用的循环控制结构,用于在指定的条件下重复执行一段代码块,并控制循环变量的增量。

for (初始表达式; 条件表达式; 增量表达式) {
    // 循环体中的代码
}

for ($i = 1; $i <= 5; $i++) {
    echo $i . " ";
}

注意: 循环的时候必须设置停止循环的条件,不然呵呵~ 死机了吧!

7.6 breakcontinue
  • break 语句用于立即终止当前循环(例如 forwhiledo while 循环),并跳出循环体,继续执行循环后的代码。它可以用于提前结束循环,无论是否满足循环条件。当程序执行到 break 语句时,循环会立即结束,不再执行循环体内剩余的代码。

  • continue 语句用于跳过当前循环的剩余代码,立即进入下一次循环迭代。当程序执行到 continue 语句时,循环会跳过当前迭代的剩余代码,直接进入下一次迭代。它可以用于跳过某些特定条件下的迭代操作。

for ($i = 1; $i <= 10; $i++) {
    if ($i == 5) {
        break;
    }
    echo $i . " ";
}



for ($i = 1; $i <= 5; $i++) {
    if ($i == 3) {
        continue;
    }
    echo $i . " ";
}

8、日期时间

8.1 时区
  1. PHP.ini 配置 date.timezone = PRC` (不推荐)

  2. 脚本中修改 (推荐使用)

    date_default_timezone_get() //取得当前使用时区
    date_default_timezone_set() //设定当前使用时区
    
8.2 DateTime

PHP提供了一个内置的DateTime类和一些相关的函数,用于处理日期和时间的创建、格式化、计算等操作。

//获取当前日期和时间:
$timeNow = new DateTime(); // 当前日期和时间
$dateNow = $timeNow->format('Y-m-d'); // 当前日期
$timeNow = $timeNow->format('H:i:s'); // 当前时间

//格式化日期和时间:
$dateTime = new DateTime('2021-12-01 14:30:00');
$formattedDateTime = $dateTime->format('Y-m-d H:i:s'); // 格式化为字符串

//解析日期和时间:
$dateString = '2021-12-01 14:30:00';
$dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $dateString); // 解析字符串为日期对象

//计算日期和时间:
$dateTime = new DateTime('2021-12-01');
$dateTime->modify('+1 day'); // 添加一天
$newDate = $dateTime->format('Y-m-d'); // 修改后的日期

//比较日期和时间
$dateTime1 = new DateTime('2021-12-01');
$dateTime2 = new DateTime('2022-01-01');

if ($dateTime1 < $dateTime2) {
    // 日期1早于日期2
}

//格式化输出相对时间:
$dateTime = new DateTime('2021-12-01');
$now = new DateTime();
$diff = $dateTime->diff($now); // 计算日期差
$relativeTime = $diff->format('%y years, %m months, %d days'); // 格式化为相对时间

9、文件引入

includerequireinclude_oncerequire_once是用于在脚本中包含其他文件的语句。它们的功能类似,但在文件包含的方式和错误处理方面有一些不同。

include`:用于包含指定文件,并在包含过程中产生一个警告(非致命错误),如果包含的文件不存在或发生其他错误,脚本会继续执行。

include 'file.php';

require:用于包含指定文件,并在包含过程中产生一个致命错误,如果包含的文件不存在或发生其他错误,脚本会停止执行

require 'file.php';

include_once:与include类似,但是如果同一个文件已经被包含过,include_once会检查并确保文件不会被重复包含。这避免了重复定义函数、类或变量等问题。

include_once 'file.php';

require_once:与require类似,但是如果同一个文件已经被包含过,require_once会检查并确保文件不会被重复包含。这避免了重复定义函数、类或变量等问题。

require_once 'file.php';

使用includerequire语句时,可以包含任何PHP文件,包括库文件、模块文件等。被包含的文件可以是相对于当前脚本文件的路径或绝对路径。

需要注意以下几点:

  • includerequire语句在包含文件时,会创建一个新的局部作用域,包含的文件中定义的函数、类和变量在包含语句后可用。
  • 如果包含的文件中有语法错误或其他错误,include会产生一个警告并继续执行,require会产生一个致命错误并停止执行。
  • include_oncerequire_once语句在包含文件时,会检查文件是否已经被包含过,避免重复包含相同文件。
  • 推荐在包含文件时使用requirerequire_once,因为如果被包含文件是必需的(例如核心库文件),则应该确保它们存在,以避免脚本出现严重错误。

PHP数组知识

1、数组介绍

在PHP中,数组是一种用于存储多个值的数据结构。它是一种有序的、可变长度的容器,可以在其中存储不同类型的数据,包括整数、字符串、对象、甚至其他数组。

在 PHP 中有两种数组:索引数组和关联数组

  • 索引(indexed)数组的索引值是整数,以 0 开始。当通过位置来标识东西时用索引数组。
  • 关联(associative)数组以字符串做为索引值,关联数组更像操作表。索引值为列名,用于访问列的数据

在 PHP 中数组分:一维数组和多维数组

$arr = [1,2,3,4,5]; //索引数组 (一维数组)

$arr[0]; // 读取 结果:1

$arrg = ['name' => '张飞','age' => 18, 'ap'=> 89, 'mp' => 100]; //关联数组 (一维数组)

$arrg['name'];// 读取 结果:'张飞'

//索引数组 (多维数组)
$arrs = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
]; 

$arrs[1][2]; // 读取 结果:6


//关联数组 (多维数组)
$arrgs = [
    [  'name' => '张飞','age' => 18, 'ap'=> 89, 'mp' => 100],
    [  'name' => '刘备','age' => 28, 'ap'=> 69, 'mp' => 100],
    [  'name' => '关羽','age' => 38, 'ap'=> 99, 'mp' => 100],
  ];

$arrgs[1]['name'];  // 读取 结果:'刘备'

2、遍历数组

2.1 使用指针读取数组的值 current() ,next(), prev(), reset(),end(),key(),each()
  1. reset(): 将数组的内部指针重置到数组的第一个元素,并返回该元素的值。
  2. next(): 将数组的内部指针移动到下一个元素,并返回该元素的值。
  3. prev(): 将数组的内部指针移动到上一个元素,并返回该元素的值。
  4. end(): 将数组的内部指针移动到最后一个元素,并返回该元素的值。
  5. key(): 返回数组的当前指针位置的键。
  6. current(): 返回数组的当前指针位置的值。
  7. each(): 返回当前指针位置的键值对,并将指针移动到下一个元素。
$arr = [1,2,3,4,5,6];

echo current($arr);  //结果为: 1
echo next($arr); // 结果为: 2
echo next($arr); // 结果为: 3
echo next($arr); // 结果为: 4
echo next($arr); // 结果为: 5
echo next($arr); // 结果为: 6
echo prev($arr); // 结果为: 5
echo prev($arr); // 结果为: 4
echo prev($arr); // 结果为: 3
echo prev($arr); // 结果为: 2
echo prev($arr); // 结果为: 1
echo prev($arr); // 结果为: false
reset($arr); //重置指针为第一位置
echo current($arr);
.....
    
 $arrgs = [
    [  'name' => '张飞','age' => 18, 'ap'=> 89, 'mp' => 100],
    [  'name' => '刘备','age' => 28, 'ap'=> 69, 'mp' => 100],
    [  'name' => '关羽','age' => 38, 'ap'=> 99, 'mp' => 100],
];

while($arrg = current($arrgs)){
    
    echo "武将:".$arrg['name'].'武力值:'.$arrg['ap'];
    echo "
"
; next($arrgs); } //武将:张飞武力值:89 //武将:刘备武力值:69 //武将:关羽武力值:99

使用指针读取数组数据的一个主要优点是它提供了一种灵活而高效的方式来遍历和访问数组的元素。下面是指针读取数组数据的一些优点:

  1. 直接访问元素:通过使用指针,可以直接访问数组中的特定元素,而无需使用索引或键。这使得代码更简洁和易读。
  2. 灵活的遍历:指针使得遍历数组变得更加灵活。可以自由地在数组中移动指针,访问下一个或上一个元素,或者重置指针到数组的开头。这使得可以根据需要自定义迭代逻辑。
  3. 节省内存:使用指针读取数组数据通常比创建额外的数组副本更节省内存。当处理大型数组时,避免复制整个数组可以减少内存占用。
  4. 高效的数据处理:指针读取数组数据通常比使用循环和索引访问更高效。这是因为指针直接访问内存中的元素,而不需要额外的索引计算或循环迭代。
  5. 支持多维数组:指针读取数组数据对于处理多维数组非常有用。通过移动多个指针,可以轻松地访问多维数组中的元素。

需要注意的是,使用指针读取数组数据也需要小心操作,确保在移动指针时不会超出数组的范围。此外,指针读取数组数据通常适用于线性遍历。

如果需要随机访问数组元素,使用索引或键可能更为适合。

2.2 foreach(), for(), list()
$arrgs = [
    [  'name' => '张飞','age' => 18, 'ap'=> 89, 'mp' => 100],
    [  'name' => '刘备','age' => 28, 'ap'=> 69, 'mp' => 100],
    [  'name' => '关羽','age' => 38, 'ap'=> 99, 'mp' => 100],
];

foreach($arrgs as $key=>$value){

    echo "key".$key.'--------'.$value['name'].'-'.$value['ap'].'
'
; } for($i=0;$i<count($arrgs);$i++){ echo "key".$i.'--------'.$arrgs[$i]['name'].'-'.$arrgs[$i]['ap'].'
'
; } $arr = ['张飞','刘备','关羽']; list($name1,$name2,$name) = $arr; // list(,,$name) = $arr; // list(,,$name) = $arr; // echo $name; 结果: 关羽 echo $name1; // 张飞 注意接收变量的数量需要跟数组元素个数

3、数组常用函数

3.1 数组添加删除元素

array_unshift 在数组开头插入一个或多个元素

array_push 将一个或多个元素压入数组的末尾

array_shift 将数组开头的元素移出数组

array_pop 弹出数组最后一个元素

以上操作都时传址操作!!

$arr = [1,2,3,4,5];

array_unshift($arr,100);
print_r($arr);
echo "
"
; array_push($arr,99); print_r($arr); echo "
"
; array_pop($arr); print_r($arr); echo "
"
; array_shift($arr); print_r($arr); echo "
"
; /*结果 Array ( [0] => 100 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 ) Array ( [0] => 100 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 99 ) Array ( [0] => 100 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 ) Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) */
3.2 计算数组元素个数

count

$num = [1,2,3];
echo count($num); // 结果为:3
3.3 判断元素是否存在数组种

in_array

$image = ['jpg','gif','bmp'];
echo in_array('jpg',$image); //结果为:1 ,即为 true
3.4 判断数组里是否有指定的键名或索引

array_key_exists

$image = ['jpg','gif','bmp'];
$name = ['name'=>'张三','age'=>88,'sex'=>'男'];
$res = array_key_exists(3, $image);
$resName = array_key_exists('name',$name);

echo  $res;  //结果为:null
echo '
'
; echo $resName; //结果为:1
3.5 函数返回包含数组中所有键名的一个新数组

array_keys

$name = ['name'=>'张三','age'=>88,'sex'=>'男'];
$resName = array_keys($name);
print_r($resName);

//Array ( [0] => name [1] => age [2] => sex )
3.6 用回调函数过滤数组中的元素

array_filter

$name =[
    ['name'=>'张三','age'=>12,'sex'=>'男'],
    ['name'=>'张三','age'=>18,'sex'=>'男'],
    ['name'=>'张三','age'=>35,'sex'=>'男'],
    ['name'=>'张三','age'=>45,'sex'=>'男']
] ;

$res = array_filter($name,function ($item){
  return $item['age'] < 40;
});

print_r($res);

/*
Array
(
    [0] => Array
        (
            [name] => 张三
            [age] => 12
            [sex] => 男
        )

    [1] => Array
        (
            [name] => 张三
            [age] => 18
            [sex] => 男
        )

    [2] => Array
        (
            [name] => 张三
            [age] => 35
            [sex] => 男
        )

)
*/



3.7 为数组的每个元素应用回调函数,结果生成新数组

array_map

$name =[
    ['name'=>'张三','age'=>12,'sex'=>'男'],
    ['name'=>'李四','age'=>18,'sex'=>'男'],
] ;

$resNewName = array_map(function($item){
    $newArray = [];
    $newArray['name'] = $item['name'];
    $newArray['age'] = $item['age'] + 10 ;
    $newArray['sex'] = $item['sex'];
    return  $newArray;

}, $name);

print_r($resNewName);
print_r($name);

/*
新数组增加了10岁
Array
(
    [0] => Array
        (
            [name] => 张三
            [age] => 22
            [sex] => 男
        )

    [1] => Array
        (
            [name] => 李四
            [age] => 28
            [sex] => 男
        )

)



原数组不变
Array
(
    [0] => Array
        (
            [name] => 张三
            [age] => 12
            [sex] => 男
        )

    [1] => Array
        (
            [name] => 李四
            [age] => 18
            [sex] => 男
        )

)

*/


3.8 获取数组中所有的值

array_value

$name =[
    ['name'=>'张三','age'=>12,'sex'=>'男'],
    ['name'=>'李四','age'=>18,'sex'=>'男'],
    ['name'=>'王五','age'=>35,'sex'=>'男'],
    ['name'=>'老六','age'=>45,'sex'=>'男']
] ;

foreach ($name as $n){
    print_r(array_values($n));
}

/*
Array
(
    [0] => 张三
    [1] => 12
    [2] => 男
)
Array
(
    [0] => 李四
    [1] => 18
    [2] => 男
)
Array
(
    [0] => 王五
    [1] => 35
    [2] => 男
)
Array
(
    [0] => 老六
    [1] => 45
    [2] => 男
)

*/


3.9 合并一个或多个数组

array_merge

$database = [
    'host'=>'localhost','port'=>3306,'user'=>'user','password'=>''];

print_r(
    array_merge($database, ['user'=>'root','password'=>'admin888'])
);


/*

Array
(
    [host] => localhost
    [port] => 3306
    [user] => root
    [password] => admin888
)
     假如数组key相同,会被覆盖值!!
*/  


3.10 是 PHP 中的一个内置函数,用于将数组的所有键名(key)转换为指定的大小写格式。它返回一个新的数组,其中包含转换后的键名。

可选参数,指定转换后的大小写格式。可以取两个值之一:

  • CASE_LOWER(默认值):将键名转换为小写形式。
  • CASE_UPPER:将键名转换为大写形式。

array_change_key_case

$data = array(
    'FirstName' => 'John',
    'LastName' => 'Doe',
    'Age' => 30
);

$result = array_change_key_case($data, CASE_LOWER);

print_r($result);

如果需要比数组的值转大小写则需要手动实现

function changeValueCase($array, $case) {
    foreach ($array as &$value) {
        if (is_array($value)) {
            $value = changeValueCase($value, $case);
        } else {
            $value = ($case === CASE_LOWER) ? strtolower($value) : strtoupper($value);
        }
    }
    unset($value);
    return $array;
}

$data = array(
    'Name' => 'John',
    'Age' => 30,
    'Email' => '[email protected]'
);

$result = changeValueCase($data, CASE_LOWER);

print_r($result);

/*

Array
(
    [Name] => john
    [Age] => 30
    [Email] => [email protected]
)

*/
3.11 对数组中的每个成员递归地应用用户函数,本函数会递归到更深层的数组中去。

array_walk_recursive

参数说明:

  • &$array:要遍历的数组,需要传递一个引用。
  • $callback:回调函数,用于处理数组中的每个元素。它可以是一个匿名函数、一个函数名或一个类方法。
  • $userdata:可选参数,用户自定义数据,可以在回调函数中使用。
array_walk_recursive(array &$array, callable $callback, mixed $userdata = null): bool
    
    
    function double(&$value)
{
    $value *= 2;
}

$data = array(
    'numbers' => array(1, 2, 3),
    'names' => array('John', 'Jane', 'Jim'),
    'nested' => array(
    'colors' => array('red', 'green', 'blue'),
    'ages' => array(10, 20, 30)
    )
);

array_walk_recursive($data, 'double');

print_r($data);
    
/*
Array
(
    [numbers] => Array
        (
            [0] => 2
            [1] => 4
            [2] => 6
        )

    [names] => Array
        (
            [0] => John
            [1] => Jane
            [2] => Jim
        )

    [nested] => Array
        (
            [colors] => Array
                (
                    [0] => red
                    [1] => green
                    [2] => blue
                )

            [ages] => Array
                (
                    [0] => 20
                    [1] => 40
                    [2] => 60
                )

        )

)



*/

3.12 用于生成一个可用于表示变量的合法 PHP 代码的字符串。它将变量的值转换为字符串,并包含了该值的 PHP 表示形式。

var_export

$data = array(
    'name' => 'John',
    'age' => 30,
    'colors' => array('red', 'green', 'blue')
);

$result = var_export($data, true);

echo $result;

/*
array (
  'name' => 'John',
  'age' => 30,
  'colors' => 
  array (
    0 => 'red',
    1 => 'green',
    2 => 'blue',
  ),
)


*/
3.13 用于将变量序列化为字符串。序列化是将变量的值转换为可存储或传输的格式的过程。序列化后的字符串可以存储到文件中,也可以通过网络传输,并在需要时重新反序列化为原始的 PHP 变量形式。

**serialize ** unserialize

$data = array(
    'name' => 'John',
    'age' => 30,
    'colors' => array('red', 'green', 'blue')
);

$resStr = serialize($data);

echo $resStr;

/*
a:3:{s:4:"name";s:4:"John";s:3:"age";i:30;s:6:"colors";a:3:{i:0;s:3:"red";i:1;s:5:"green";i:2;s:4:"blue";}}
*/

$newStr = unserialize($resStr);

/*
Array
(
    [name] => John
    [age] => 30
    [colors] => Array
        (
            [0] => red
            [1] => green
            [2] => blue
        )
)
*/

php 函数知识

1、函数是介绍

在PHP中,函数是一段可重复使用的代码块,用于执行特定的任务。函数封装了一系列的代码,可以接收参数、执行特定的操作,并返回一个值(可选)。函数的主要目的是提高代码的可维护性和可重用性。

函数可以通过函数名进行调用,并可以传递参数给函数。函数可以执行各种操作,例如计算、数据处理、输出、数据库操作等。通过将一系列操作封装在函数中,可以使代码更加模块化和可读性更高。

在文件头部定义declare(strict_types=1) 为严格模式,这样会对函数参数类型进行严格约束。

declare(strict_types=1);

function  函数名称(类型 参数1,类型 参数2 …):返回值类型 {
	//逻辑代码
	return 返回值; //如需函数有返回值时使用,否则函数返回值为null
}

它是函数在程序代码中的识别名称,函数名可以是以字母或下划线开头后跟零个或多个字母、下划线和数字的任何字符串。函数名不区分大小写。

function myFunc(){}

MYFUNC();
myfeunc();
MyFunC()vardump(function_exists('myFunc'));  //判断函数是否存在

2、参数传递

按值传递参数

在PHP中,函数默认按值传递参数。这意味着函数在接收参数时会创建它们的副本,并在函数内部使用这些副本进行操作,而不会直接修改原始参数的值。

按址传递参数(用“&”符号实现)

在PHP中,函数默认是按值传递参数的,但你可以使用引用(&)来实现按引用传递参数,也称为按地址传递参数。

按引用传递参数允许函数直接访问和修改原始变量的值,而不是创建副本。这意味着在函数内部对参数的修改将影响到原始变量。

$number = 5;
function increment(int $num):void {
    $num = $num + 1;
    echo "函数内Number: " . $num . "\n";
}


echo "原Number: " . $number . "\n";
increment($number);
echo "传参后Number: " . $number . "\n";

//原Number: 5 函数内Number: 6 传参后Number: 5



$number = 5;
function increment(int &$num):void {
    $num = $num + 1;
    echo "函数内Number: " . $num . "\n";
}

echo "原Number: " . $number . "\n";
increment($number);
echo "传参后Number: " . $number . "\n";


//原Number: 5 函数内Number: 6 传参后Number: 6

点语法

当传递的参数数量确定时,可以使用…与变量名。函数的所有参数会成为变量的数组元素。

参数默认值

php 支持函数的默认方式调用。如果在调用函数时没有指定参数的值,在函数中会使用参数的默认值。 默认参数必须列在所有没有默认值参数的后面。

function sum(...$args)
{
    return array_sum($args);
}
echo sum(1, 2, 3);



function say(string $name="张飞"):void{

    echo $name;
    
}

say("马云"); //马云
say();// 张飞

返回值类型

  • int:整数类型

  • float:浮点数类型

  • bool:布尔类型

  • string:字符串类型

  • null:表示无返回值或返回空值

  • array:数组类型

  • object:对象类型

  • callable:可调用类型,包括函数、方法和闭包

  • iterable:可遍历类型,包括数组和实现了Traversable接口的对象

  • 类名:指定返回值类型为特定的类或其子类

  • 接口名:指定返回值类型为特定的接口或其实现类

  • 通过使用typedef关键字创建的自定义类型

  • void:表示函数没有返回值。

  • mixed:表示函数可以返回任意类型的值。

3、变量范围

局部变量

在函数之中声明的变量就是局部变量,并且该变量只有在函数范围之中才能加以使用。如果其它程序局部需要调用使用该变量值时,必须透过「return」指令,来将其传回至主程序区块以作后续处理。

局部变量的作用域仅限于其声明的作用域内部。一旦超出作用域范围,局部变量将不再可用,并且在内存中被释放。这使得局部变量在控制程序的状态和封装数据时非常有用。

function myFunction():void {
    $name = 'John'; // 声明一个局部变量
    echo $name;
}

myFunction(); // 输出:John
echo $name; // 错误,无法访问函数内的局部变量

全局变量

在函数范围之外声明的变量为全局变量,在函数无法直接使用全局变量,函数要使用全局变量,必须要利用 global 引入或 $GLOBALS 超全局数组引入。

注意的是,全局变量的使用应该谨慎,因为它们可以在程序的任何地方被修改,而不受局部作用域的限制。在大型程序中滥用全局变量可能导致代码的可读性和维护性下降。为了避免全局变量的滥用,可以使用面向对象编程的原则,封装数据并通过方法访问和操作数据。

$name = 'John'; // 声明一个全局变量

function myFunction() {
    global $name; // 使用 global 关键字引用全局变量
    echo $name;
}

myFunction(); // 输出:John

静态变量

PHP 支持声明函数变量为静态的(static)。一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化。要声明函数变量为静态的用关键字 static。通常,静态变量的第一次使用时赋予一个初始值。

注意的是,静态变量的生命周期会持续到程序执行结束,除非显式重置或重新赋值。此外,静态变量可以在类之间共享信息,可以用于记录全局状态或跟踪某些计数器等。然而,滥用静态变量可能会导致代码的可读性和维护性下降,因此应该谨慎使用。

function myFunction() {
    static $count = 0;  // 声明一个静态变量
    $count++;
    echo $count;
}

myFunction(); // 输出:1
myFunction(); // 输出:2
myFunction(); // 输出:3

变量函数

在PHP中,变量函数是一种特殊的功能,允许将函数名存储在变量中并使用该变量调用函数。这种灵活性使得可以根据运行时的条件动态地选择要调用的函数。

function greet() {
    echo "Hello, World!";
}
$funcName = "greet"; // 将函数名存储在变量中
$funcName(); // 使用变量函数调用函数,输出:Hello, World!


//例子二

function add($a, $b) {
    return $a + $b;
}

function subtract($a, $b) {
    return $a - $b;
}

function multiply($a, $b) {
    return $a * $b;
}

function divide($a, $b) {
    if ($b != 0) {
        return $a / $b;
    } else {
        return "分母不能为零!";
    }
}

$operator = "multiply"; // 根据需要设置运算符

$a = 10;
$b = 5;

switch ($operator) {
    case "add":
        $result = add($a, $b);
        break;
    case "subtract":
        $result = subtract($a, $b);
        break;
    case "multiply":
        $result = multiply($a, $b);
        break;
    case "divide":
        $result = divide($a, $b);
        break;
    default:
        $result = "无效运算";
        break;
}

echo "结果是: " . $result;

递归函数

递归函数是一种在函数内部调用自身的函数。通过递归,函数可以重复执行相同的操作,直到满足特定的条件为止。在编程中,递归函数通常用于解决可以被分解为相同问题的子问题的情况。注意:使用时必须设置跳出递归的条件,不然就呵呵….

function factorial($n) {
    if ($n === 0 || $n === 1) {
        return 1;
    } else {
        return $n * factorial($n - 1);
    }
}

$result = factorial(5); // 计算 5 的阶乘
echo $result; // 输出:120

PHP命名空间的使用及注意要点

PHP 命名空间是一种组织和管理 PHP 代码的方式。它提供了一种避免命名冲突的机制,特别是当多个开发者或多个代码库在同一个应用程序中使用相同的类名、函数名或常量名时。简单理解就好像操作系统目录文件的概念,同一目录里不能存在两个相同的文件。这个原理就应用到PHP程序设计领域就是命名空间的概念。

基本使用

默认情况下常量、类和函数名都放在全局空间下。命名空间通过 namespace 来声明。

注意:

  1. namespace 必须定义在文件头部,并在declare(strict_types=1) 语句下面。

  2. 实际上,当你在 PHP 代码中没有显式指定命名空间时,会使用默认的全局命名空间,也称为全局作用域。全局作用域中的类、函数和常量可以在任何地方被访问和使用,不需要使用命名空间限定符。

  3. 如果命名空间中的函数或常量未定义,将会使用全局命名空间。

declare(strict_types=1) //严格模式
namespace Person;

class Person {
    // 类的定义
}

function myFunction() {
    // 函数的定义
}

const MY_NAME = '张飞';

//使用方法
use MyNamespace\Person;
use function Person\myFunction;
use const Person\MY_NAME;

$obj = new Person();  // 使用完全限定的类名
myFunction();          // 使用完全限定的函数名
echo MY_NAME;      // 使用完全限定的常量名

引用的方式

使用 use 关键字:通过 use 关键字来导入特定的类、函数或常量,以便在当前文件中直接使用。

use MyNamespace\MyClass;
use function MyNamespace\myFunction;
use const MyNamespace\MY_CONSTANT;

$obj = new MyClass();  // 使用导入的类
myFunction();          // 使用导入的函数
echo MY_CONSTANT;      // 使用导入的常量

使用完全限定的名称:如果没有使用 use 关键字导入命名空间,也可以通过完全限定的名称来访问命名空间中的类、函数和常量。

$obj = new MyNamespace\MyClass();  // 使用完全限定的类名
MyNamespace\myFunction();          // 使用完全限定的函数名
echo MyNamespace\MY_CONSTANT;      // 使用完全限定的常量名

使用别名(Alias):可以通过 use 关键字为命名空间或类创建别名,以便在代码中使用更简短的名称。

use MyNamespace\MyClass as MyClassAlias;
use MyNamespace\myFunction as functionAlias;
use MyNamespace\MY_CONSTANT as CONSTANT_ALIAS;

$obj = new MyClassAlias();  // 使用别名类名
functionAlias();            // 使用别名函数名
echo CONSTANT_ALIAS;        // 使用别名常量名

注意:

多个引入,可以使用多行 use 或用逗号分隔多个类(空间)形式处理多个导入的情况,并使用逗号分隔。

自动加载

在 PHP 中,可以通过使用 spl_autoload_register() 函数来注册自定义的自动加载函数。该函数接受一个回调函数作为参数,当 PHP 遇到未定义的类时,会调用该回调函数来加载类文件。自动加载能够根据类的命名约定自动找到并加载所需的类文件,提高了代码的可维护性和可扩展性。

spl_autoload_register(function ($className) {
    // 转换命名空间分隔符为目录分隔符
    $filePath = str_replace('\\', '/', $className) . '.php';

    if (file_exists($filePath)) {
        require_once($filePath);
    }
});

注意:

自动加载函数的实现可以根据你的项目结构和命名约定进行调整。

例如,你可以将类文件存放在特定目录下,或者使用其他命名约定来匹配类名和文件路径。

推荐使用composer管理项目和自动加载

composer的安装搭建可以自行研究,这不难~

使用方法:

1、进入项目的根目录,并初始化

composer init

2、修改配置文件

个性 composer.json 配置文件,其中 autoload配置项是自动加载设置。

  • files 是自动加载文件列表,适合于加载函数
  • psr-4 自动加载命名空间与目录对应关系

当今最强大的PHP技巧,让你成为编程巨匠_第1张图片

修改配置文件后执行 composer install 生成 vendor,如果修改过配置文件需要执行 composer update

3、配置

在项目中使用以下代码即可完成自动加载。

include 'vendor/autoload.php';

PHP文件与目录

disk_total_space 返回目标磁盘总空间

disk_free_space返回目标磁盘剩余空间

$diskSpaceRes = disk_total_space(__DIR__ ) / pow(1024, 3);
$diskFreeRes =  number_format( disk_free_space(__DIR__)/pow(1024,3), 3);
echo sprintf( "%.3f"."
"
, $diskSpaceRes); echo $diskFreeRes;

filesize 返回目标文件大小(单位:字节)

$file = number_format(filesize('./test.mp4') / pow(1024, 1), 2) ."KB";
echo $file; // 712.05KB

常用简单函数

函数名 用途
is_writable 判断给定的文件名是否可写
is_readable 判断给定文件名是否可读
file_exists 检查文件或目录是否存在
is_file 判断给定文件名是否为一个正常的文件
is_dir 判断给定文件名是否是一个目录。
filemtime 回文件中的数据块上次被写入的时间(时间戳)
basename 返回路径中的文件名部分
dirname 返回路径中的目录部分
mkdir 支持递归的目录创建,参数分别是:目录、权限位、递归创建
rmdir 删除指定的目录,该目录必须是空的,而且要有相应的权限。
rename 重命名一个文件或目录,也可以进行文件移动。
copy 复制文件

fopen 用于打开文件或 URL 的函数。它用于创建一个文件指针,使您能够对文件进行读取、写入和其他操作。

mode 说明
‘r’ 只读方式打开,将文件指针指向文件头。
‘r+’ 读写方式打开,将文件指针指向文件头。
‘w’ 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘w+’ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘a’ 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘a+’ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘x’ 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。
‘x+’ 创建并以读写方式打开,其他的行为和 ‘x’ 一样。
// 打开一个只读模式的文件
$handle = fopen('file.txt', 'r');

// 打开一个只写模式的文件,并将内容写入其中
$handle = fopen('file.txt', 'w');
fwrite($handle, 'Hello, World!');
fclose($handle);

// 打开一个追加模式的文件,并将内容追加到末尾
$handle = fopen('file.txt', 'a');
fwrite($handle, 'More content.');
fclose($handle);

注意:fopen() 打开文件后切记关闭文件指针! fclose();

fread 所读取的字符串, 或者在失败时返回 FALSE

function fread($stream, int $length): string|false {}  

fseek 可以在打开的文件中移动文件指针的位置,以便在不同位置进行读取和写入操作。

0 表示成功,返回 -1 表示失败

  • $handle:打开的文件指针资源。

  • $offset:要移动的字节数。

  •   $whence
    

    (可选):指定偏移量的基准位置。可使用以下常量之一:

    • SEEK_SET:从文件开头开始计算偏移量。
    • SEEK_CUR:从当前位置开始计算偏移量。
    • SEEK_END:从文件末尾开始计算偏移量。
$file = fopen('file.txt', 'r');
// 将文件指针移动到文件的第 10 个字节处
fseek($file, 10, SEEK_SET);
// 从当前位置向后移动 5 个字节
fseek($file, 5, SEEK_CUR);
// 从文件末尾向前移动 20 个字节
fseek($file, -20, SEEK_END);
fclose($file);


//例子:
$data = "./test.txt";
$f = fopen($data,'r');
fseek($f,200, 0);
$content = "";
while (!feof($f)){
    $content .= fread($f , 1024);
}
fclose($f);
echo $content;


**fwrite 写入文件,返回写入的字符数,出现错误时则返回 **FALSE

fclose 关闭一个已打开的文件指针

feof 测试文件指针是否到了文件结束的位置

$handle = fopen('./text.txt','w+');
fwrite($handle,'Hello php');
fseek($handle, 0);
echo fread($handle, 999);
fclose($handle);

fgetc 读取一个字符

fgets 读取一行内容

fgetss 从文件指针中读取一行并过滤掉 HTML 标记。参数分别表示:资源对象、读取数量、允许标签。

fgetcsv 从文件指针中读入一行并解析 CSV 字段。

readfile 读取文件全部内容 (大文件慎用)

$data = './test.txt';
$handle = fopen($data,'r+');
while ($s = fgetc($handle)){
    echo $s;
}
while ($s = fgets($handle)){
    echo $s;
}
fclose($handle);


$handle = fopen('index.html','rb');
while(!feof($handle)){
    echo fgetss($handle,20,'

'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'./customer.csv'</span><span class="token punctuation">;</span> <span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'r'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$res</span> <span class="token operator">=</span> <span class="token function">fgetcsv</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token operator">!==</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">print_r</span><span class="token punctuation">(</span><span class="token variable">$res</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-type:image/jpeg'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">readfile</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user.jpeg'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>flock</strong> <strong>锁定文件操作,如果使用<code>flock</code> 锁定文件,必须保证在所有使用文件地方执行 <code>flock</code> 才有意义。如果过早的系统因为不支持锁定操作,函数执行将没有效果如 FAT 系统。</strong></p> <table> <thead> <tr> <th>锁定方式</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><strong>LOCK_SH</strong></td> <td>取得共享锁定(读取的程序)</td> </tr> <tr> <td><strong>LOCK_EX</strong></td> <td>取得独占锁定(写入的程序)</td> </tr> <tr> <td><strong>LOCK_UN</strong></td> <td>释放锁定(无论共享或独占)</td> </tr> <tr> <td><strong>LOCK_NB</strong></td> <td>无法建立锁定时,此操作可不被阻断,马上返回进程。通常与 LOCK_SH 或 LOCK_EX 做 OR(|)组合使用。(Windows 系统上还不支持)</td> </tr> </tbody> </table> <pre><code class="prism language-php"><span class="token comment">//写锁 LOCK_SH</span> <span class="token comment">// 1.php</span> <span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'demo.txt'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'rb'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stat</span> <span class="token operator">=</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_SH</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">fgetss</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_UN</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//2.php</span> <span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'demo.txt'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'rb'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stat</span> <span class="token operator">=</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_SH</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">fgetss</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_UN</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//读锁 LOCK_EX</span> <span class="token comment">//1.php</span> <span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'demo.txt'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'rb'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stat</span> <span class="token operator">=</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_EX</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">fgetss</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_UN</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//2.php</span> <span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'demo.txt'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'rb'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stat</span> <span class="token operator">=</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_SH</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">fgetss</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_UN</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>防止阻塞</strong></p> <pre><code class="prism language-php"><span class="token comment">//1.php</span> <span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'demo.txt'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'ab'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stat</span> <span class="token operator">=</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_EX</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">fgetss</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_UN</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//2.php</span> <span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'demo.txt'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'ab'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stat</span> <span class="token operator">=</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token class-name">LOCK_SH</span> <span class="token operator">|</span> <span class="token class-name">LOCK_NB</span><span class="token punctuation">,</span><span class="token variable">$wouldblock</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$stat</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$d</span> <span class="token operator">=</span> <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'Hello Php!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">fgetss</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'file is locked'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span><span class="token constant">LOCK_UN</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>file_put_contents 将一个字符串写入文件。</strong></p> <p><strong>file_get_content 将整个文件读入一个字符串,如果打开远程文件需要开启 php.ini 中的 <code>allow_url_fopen</code> 选项。</strong></p> <pre><code class="prism language-php"><span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'demo.txt'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'hello php'</span><span class="token punctuation">,</span><span class="token constant">FILE_APPEND</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//FILE_APPEND 文件后面追加</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'demo.txt'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'https://bing.com'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>var_export</strong></p> <p>输出或返回一个变量的字符串表示。</p> <p>下面是将数组保存到文件中的代码,并支持 include 获取数组数据。</p> <pre><code class="prism language-php"><span class="token variable">$user</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token operator">=></span><span class="token string single-quoted-string">'刘备'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token operator">=></span><span class="token string single-quoted-string">'关羽'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token operator">=></span><span class="token string single-quoted-string">'张飞'</span><span class="token punctuation">]</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$content</span> <span class="token operator">=</span><span class="token function">var_export</span><span class="token punctuation">(</span><span class="token variable">$user</span><span class="token punctuation">,</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users.php'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'<?php return '</span><span class="token operator">.</span><span class="token variable">$content</span><span class="token operator">.</span><span class="token string single-quoted-string">';'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>opendir 函数类似于 fopen 操作方式,可能获取目录指针读取目录</strong></p> <p><strong>scandir 列出指定路径中的文件和目录</strong></p> <pre><code class="prism language-php"><span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">opendir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'../php'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token constant boolean">false</span><span class="token operator">!==</span><span class="token punctuation">(</span><span class="token variable">$file</span> <span class="token operator">=</span> <span class="token function">readdir</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'.'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token function">filetype</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"\t"</span><span class="token operator">.</span><span class="token variable">$file</span><span class="token operator">.</span><span class="token string single-quoted-string">'<br/>'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">closedir</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token function">scandir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'../php'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$file</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'.'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token function">filetype</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"\t\t"</span><span class="token operator">.</span><span class="token variable">$file</span><span class="token operator">.</span><span class="token string single-quoted-string">'<hr/>'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p><strong>glob 寻找与模式匹配的文件路径。</strong></p> <table> <thead> <tr> <th>选项</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>GLOB_MARK</td> <td>在每个返回的项目中加一个斜线</td> </tr> <tr> <td>GLOB_NOSORT</td> <td>按照文件在目录中出现的原始顺序返回(不排序)</td> </tr> <tr> <td>GLOB_NOCHECK</td> <td>如果没有文件匹配则返回用于搜索的模式</td> </tr> <tr> <td>GLOB_ERR</td> <td>停止并读取错误信息(比如说不可读的目录),默认的情况下忽略所有错误</td> </tr> <tr> <td>GLOB_BRACE</td> <td>设置多个匹配模式,如:{<em>.php,</em>.txt}</td> </tr> </tbody> </table> <p><strong>遍历目录</strong></p> <pre><code class="prism language-text">$files = glob('../../*'); print_r($files); </code></pre> <p><strong>指定检索文件类型</strong></p> <pre><code class="prism language-text">$files = glob('*.php', GLOB_ERR); </code></pre> <p><strong>设置多个匹配模式</strong></p> <pre><code class="prism language-text">$files = glob("{*.php,*.txt}", GLOB_BRACE); print_r($files); </code></pre> <p><strong>目录大小</strong></p> <pre><code class="prism language-text">function dirSize($dir):int { $size= 0; foreach (glob($dir.'/*') as $file) { $size += is_file($file)?filesize($file):dirSize($file); } return $size; } echo round(dirSize('/home/vagrant')/1024/1024).'MB'; </code></pre> <p><strong>删除目录</strong></p> <pre><code class="prism language-text">function delDir($dir):bool { if (!is_dir($dir)) { return true; } foreach (glob($dir.'/*') as $file) { is_file($file)?unlink($file):delDir($file); } return rmdir($dir); } delDir('../php2'); </code></pre> <p><strong>复制目录</strong></p> <pre><code class="prism language-text">function copyDir($dir, $to):bool { is_dir($to) or mkdir($to, 0755, true); foreach (glob($dir.'/*') as $file) { $target = $to.'/'.basename($file); is_file($file)?copy($file, $target):copyDir($file, $target); } return true; } copyDir('../php', '../php2'); </code></pre> <p><strong>移动目录</strong></p> <p>移动目录分两步执行,第一步是复制目录,第二步是删除目录,所以使用上面两个函数的综合即可以。</p> <pre><code class="prism language-text">function moveDir($dir, $to):bool { copyDir($dir, $to); return delDir($dir); } </code></pre> <h3>PHP文件上传下载</h3> <h4>1、环境配置</h4> <p>修改 PHP.ini 配置文件可以定制上传机制,通过 phpinfo() 函数可以查看到 PHP.ini 文件所在位置。</p> <table> <thead> <tr> <th>配置</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>file_uploads</td> <td>是否允许上传文件,On 开启 Off 禁止上传</td> </tr> <tr> <td>upload_tmp_dir</td> <td>文件上传过程中临时保存的目录,默认保存位置为 /tmp</td> </tr> <tr> <td>upload_max_filesize</td> <td>允许上传的最大文件大小,可以使用 K、M、G 单位如 2M</td> </tr> <tr> <td>post_max_size</td> <td>PHP 将接受的最大 POST 数据大小,包括上传文件、表单数据。所以 post_max_size 要大于 upload_max_filesize</td> </tr> <tr> <td>max_file_uploads</td> <td>单个请求时,允许上传的最大文件数量</td> </tr> </tbody> </table> <h4>2、超全局数组</h4> <p>上传的文件保存在 <code>$_FILES</code> 超全局数组中,具体参数说明如下:</p> <table> <thead> <tr> <th>选项</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>tmp_name</td> <td>临时文件名</td> </tr> <tr> <td>name</td> <td>上传文件原文件名</td> </tr> <tr> <td>type</td> <td>文件 MIME 类型</td> </tr> <tr> <td>error</td> <td>错误编号</td> </tr> <tr> <td>size</td> <td>文件大小,单位字节</td> </tr> </tbody> </table> <pre><code class="prism language-php"><span class="token comment">//index.html </span> <span class="token operator"><</span>form action<span class="token operator">=</span><span class="token string double-quoted-string">"./server.php"</span> enctype<span class="token operator">=</span><span class="token string double-quoted-string">"multipart/form-data"</span> method<span class="token operator">=</span><span class="token string double-quoted-string">"post"</span><span class="token operator">></span> <span class="token operator"><</span>label<span class="token operator">></span> <span class="token operator"><</span>input type<span class="token operator">=</span><span class="token string double-quoted-string">"file"</span> name<span class="token operator">=</span><span class="token string double-quoted-string">"files"</span> value<span class="token operator">=</span><span class="token string double-quoted-string">""</span> <span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>label<span class="token operator">></span> <span class="token operator"><</span>button type<span class="token operator">=</span><span class="token string double-quoted-string">"submit"</span><span class="token operator">></span>提交<span class="token operator"><</span><span class="token operator">/</span>button<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>form<span class="token operator">></span> <span class="token comment">//server.php</span> <span class="token function">print_r</span><span class="token punctuation">(</span><span class="token variable">$_FILES</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* Array ( [files] => Array ( [name] => Key.txt [full_path] => Key.txt [type] => text/plain [tmp_name] => C:\wamp64\tmp\php665C.tmp [error] => 0 [size] => 54 ) ) */</span> </code></pre> <h4>3、错误说明</h4> <p><strong>上传出错会在$_FILES[‘error’] 选项中体现,具体错误说明如下:</strong></p> <ul> <li> <p><code>UPLOAD_ERR_OK</code> (0): 没有错误,文件上传成功。</p> </li> <li> <p><code>UPLOAD_ERR_INI_SIZE</code> (1): 上传的文件大小超过了php.ini中<code>upload_max_filesize</code>指令所设置的大小限制。</p> </li> <li> <p><code>UPLOAD_ERR_FORM_SIZE</code> (2): 上传的文件大小超过了HTML表单中<code>MAX_FILE_SIZE</code>指令所设置的大小限制。</p> </li> <li> <p><code>UPLOAD_ERR_PARTIAL</code> (3): 文件只有部分被上传。</p> </li> <li> <p><code>UPLOAD_ERR_NO_FILE</code> (4): 没有文件被上传。</p> </li> <li> <p><code>UPLOAD_ERR_NO_TMP_DIR</code> (6): 找不到临时文件夹。</p> </li> <li> <p><code>UPLOAD_ERR_CANT_WRITE</code> (7): 文件写入失败。</p> </li> <li> <p><code>UPLOAD_ERR_EXTENSION</code> (8): 由于PHP扩展的限制,文件上传被停止。</p> </li> </ul> <h4>4、上传安全</h4> <p>检测文件是否是合法的上传文件,以保证安全。</p> <pre><code class="prism language-text"><?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 检查文件是否成功上传 if (isset($_FILES['file_name']) && $_FILES['file_name']['error'] === UPLOAD_ERR_OK) { // 文件上传成功 $tempFilePath = $_FILES['file_name']['tmp_name']; $fileName = $_FILES['file_name']['name']; // 执行进一步的处理操作 // ... echo "文件上传成功!"; } else { // 文件上传失败或未选择文件 echo "文件上传失败!"; } } ?> </code></pre> <h4>5、处理类</h4> <p>下面是支持单文件、多文件上传的处理类。</p> <p><strong>index.html</strong></p> <pre><code class="prism language-text"><form action="./server.php" method="post" enctype="multipart/form-data"> <input type="file" name="image"> <input type="file" name="image[]"> <input type="file" name="image[]"> <button class="btn">提交</button> </form> </code></pre> <p><strong>server.php</strong></p> <pre><code class="prism language-text">if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 检查是否有文件上传 if (isset($_FILES['images'])) { $fileCount = count($_FILES['images']['name']); // 遍历每个上传的文件 for ($i = 0; $i < $fileCount; $i++) { // 检查文件是否成功上传 if ($_FILES['images']['error'][$i] === UPLOAD_ERR_OK) { $tempFilePath = $_FILES['images']['tmp_name'][$i]; $fileName = $_FILES['images']['name'][$i]; // 执行进一步的处理操作 // ... echo "文件 $fileName 上传成功!<br>"; } else { // 文件上传失败或未选择文件 echo "文件上传失败!<br>"; } } } else { // 没有文件被上传 echo "没有文件被上传!<br>"; } } </code></pre> <h4>6、文件下载</h4> <pre><code class="prism language-text">$file = "dog.jpg"; $fileName = basename($file); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename={$fileName}"); header("Accept-ranges: bytes"); header("Content-Length: " . filesize($file)); readfile($file); </code></pre> <h3>PHP错误处理和异常处理</h3> <p>1、<strong>错误处理的分类</strong></p> <p>​ <strong>语法错误: 违背了PHP程序语言的规则错误,称之为语法错误。</strong></p> <p>​ <strong>运行错误: 经过语法错误检测后,将开始运行 PHP 代码,在此发生的错误为运行时错误。</strong></p> <p>​ <strong>逻辑错误: 逻辑错误是指程序开发过程中由于业务逻辑造成错误。</strong></p> <pre><code class="prism language-php"><span class="token function">print_r</span><span class="token punctuation">(</span>数组类型<span class="token punctuation">)</span> <span class="token comment">//没有以分号结束语句,报语法错误</span> <span class="token comment">/* 加载不存在文件 连接数据库失败 远程请求失败 函数或类不存在 */</span> <span class="token keyword">require</span> <span class="token string single-quoted-string">'request.php'</span><span class="token punctuation">;</span> <span class="token comment">//因为加载不存在文件,所以会发生运行时错误</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token number">10</span><span class="token operator">/</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//逻辑错误,这IDE都会检测到,一般都有提示</span> <span class="token comment">//逻辑错误</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token variable">$i</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>2、<strong>常见错误报告类型</strong></p> <table> <thead> <tr> <th align="left">值</th> <th align="left">常量</th> <th align="left">描述</th> </tr> </thead> <tbody> <tr> <td align="left">1</td> <td align="left">E_ERROR</td> <td align="left">致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行</td> </tr> <tr> <td align="left">2</td> <td align="left">E_WARNING</td> <td align="left">运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。</td> </tr> <tr> <td align="left">8</td> <td align="left">E_NOTICE</td> <td align="left">运行时通知。表示脚本遇到可能会表现为错误的情况。</td> </tr> <tr> <td align="left">64</td> <td align="left">E_COMPILE_ERROR</td> <td align="left">致命编译时错误。类似 E_ERROR</td> </tr> <tr> <td align="left">2048</td> <td align="left">E_STRICT</td> <td align="left">启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。</td> </tr> <tr> <td align="left">8192</td> <td align="left">E_DEPRECATED</td> <td align="left">运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。</td> </tr> <tr> <td align="left">8191</td> <td align="left">E_ALL</td> <td align="left">所有错误和警告,除级别 E_STRICT 以外。</td> </tr> </tbody> </table> <p><strong>注意:修改 <code>php.ini</code> 配置文件, <code>display_errors = On</code> 即开启或者关闭错误显示。</strong></p> <p><strong>关闭警告与致命错误</strong></p> <pre><code class="prism language-text">error_reporting(~E_WARNING & ~E_COMPILE_ERROR); require('a'); </code></pre> <p><strong>显示除通知外的所有错误</strong></p> <pre><code class="prism language-text">error_reporting(E_ALL & ~E_NOTICE); echo $arrays; </code></pre> <p><strong>关闭错误显示</strong></p> <pre><code class="prism language-text">error_reporting(0); </code></pre> <p><strong>3、异常处理</strong></p> <p><strong>基本语法:</strong></p> <pre><code class="prism language-php"><span class="token keyword">try</span><span class="token punctuation">{</span> <span class="token comment">//逻辑代码</span> <span class="token punctuation">}</span><span class="token keyword">catch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//捕获异常时候的处理</span> <span class="token punctuation">}</span> </code></pre> <p><strong>注意: 需要手动抛出异常,这与其他语言不同,异常使用 try…cache 触发。</strong></p> <p><strong>手动抛出异常的方法:</strong></p> <pre><code class="prism language-php"><span class="token keyword">throw</span> <span class="token keyword">new</span> 错误类型<span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">,</span> <span class="token variable">$code</span><span class="token punctuation">)</span>; </code></pre> <p><strong>注意:可以设置多个catch,参数Exception 或者继承Exception的类</strong></p> <p><strong>Exception 类的方法:</strong></p> <table> <thead> <tr> <th>方法</th> <th>说明</th> <th>重写</th> </tr> </thead> <tbody> <tr> <td>getFile</td> <td>产生异常错误的文件</td> <td>NO,final</td> </tr> <tr> <td>getCode</td> <td>错误码</td> <td>NO,final</td> </tr> <tr> <td>getLine</td> <td>错误行号</td> <td>NO,final</td> </tr> <tr> <td>getMessage</td> <td>错误消息</td> <td>NO,final</td> </tr> <tr> <td>__toString</td> <td>对象转字符串后输出内容</td> <td>YES</td> </tr> </tbody> </table> <p><strong>finally: 需要放在 <code>catch</code> 后,<code>finally</code>无论是否抛出异常都会执行。</strong></p> <p><strong>登录异常处理的例子:</strong></p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">LoginException</span> <span class="token keyword">extends</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> <span class="token comment">// 构造函数</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">,</span> <span class="token variable">$code</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token class-name type-declaration">Throwable</span> <span class="token variable">$previous</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword static-context">parent</span><span class="token operator">::</span><span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">,</span> <span class="token variable">$code</span><span class="token punctuation">,</span> <span class="token variable">$previous</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 将异常对象转为字符串</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant">__CLASS__</span> <span class="token operator">.</span> <span class="token string double-quoted-string">": [<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">code</span><span class="token punctuation">}</span></span>]: <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">message</span><span class="token punctuation">}</span></span>\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 自定义异常处理函数</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">logError</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 记录登录错误日志</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"登录异常: "</span> <span class="token operator">.</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">loginUser</span><span class="token punctuation">(</span><span class="token variable">$username</span><span class="token punctuation">,</span> <span class="token variable">$password</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 模拟登录逻辑</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$username</span> <span class="token operator">!==</span> <span class="token string double-quoted-string">"admin"</span> <span class="token operator">||</span> <span class="token variable">$password</span> <span class="token operator">!==</span> <span class="token string double-quoted-string">"password"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">LoginException</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"无效的用户名或密码。"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 登录成功</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$loggedIn</span> <span class="token operator">=</span> <span class="token function">loginUser</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"guest"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"pass123"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 尝试登录</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$loggedIn</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"登录成功!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">LoginException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 捕获登录异常</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"登录失败:"</span> <span class="token operator">.</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">logError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 调用自定义异常处理函数,记录登录错误日志</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 捕获其他异常</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"发生了一个错误:"</span> <span class="token operator">.</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p><strong>操作数据库多表联动时捕获异常回滚数据:</strong></p> <pre><code class="prism language-php"><span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">// 连接数据库</span> <span class="token variable">$db</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PDO</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"mysql:host=localhost;dbname=mydatabase"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"username"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"password"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 开始事务</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">beginTransaction</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 执行一系列数据库操作</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 1, 2)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 提交事务</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 捕获 PDO 异常</span> <span class="token comment">// 回滚事务</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">rollBack</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 记录异常日志</span> <span class="token function">error_log</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"数据库操作异常: "</span> <span class="token operator">.</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出错误信息</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"发生了一个数据库操作异常:"</span> <span class="token operator">.</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p><strong>总结:</strong></p> <ol> <li> <p>异常处理应该是<strong>有针对性</strong>的:<strong>捕获和处理那些你知道如何处理的异常类型</strong>,而将未知或不可处理的异常传递给更上层的代码进行处理。</p> </li> <li> <p>使用合适的异常类型:PHP 中有许多内置的异常类型,如 <code>Exception</code>、<code>InvalidArgumentException</code>、<code>RuntimeException</code> 等。<strong>选择合适的异常类型</strong>可以更好地组织和识别代码中的异常情况。</p> </li> <li> <p>按照异常类型的顺序进行捕获:在 <code>catch</code> 块中,应该按照特定异常类型到更一般<strong>异常类型的顺序进行排序</strong>。这样可以确保异常被正确捕获,并且避免特定的异常被更一般的异常类型捕获导致无法执行特定的异常处理逻辑。</p> </li> <li> <p>使用多个 <code>catch</code> 块进行处理:根据不同的异常类型,使用多个 <code>catch</code> 块来处理不同类型的异常。这样可以更细粒度地处理异常,并根据需要执行特定的逻辑。</p> </li> <li> <p>考虑添加日志或错误记录:在异常处理过程中,可以<strong>将异常信息记录到日志文件或错误日志中</strong>,以便后续的故障排查和分析。</p> </li> <li> <p>避免过度捕获异常:不要过度捕获异常,这可能导致隐藏潜在的问题或掩盖错误。只捕获你知道如何处理的异常,并将其他未处理的异常传递给更上层的代码进行处理。</p> </li> <li> <p>使用 <code>finally</code> 块(可选):<code>finally</code> 块中的代码无论是否发生异常都会执行。它通常用于释放资源或执行清理操作,以确保在异常发生时资源得到正确处理。</p> </li> <li> <p>抛出自定义异常:通过定义自定义异常类,可以更好地组织和标识特定类型的异常。这样可以使代码更加清晰,并提供更丰富的异常信息。</p> </li> </ol> <h3>PHP操作MYSQL数据库</h3> <p><strong>PHP 操作数据库的方式有多种如 <code>mysql</code> 、<code>mysqli</code>、<code>PDO</code>,目前主要使用的是 PDO 处理。</strong></p> <p><strong>MySQLi或PDO扩展来操作MySQL数据库。这两个扩展提供了一组函数和方法,用于连接到数据库、执行查询、插入、更新和删除数据等操作。</strong></p> <p><strong>PDO 提供了一个数据访问抽象层,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。</strong></p> <pre><code class="prism language-php"><span class="token comment">// 数据库连接配置</span> <span class="token variable">$servername</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"localhost"</span><span class="token punctuation">;</span> <span class="token variable">$username</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_username"</span><span class="token punctuation">;</span> <span class="token variable">$password</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_password"</span><span class="token punctuation">;</span> <span class="token variable">$database</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_database"</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">// 创建数据库连接</span> <span class="token variable">$conn</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PDO</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"mysql:host=<span class="token interpolation"><span class="token variable">$servername</span></span>;dbname=<span class="token interpolation"><span class="token variable">$database</span></span>"</span><span class="token punctuation">,</span> <span class="token variable">$username</span><span class="token punctuation">,</span> <span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 设置错误模式为异常</span> <span class="token variable">$conn</span><span class="token operator">-></span><span class="token function">setAttribute</span><span class="token punctuation">(</span><span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ATTR_ERRMODE</span><span class="token punctuation">,</span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ERRMODE_EXCEPTION</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 执行查询</span> <span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT * FROM your_table"</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token variable">$conn</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 处理查询结果</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">fetchAll</span><span class="token punctuation">(</span><span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">FETCH_ASSOC</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$result</span> <span class="token keyword">as</span> <span class="token variable">$row</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"ID: "</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'id'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">", Name: "</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"连接失败: "</span> <span class="token operator">.</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 关闭数据库连接</span> <span class="token variable">$conn</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span> </code></pre> <p><strong>PDO的错误处理</strong></p> <table> <thead> <tr> <th>错误类型</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>PDO::ERRMODE_SILENT</td> <td>不显示错误</td> </tr> <tr> <td>PDO::ERRMODE_WARNING</td> <td>显示警告错误</td> </tr> <tr> <td>PDO::ERRMODE_EXCEPTION</td> <td>抛出异常</td> </tr> </tbody> </table> <p><strong>MySQLi扩展连接到MySQL数据库,并执行查询操作:</strong></p> <pre><code class="prism language-php"><span class="token comment">// 数据库连接配置</span> <span class="token variable">$servername</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"localhost"</span><span class="token punctuation">;</span> <span class="token variable">$username</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_username"</span><span class="token punctuation">;</span> <span class="token variable">$password</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_password"</span><span class="token punctuation">;</span> <span class="token variable">$database</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_database"</span><span class="token punctuation">;</span> <span class="token comment">// 创建数据库连接</span> <span class="token variable">$conn</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">mysqli</span><span class="token punctuation">(</span><span class="token variable">$servername</span><span class="token punctuation">,</span> <span class="token variable">$username</span><span class="token punctuation">,</span> <span class="token variable">$password</span><span class="token punctuation">,</span> <span class="token variable">$database</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 检查连接是否成功</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$conn</span><span class="token operator">-></span><span class="token property">connect_error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"连接失败: "</span> <span class="token operator">.</span> <span class="token variable">$conn</span><span class="token operator">-></span><span class="token property">connect_error</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 执行查询</span> <span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT * FROM your_table"</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$conn</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 处理查询结果</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$result</span><span class="token operator">-></span><span class="token property">num_rows</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token variable">$row</span> <span class="token operator">=</span> <span class="token variable">$result</span><span class="token operator">-></span><span class="token function">fetch_assoc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"ID: "</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">", Name: "</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"name"</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"没有结果"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 关闭数据库连接</span> <span class="token variable">$conn</span><span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>常见的MySQLi错误类型:</strong></p> <ol> <li>连接错误(Connection Errors): <ul> <li><code>mysqli_connect_errno()</code>:返回连接错误的错误代码。</li> <li><code>mysqli_connect_error()</code>:返回连接错误的错误消息。</li> </ul> </li> <li>查询错误(Query Errors): <ul> <li><code>mysqli_errno($conn)</code>:返回最近一次查询错误的错误代码。</li> <li><code>mysqli_error($conn)</code>:返回最近一次查询错误的错误消息。</li> </ul> </li> <li>语法错误(Syntax Errors): <ul> <li><code>mysqli_sqlstate($conn)</code>:返回最近一次查询的SQL状态码,用于识别语法错误等。</li> </ul> </li> <li>预处理错误(Prepared Statement Errors): <ul> <li><code>mysqli_stmt_errno($stmt)</code>:返回预处理语句错误的错误代码。</li> <li><code>mysqli_stmt_error($stmt)</code>:返回预处理语句错误的错误消息。</li> </ul> </li> </ol> <p><strong>下面是PDO的常用函数:</strong></p> <p><em>连接时设置错误类型</em></p> <pre><code class="prism language-php"><span class="token variable">$pdo</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PDO</span><span class="token punctuation">(</span><span class="token variable">$dns</span><span class="token punctuation">,</span> <span class="token variable">$config</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$config</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'password'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ATTR_ERRMODE</span> <span class="token operator">=></span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ERRMODE_EXCEPTION</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><em>使用 <code>setAttribute</code> 方法设置错误处理方式</em></p> <pre><code class="prism language-text">$pdo = new PDO($dns, $config['user'], $config['password']); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); </code></pre> <p><em>exec执行SQL</em></p> <pre><code class="prism language-php"><span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"INSERT INTO news (title) VALUES('php_project')"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"自增主键:"</span><span class="token operator">.</span><span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">lastInsertId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$affectedRows</span> <span class="token operator">=</span> <span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"DELETE FROM news WHERE id>3"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"受影响的条数:"</span><span class="token operator">.</span><span class="token variable">$affectedRows</span><span class="token punctuation">;</span> </code></pre> <p><em>fetchAll</em> 一次获取所有结果</p> <pre><code class="prism language-text">... $query = $pdo->query("select * from goods"); $rows = $query->fetchAll(); print_r($rows); ... </code></pre> <p><em>fetch</em> 每次获取结果中的一条数据</p> <pre><code class="prism language-text">... $pdo = new PDO($dns, $config['user'], $config['password']); $query = $pdo->query("select * from goods"); while ($field = $query->fetch(PDO::FETCH_ASSOC)) { echo sprintf("编号:%s\t名称:%s<br/>", $field['id'], $field['title']); } </code></pre> <p><strong>SQL 注入</strong></p> <pre><code class="prism language-text">$query = $pdo->query("SELECT * FROM news WHERE id={$_GET['id']}"); </code></pre> <p><em>如果 GET 参数如下将产生 SQL 注入</em></p> <pre><code class="prism language-text">http://ss-s.cc/test/1.php?id=1 or id>1 </code></pre> <p><strong>使用预准备</strong></p> <p><em>下面使用参数绑定来执行预准备的查询操作</em></p> <pre><code class="prism language-text">$sql = "SELECT * FROM news WHERE id=:id"; $sth = $pdo->prepare($sql); $sth->execute(['id' => $_GET['id']]); $rows = $sth->fetchAll(PDO::FETCH_ASSOC); print_r($rows); </code></pre> <p><em>下面使用参数绑定形式的预准备操作执行添加操作</em></p> <pre><code class="prism language-text">$sql = "INSERT INTO news (title) VALUES(:title)"; $sth = $pdo->prepare($sql); $sth->execute(['title'=>'ss-s.cc']); echo $pdo->lastInsertId(); </code></pre> <p><strong>占位符</strong></p> <p><em>使用问号占位符是另一种使用预准备的方式</em></p> <pre><code class="prism language-text">$sth = $pdo->prepare("SELECT * FROM news WHERE id>?"); $sth->execute([3]); print_r($sth->fetchAll()); </code></pre> <p><em>使用占位符来执行添加操作</em></p> <pre><code class="prism language-text">$sql = "INSERT INTO news (title) VALUES(?)"; $sth = $pdo->prepare($sql); $sth->execute(['ss-s.cc']); echo $pdo->lastInsertId(); </code></pre> <p>以下是封装好链式调用的一个类:</p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">QueryBuilder</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token variable">$pdo</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$table</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$select</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'*'</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$where</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$groupBy</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$orderBy</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">PDO</span> <span class="token variable">$pdo</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">pdo</span> <span class="token operator">=</span> <span class="token variable">$pdo</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">table</span><span class="token punctuation">(</span><span class="token variable">$table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">table</span> <span class="token operator">=</span> <span class="token variable">$table</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">select</span><span class="token punctuation">(</span><span class="token variable">$columns</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">select</span> <span class="token operator">=</span> <span class="token variable">$columns</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">where</span><span class="token punctuation">(</span><span class="token variable">$condition</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">where</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"WHERE <span class="token interpolation"><span class="token variable">$condition</span></span>"</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">groupBy</span><span class="token punctuation">(</span><span class="token variable">$column</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">groupBy</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"GROUP BY <span class="token interpolation"><span class="token variable">$column</span></span>"</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">orderBy</span><span class="token punctuation">(</span><span class="token variable">$column</span><span class="token punctuation">,</span> <span class="token variable">$direction</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'ASC'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">orderBy</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"ORDER BY <span class="token interpolation"><span class="token variable">$column</span></span> <span class="token interpolation"><span class="token variable">$direction</span></span>"</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">select</span><span class="token punctuation">}</span></span> FROM <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">table</span><span class="token punctuation">}</span></span> <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">where</span><span class="token punctuation">}</span></span> <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">groupBy</span><span class="token punctuation">}</span></span> <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">orderBy</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">pdo</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">fetchAll</span><span class="token punctuation">(</span><span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">FETCH_ASSOC</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$result</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 使用示例</span> <span class="token variable">$servername</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"localhost"</span><span class="token punctuation">;</span> <span class="token variable">$username</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_username"</span><span class="token punctuation">;</span> <span class="token variable">$password</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_password"</span><span class="token punctuation">;</span> <span class="token variable">$database</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"your_database"</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$pdo</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PDO</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"mysql:host=<span class="token interpolation"><span class="token variable">$servername</span></span>;dbname=<span class="token interpolation"><span class="token variable">$database</span></span>"</span><span class="token punctuation">,</span> <span class="token variable">$username</span><span class="token punctuation">,</span> <span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">setAttribute</span><span class="token punctuation">(</span><span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ATTR_ERRMODE</span><span class="token punctuation">,</span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ERRMODE_EXCEPTION</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">QueryBuilder</span><span class="token punctuation">(</span><span class="token variable">$pdo</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$query</span><span class="token operator">-></span><span class="token function">table</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'your_table'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'id, name, email'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'age > 18'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">groupBy</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'gender'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">orderBy</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'ASC'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$result</span> <span class="token keyword">as</span> <span class="token variable">$row</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"ID: "</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'id'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">", Name: "</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">", Email: "</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"错误: "</span> <span class="token operator">.</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <h3>COOKIE&SESSION</h3> <h4>1、COOKIE 介绍</h4> <p><strong>Cookie</strong>是在客户端(通常是浏览器)存储小型数据的一种方式。当用户访问一个网站时,服务器可以通过在HTTP响应中设置一个名为"Set-Cookie"的头部来发送一个Cookie给客户端。客户端会将这个Cookie存储在本地,并在随后的请求中包含在HTTP头部的"Cookie"字段中发送给服务器。服务器可以读取这个Cookie并使用其中的信息来识别用户。</p> <p>Cookie可以用于多种目的,例如跟踪用户的会话状态、存储用户偏好设置或者记录用户的浏览历史。Cookie可以设置过期时间,可以是会话级别的,也可以是持久性的。持久性Cookie在指定的过期时间之前会一直保存在客户端,而会话级别的Cookie只在用户关闭浏览器时失效。</p> <p>然而,Cookie也存在一些限制。由于Cookie是存储在客户端的,因此客户端有可能篡改Cookie的值,这可能导致安全问题。此外,每个请求都会包含所有的Cookie数据,这可能增加网络流量,尤其是当Cookie数据很大或者存在大量的Cookie时。</p> <h4>2、SESSION 介绍</h4> <p><strong>Session</strong>是在服务器端存储用户状态的一种机制。当用户访问一个网站时,服务器会为每个用户创建一个唯一的会话标识(session ID),并将这个会话标识存储在服务器上,通常存储在内存中或者数据库中。服务器会将这个会话标识发送给客户端,通常通过Cookie的方式,存储在名为"session ID"的Cookie中。</p> <p>客户端在随后的请求中会将这个session ID发送给服务器,服务器通过session ID可以找到对应的会话数据,并根据需要更新或读取会话状态。会话数据可以包含用户的身份验证信息、会话变量、购物车内容等。服务器端可以根据需要设置会话的过期时间,以控制会话的有效期。</p> <p>相比于Cookie,Session的数据存储在服务器端,因此更加安全。客户端只需要保存一个session ID,而不需要保存大量的数据。然而,使用Session也会增加服务器的负担,因为服务器需要存储和管理会话数据,并确保会话的可靠性和一致性。</p> <p>在实际应用中,Cookie和Session通常一起使用。服务器使用Cookie来发送session ID给客户端,客户端将session ID存储在Cookie中,并在随后的请求中发送给服务器。服务器通过session ID来查找对应的会话数据,从而实现用户状态的跟踪和管理。</p> <h4>3、使用方法</h4> <p>PHP 中使用 setcookie() 函数用户客户端 cookie 数据。</p> <pre><code class="prism language-php"><span class="token function">setcookie</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">[</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$value</span> <span class="token operator">=</span> <span class="token string double-quoted-string">""</span> <span class="token punctuation">[</span><span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$expires</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">[</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$path</span> <span class="token operator">=</span> <span class="token string double-quoted-string">""</span> <span class="token punctuation">[</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$domain</span> <span class="token operator">=</span> <span class="token string double-quoted-string">""</span> <span class="token punctuation">[</span><span class="token punctuation">,</span> <span class="token keyword type-hint">bool</span> <span class="token variable">$secure</span> <span class="token operator">=</span> <span class="token constant boolean">FALSE</span> <span class="token punctuation">[</span><span class="token punctuation">,</span> <span class="token keyword type-hint">bool</span> <span class="token variable">$httponly</span> <span class="token operator">=</span> <span class="token constant boolean">FALSE</span> <span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <ol> <li><strong>name</strong>(必需):Cookie的名称,作为字符串传递。</li> <li><strong>value</strong>(可选):Cookie的值,作为字符串传递。</li> <li><strong>expires</strong>(可选):Cookie的过期时间,可以是一个Unix时间戳(秒数)或一个表示日期和时间的字符串。默认情况下,Cookie是会话级别的(当浏览器关闭时失效)。</li> <li><strong>path</strong>(可选):Cookie的有效路径。默认情况下,Cookie在设置它的目录及其子目录下可用。</li> <li><strong>domain</strong>(可选):Cookie的有效域名。默认情况下,Cookie在设置它的域名及其子域名下可用。</li> <li><strong>secure</strong>(可选):指示是否只在通过HTTPS协议发送请求时才发送Cookie。默认为false。</li> <li><strong>httponly</strong>(可选):指示Cookie是否只能通过HTTP协议访问,而无法通过JavaScript访问。默认为false。</li> </ol> <pre><code class="prism language-php"><span class="token delimiter important"><?php</span> <span class="token variable">$cookieName</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"username"</span><span class="token punctuation">;</span> <span class="token variable">$cookieValue</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"JohnDoe"</span><span class="token punctuation">;</span> <span class="token variable">$cookieExpiration</span> <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">3600</span><span class="token punctuation">;</span> <span class="token comment">// 过期时间为当前时间加1小时</span> <span class="token variable">$cookiePath</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"/"</span><span class="token punctuation">;</span> <span class="token comment">// Cookie在整个网站中可用</span> <span class="token variable">$cookieDomain</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"example.com"</span><span class="token punctuation">;</span> <span class="token variable">$cookieSecure</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token comment">// 仅通过HTTPS发送Cookie</span> <span class="token variable">$cookieHttpOnly</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token comment">// 禁止JavaScript访问Cookie</span> <span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token variable">$cookieName</span><span class="token punctuation">,</span> <span class="token variable">$cookieValue</span><span class="token punctuation">,</span> <span class="token variable">$cookieExpiration</span><span class="token punctuation">,</span> <span class="token variable">$cookiePath</span><span class="token punctuation">,</span> <span class="token variable">$cookieDomain</span><span class="token punctuation">,</span> <span class="token variable">$cookieSecure</span><span class="token punctuation">,</span> <span class="token variable">$cookieHttpOnly</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">?</span><span class="token operator">></span> </code></pre> <p><strong>注意: 设置COOKIE信息后,客户端每次访问浏览器会自动发送COOKIE数据到服务端,只需加上服务端逻辑就可以到达想要的结果</strong></p> <pre><code class="prism language-php"><span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'token'</span><span class="token punctuation">,</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'张三/管理员/20231206'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// cookie保存token,实际项目需要把token进行hash_hmac,不然容易给解密</span> <span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'token'</span><span class="token punctuation">,</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'张三/管理员/20231206'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">24</span><span class="token operator">*</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//+30天内有效期</span> <span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'token'</span><span class="token punctuation">,</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'张三/管理员/20231206'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">24</span><span class="token operator">*</span><span class="token number">30</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'/public'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//+只能再public路径下使用</span> <span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'token'</span><span class="token punctuation">,</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'张三/管理员/20231206'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">24</span><span class="token operator">*</span><span class="token number">30</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'/public'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'baidu.com'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//+限定域名使用</span> <span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'token'</span><span class="token punctuation">,</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'张三/管理员/20231206'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">24</span><span class="token operator">*</span><span class="token number">30</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'/public'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'baidu.com'</span><span class="token punctuation">,</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//+限制https访问</span> <span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'token'</span><span class="token punctuation">,</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'张三/管理员/20231206'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">60</span><span class="token operator">*</span><span class="token number">24</span><span class="token operator">*</span><span class="token number">30</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'/public'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'baidu.com'</span><span class="token punctuation">,</span><span class="token constant boolean">true</span><span class="token punctuation">,</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//+不允许JS操作cookie </span> </code></pre> <h4>4、读取COOKIE</h4> <pre><code class="prism language-php"><span class="token function">print_r</span><span class="token punctuation">(</span><span class="token variable">$_COOKIE</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <h4>5、SESSION的开启方式</h4> <p>1、session_start();</p> <p>2、通过修改 php.ini 配置项 <code>session.auto_start</code>,自动开启会话(不建议使用)</p> <pre><code class="prism language-php"><span class="token function">session_start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 设置会话数据</span> <span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'john'</span><span class="token punctuation">;</span> <span class="token comment">// 获取会话数据</span> <span class="token variable">$username</span> <span class="token operator">=</span> <span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// 删除会话数据</span> <span class="token keyword">unset</span><span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 销毁整个会话</span> <span class="token function">session_destroy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <h4>6、常用函数</h4> <ol> <li><code>session_start()</code>: 启动会话,必须在访问会话数据之前调用。</li> <li><code>session_destroy()</code>: 销毁当前会话中的所有数据,并释放会话资源。注意,这个函数不会立即删除会话文件,而是在会话结束后才会删除。</li> <li><code>session_unset()</code>: 删除会话中的所有数据,但会话仍然保持活动状态。它等效于<code>$_SESSION = array()</code>。</li> <li><code>session_id()</code>: 获取当前会话的ID。</li> <li><code>session_regenerate_id()</code>: 重新生成会话ID,常用于增加会话的安全性。在生成新ID之前,会话中的数据会被保留。</li> <li><code>session_save_path()</code>: 获取或设置会话数据的保存路径。</li> </ol> <h4>7、应用实例</h4> <pre><code class="prism language-php"><span class="token delimiter important"><?php</span> <span class="token comment">// 用户登录处理</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'LoginSubmit'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$username</span> <span class="token operator">=</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$password</span> <span class="token operator">=</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'password'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// 验证用户名和密码(正式项目需要对客户传过来的Password进行password_hash 和 password_verify</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$username</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'admin'</span> <span class="token operator">&&</span> <span class="token variable">$password</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'password'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 登录成功,设置登录状态</span> <span class="token function">session_start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$username</span><span class="token punctuation">;</span> <span class="token comment">// 设置登录状态的Cookie,有效期为1小时</span> <span class="token variable">$cookieName</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'login_status'</span><span class="token punctuation">;</span> <span class="token variable">$cookieValue</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'logged_in'</span><span class="token punctuation">;</span> <span class="token variable">$cookieExpiration</span> <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">3600</span><span class="token punctuation">;</span> <span class="token comment">// 过期时间为当前时间加1小时</span> <span class="token variable">$cookiePath</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'/'</span><span class="token punctuation">;</span> <span class="token comment">// Cookie可在整个域名下使用</span> <span class="token variable">$cookieDomain</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token comment">// Cookie限定域名为空,表示当前域名及其子域名均可使用</span> <span class="token variable">$cookieSecure</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token comment">// 在非HTTPS连接下也可使用</span> <span class="token variable">$cookieHttpOnly</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token comment">// 禁止通过JavaScript访问Cookie</span> <span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token variable">$cookieName</span><span class="token punctuation">,</span> <span class="token variable">$cookieValue</span><span class="token punctuation">,</span> <span class="token variable">$cookieExpiration</span><span class="token punctuation">,</span> <span class="token variable">$cookiePath</span><span class="token punctuation">,</span> <span class="token variable">$cookieDomain</span><span class="token punctuation">,</span> <span class="token variable">$cookieSecure</span><span class="token punctuation">,</span> <span class="token variable">$cookieHttpOnly</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 重定向到登录后的页面</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Location: profile.php'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">exit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// 登录失败</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Invalid username or password."</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 检查是否已登录</span> <span class="token function">session_start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$username</span> <span class="token operator">=</span> <span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Welcome, <span class="token interpolation"><span class="token variable">$username</span></span>!"</span><span class="token punctuation">;</span> <span class="token comment">//跳转到登录后的页面例如:主页等</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">//跳转到登录页面</span> <span class="token punctuation">}</span> </code></pre> <h3>PHP处理图像</h3> <p><strong>PHP是一种功能强大的服务器端脚本语言,也可以用于处理图像。以下是PHP处理图像的一些优势:</strong></p> <ol> <li> <p>广泛的图像处理库支持:PHP提供了许多图像处理库和扩展,如GD库、Imagick扩展等,这些库提供了丰富的函数和方法,用于图像的创建、修改、裁剪、缩放、旋转、添加水印等操作。</p> </li> <li> <p>简单易用:PHP的图像处理函数和方法通常具有简单和直观的语法,使开发人员能够轻松地处理图像,无需深入了解复杂的图像处理算法。这使得即使对图像处理不熟悉的开发人员也能够快速上手。</p> </li> <li> <p>与Web开发的紧密集成:由于PHP是一种服务器端脚本语言,与Web开发紧密集成。这使得在Web应用程序中处理和生成图像变得非常方便。你可以根据需要动态地生成图像,将其用作验证码、缩略图、图像合成等。</p> </li> </ol> <p><strong>配置环境</strong></p> <p>1、在 windows 系统中修改 php.ini 文件,删除 extension=php_gd2.dll 前面的<code>;</code>开启图像处理支持。</p> <p>2、phpinfo(); 查看是否GD库开启</p> <p>3、var_dump(extension_loaded(“GD”));</p> <p><strong>流程</strong></p> <p><strong>设置HTTP头信息 –> 创建画布 –> 绘图 –> 输出图像 —> 释放资源</strong></p> <ol> <li> <p><strong>调整图像大小和缩放:</strong></p> <ul> <li> <p><code>imagecreatefromjpeg</code>、<code>imagecreatefrompng</code>、<code>imagecreatefromgif</code>:从不同的图像文件格式创建图像资源。</p> </li> <li> <p><code>imagescale</code>:调整图像的大小。</p> </li> <li> <p><code>imagecopyresampled</code>:缩放图像并保持较好的质量。</p> </li> </ul> </li> <li> <p><strong>裁剪和剪切图像:</strong></p> <ul> <li> <p><code>imagecrop</code>:根据指定的参数裁剪图像。</p> </li> <li> <p><code>imagecopyresampled</code>:剪切并调整图像的大小。</p> </li> </ul> </li> <li> <p><strong>添加水印和文字:</strong></p> <ul> <li> <p><code>imagestring</code>、<code>imagestringup</code>:在图像上绘制文本。</p> </li> <li> <p><code>imagecopy</code>、<code>imagecopymerge</code>:复制和合并图像,包括添加水印。</p> </li> </ul> </li> <li> <p><strong>图像旋转和翻转:</strong></p> <ul> <li> <p><code>imagerotate</code>:按指定角度旋转图像。</p> </li> <li> <p><code>imageflip</code>:水平或垂直翻转图像。</p> </li> </ul> </li> <li> <p><strong>图像滤镜和效果:</strong></p> <ul> <li> <p><code>imagefilter</code>:应用各种滤镜效果,如灰度、反色、模糊等。</p> </li> <li> <p><code>imageconvolution</code>:应用卷积滤波器,如边缘检测。</p> </li> </ul> </li> <li> <p><strong>保存和输出图像:</strong></p> <ul> <li> <p><code>imagejpeg</code>、<code>imagepng</code>、<code>imagegif</code>:将图像保存为不同的文件格式。</p> </li> <li> <p><code>imagegd</code>、<code>imagegd2</code>:以 GD 图像格式输出图像。</p> </li> </ul> </li> <li> <p><strong>创建画布:</strong></p> <ul> <li><code>imagecreatetruecolor</code>:将根据参数宽高创建画布。</li> </ul> </li> <li> <p><strong>创建画布:</strong></p> <ul> <li><code>imagecreatetruecolor</code>:将根据参数宽高创建画布。</li> </ul> </li> <li> <p><strong>设置颜色:</strong></p> <ul> <li><code>imageFill</code>: (x,y)表示从哪个点开始填充颜色的坐标(默认是黑色)。</li> </ul> </li> <li> <p><strong>绘制图形:</strong></p> <ul> <li> <p><code>imageRectangle</code>、<code>imageFilledRectangle </code>:绘制空心矩形或者实心矩形图像并填充颜色。</p> </li> <li> <p><code>imageEllipse</code>、<code>imageFilledEllipse </code> : 绘制空心圆形或者实心圆形图像并填充颜色。</p> </li> <li> <p><code>imageLine</code>: 绘制线条。</p> </li> <li> <p><code>imagesetpixel</code>: 绘制像素。</p> </li> </ul> </li> <li> <p><strong>输出图像:</strong></p> <ul> <li> <p>imagegif(img_resource[,filename])</p> </li> <li> <p>imagejpeg(img_resource[,filename])</p> </li> <li> <p>imagepng(img_resource[,filename])</p> </li> <li> <p>imagebmp(img_resource[,filename])</p> </li> </ul> </li> </ol> <p>​ 当设置第二个参数时表示储存文件,如果存在同名文件会覆盖</p> <ol start="12"> <li> <p><strong>释放图像</strong></p> <ul> <li><code>imageDestroy</code>:释放图像资源</li> </ul> </li> <li> <p><strong>输入文本</strong></p> </li> </ol> <p><code>imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )</code></p> <p><em>图像资源,字体尺寸,角度,第一个字符的基本点(大概是字符的左下角),Y 坐标(字体基线的位置),颜色 ,字体文件,文本字符串(UTF-8 编码)</em></p> <p><code>imagettfbbox </code>: 文本范围的盒子大小,可以方便控制文本输出位置</p> <table> <thead> <tr> <th>变量</th> <th>位置</th> </tr> </thead> <tbody> <tr> <td>0</td> <td>左下角 X 位置</td> </tr> <tr> <td>1</td> <td>左下角 Y 位置</td> </tr> <tr> <td>2</td> <td>右下角 X 位置</td> </tr> <tr> <td>3</td> <td>右下角 Y 位置</td> </tr> <tr> <td>4</td> <td>右上角 X 位置</td> </tr> <tr> <td>5</td> <td>右上角 Y 位置</td> </tr> <tr> <td>6</td> <td>左上角 X 位置</td> </tr> <tr> <td>7</td> <td>左上角 Y 位置</td> </tr> </tbody> </table> <ol start="14"> <li> <p><strong>外部图像</strong></p> </li> <li> <p><em>打开图片文件</em></p> <ul> <li> <p>imageCreateFromgif(filename/url)</p> </li> <li> <p>imageCreateFromjpeg(filename/url)</p> </li> <li> <p>imageCreateFrompng(filename/url)</p> </li> <li> <p>imageCreateFrombmp(filename/url)</p> <p>返回一个资源类型</p> </li> </ul> </li> <li> <p><em>获得信息</em></p> <ul> <li> <p>imagesx(img_resource) 取得图像宽度</p> </li> <li> <p>imagesy(img_resource) 取得图像高度</p> </li> </ul> </li> <li> <p><em>getimagesize(img_file)</em></p> <ul> <li>array getimagesize ( string <span class="katex--inline">KaTeX parse error: Expected 'EOF', got '&' at position 19: …ename [, array &̲</span>imageinfo ] )</li> </ul> </li> <li> <p><strong>图像复制</strong></p> </li> <li> <p><em>拷贝图像的一部分</em></p> <ul> <li>imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )</li> </ul> </li> <li> <p><em>拷贝并合并图像的一部分</em></p> <ul> <li>imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )</li> </ul> </li> <li> <p><strong>图片缩放</strong></p> </li> </ol> <p>拷贝部分图像并调整大小</p> <p>imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )</p> <p><strong>应用例子:</strong></p> <p><strong>生成验证码</strong></p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Captcha</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$width</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$height</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$length</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$image</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$text</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$width</span> <span class="token operator">=</span> <span class="token number">120</span><span class="token punctuation">,</span> <span class="token variable">$height</span> <span class="token operator">=</span> <span class="token number">40</span><span class="token punctuation">,</span> <span class="token variable">$length</span> <span class="token operator">=</span> <span class="token number">6</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">width</span> <span class="token operator">=</span> <span class="token variable">$width</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">height</span> <span class="token operator">=</span> <span class="token variable">$height</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">length</span> <span class="token operator">=</span> <span class="token variable">$length</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">generate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 创建画布</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span> <span class="token operator">=</span> <span class="token function">imagecreatetruecolor</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">width</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">height</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 设置背景颜色</span> <span class="token variable">$backgroundColor</span> <span class="token operator">=</span> <span class="token function">imagecolorallocate</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imagefill</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$backgroundColor</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 生成验证码文本</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">text</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">generateText</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 在画布上绘制验证码文本</span> <span class="token variable">$textColor</span> <span class="token operator">=</span> <span class="token function">imagecolorallocate</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$font</span> <span class="token operator">=</span> <span class="token constant">__DIR__</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'/arial.ttf'</span><span class="token punctuation">;</span> <span class="token comment">// 字体文件路径</span> <span class="token function">imagettftext</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">,</span> <span class="token variable">$textColor</span><span class="token punctuation">,</span> <span class="token variable">$font</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">text</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 添加干扰线</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">addNoise</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出图像</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-Type: image/png'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imagepng</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 销毁画布释放资源</span> <span class="token function">imagedestroy</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getText</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">text</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">generateText</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$characters</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'</span><span class="token punctuation">;</span> <span class="token comment">// 可选字符集</span> <span class="token variable">$text</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$max</span> <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$characters</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">length</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$text</span> <span class="token operator">.=</span> <span class="token variable">$characters</span><span class="token punctuation">[</span><span class="token function">mt_rand</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$max</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//随机生成验证码</span> <span class="token keyword">return</span> <span class="token variable">$text</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//生成干扰线</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">addNoise</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$noiseColor</span> <span class="token operator">=</span> <span class="token function">imagecolorallocate</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">imageline</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">,</span> <span class="token function">mt_rand</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">width</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">mt_rand</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">height</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">mt_rand</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">width</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">mt_rand</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">height</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$noiseColor</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 示例用法</span> <span class="token variable">$captcha</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Captcha</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$captcha</span><span class="token operator">-></span><span class="token function">generate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$code</span> <span class="token operator">=</span> <span class="token variable">$captcha</span><span class="token operator">-></span><span class="token function">getText</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>添加水印</strong></p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Watermark</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$image</span><span class="token punctuation">;</span> <span class="token comment">// 原始图像路径</span> <span class="token keyword">private</span> <span class="token variable">$watermark</span><span class="token punctuation">;</span> <span class="token comment">// 水印图像路径</span> <span class="token keyword">private</span> <span class="token variable">$position</span><span class="token punctuation">;</span> <span class="token comment">// 水印位置</span> <span class="token keyword">private</span> <span class="token variable">$opacity</span><span class="token punctuation">;</span> <span class="token comment">// 水印透明度</span> <span class="token comment">/** * 创建一个 Watermark 实例 * * @param string $imagePath 原始图像路径 * @param string $watermarkPath 水印图像路径 * @param string $position 水印位置(可选,默认为 'bottom-right') * @param float $opacity 水印透明度(可选,默认为 0.5) */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$imagePath</span><span class="token punctuation">,</span> <span class="token variable">$watermarkPath</span><span class="token punctuation">,</span> <span class="token variable">$position</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'bottom-right'</span><span class="token punctuation">,</span> <span class="token variable">$opacity</span> <span class="token operator">=</span> <span class="token number">0.5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span> <span class="token operator">=</span> <span class="token variable">$imagePath</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">watermark</span> <span class="token operator">=</span> <span class="token variable">$watermarkPath</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">position</span> <span class="token operator">=</span> <span class="token variable">$position</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">opacity</span> <span class="token operator">=</span> <span class="token variable">$opacity</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * 将水印添加到图像上 * * @param string|null $outputPath 输出路径(可选,默认为 null,直接输出到浏览器) */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addWatermark</span><span class="token punctuation">(</span><span class="token variable">$outputPath</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 创建图像资源</span> <span class="token variable">$image</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">createImageResource</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">image</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$watermark</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">createImageResource</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">watermark</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 获取图像和水印的宽度和高度</span> <span class="token variable">$imageWidth</span> <span class="token operator">=</span> <span class="token function">imagesx</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$imageHeight</span> <span class="token operator">=</span> <span class="token function">imagesy</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$watermarkWidth</span> <span class="token operator">=</span> <span class="token function">imagesx</span><span class="token punctuation">(</span><span class="token variable">$watermark</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$watermarkHeight</span> <span class="token operator">=</span> <span class="token function">imagesy</span><span class="token punctuation">(</span><span class="token variable">$watermark</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 根据位置计算水印的坐标</span> <span class="token variable">$position</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">calculatePosition</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">position</span><span class="token punctuation">,</span> <span class="token variable">$imageWidth</span><span class="token punctuation">,</span> <span class="token variable">$imageHeight</span><span class="token punctuation">,</span> <span class="token variable">$watermarkWidth</span><span class="token punctuation">,</span> <span class="token variable">$watermarkHeight</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 将水印合并到图像中</span> <span class="token function">imagecopymerge</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">,</span> <span class="token variable">$watermark</span><span class="token punctuation">,</span> <span class="token variable">$position</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'x'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$position</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'y'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$watermarkWidth</span><span class="token punctuation">,</span> <span class="token variable">$watermarkHeight</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">opacity</span> <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出或保存图像</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$outputPath</span> <span class="token operator">!==</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">imagepng</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">,</span> <span class="token variable">$outputPath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-Type: image/png'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imagepng</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 销毁图像资源</span> <span class="token function">imagedestroy</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imagedestroy</span><span class="token punctuation">(</span><span class="token variable">$watermark</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * 创建图像资源 * * @param string $imagePath 图像路径 * @return resource 图像资源 * @throws Exception 当图像格式不受支持时抛出异常 */</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">createImageResource</span><span class="token punctuation">(</span><span class="token variable">$imagePath</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$extension</span> <span class="token operator">=</span> <span class="token function">strtolower</span><span class="token punctuation">(</span><span class="token function">pathinfo</span><span class="token punctuation">(</span><span class="token variable">$imagePath</span><span class="token punctuation">,</span> <span class="token constant">PATHINFO_EXTENSION</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$extension</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'jpg'</span><span class="token punctuation">:</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'jpeg'</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token function">imagecreatefromjpeg</span><span class="token punctuation">(</span><span class="token variable">$imagePath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'png'</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token function">imagecreatefrompng</span><span class="token punctuation">(</span><span class="token variable">$imagePath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'gif'</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token function">imagecreatefromgif</span><span class="token punctuation">(</span><span class="token variable">$imagePath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Unsupported image format'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">/** * 计算水印的位置坐标 * * @param string $position 水印位置 * @param int $imageWidth 图像宽度 * @param int $imageHeight 图像高度 * @param int $watermarkWidth 水印宽度 * @param int $watermarkHeight 水印高度 * @return array 水印坐标 * @throws Exception 当水印位置无效时抛出异常 */</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">calculatePosition</span><span class="token punctuation">(</span><span class="token variable">$position</span><span class="token punctuation">,</span> <span class="token variable">$imageWidth</span><span class="token punctuation">,</span> <span class="token variable">$imageHeight</span><span class="token punctuation">,</span> <span class="token variable">$watermarkWidth</span><span class="token punctuation">,</span> <span class="token variable">$watermarkHeight</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$x</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$y</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$position</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'top-left'</span><span class="token punctuation">:</span> <span class="token variable">$x</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$y</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'top-right'</span><span class="token punctuation">:</span> <span class="token variable">$x</span> <span class="token operator">=</span> <span class="token variable">$imageWidth</span> <span class="token operator">-</span> <span class="token variable">$watermarkWidth</span><span class="token punctuation">;</span> <span class="token variable">$y</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'bottom-left'</span><span class="token punctuation">:</span> <span class="token variable">$x</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$y</span> <span class="token operator">=</span> <span class="token variable">$imageHeight</span> <span class="token operator">-</span> <span class="token variable">$watermarkHeight</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'bottom-right'</span><span class="token punctuation">:</span> <span class="token variable">$x</span> <span class="token operator">=</span> <span class="token variable">$imageWidth</span> <span class="token operator">-</span> <span class="token variable">$watermarkWidth</span><span class="token punctuation">;</span> <span class="token variable">$y</span> <span class="token operator">=</span> <span class="token variable">$imageHeight</span> <span class="token operator">-</span> <span class="token variable">$watermarkHeight</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'center'</span><span class="token punctuation">:</span> <span class="token variable">$x</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token variable">$imageWidth</span> <span class="token operator">-</span> <span class="token variable">$watermarkWidth</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token variable">$y</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token variable">$imageHeight</span> <span class="token operator">-</span> <span class="token variable">$watermarkHeight</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Invalid watermark position'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'x'</span> <span class="token operator">=></span> <span class="token variable">$x</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'y'</span> <span class="token operator">=></span> <span class="token variable">$y</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 示例用法</span> <span class="token variable">$watermark</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Watermark</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'image.jpg'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'watermark.png'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bottom-right'</span><span class="token punctuation">,</span> <span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$watermark</span><span class="token operator">-></span><span class="token function">addWatermark</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'output.png'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>缩略图</strong></p> <pre><code class="prism language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">function</span> <span class="token function-definition function">createThumbnail</span><span class="token punctuation">(</span><span class="token variable">$sourcePath</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailPath</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailWidth</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailHeight</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 获取原始图像的信息</span> <span class="token keyword">list</span><span class="token punctuation">(</span><span class="token variable">$originalWidth</span><span class="token punctuation">,</span> <span class="token variable">$originalHeight</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">getimagesize</span><span class="token punctuation">(</span><span class="token variable">$sourcePath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 计算缩略图的比例</span> <span class="token variable">$thumbnailRatio</span> <span class="token operator">=</span> <span class="token variable">$thumbnailWidth</span> <span class="token operator">/</span> <span class="token variable">$thumbnailHeight</span><span class="token punctuation">;</span> <span class="token variable">$originalRatio</span> <span class="token operator">=</span> <span class="token variable">$originalWidth</span> <span class="token operator">/</span> <span class="token variable">$originalHeight</span><span class="token punctuation">;</span> <span class="token comment">// 根据比例计算缩略图的实际大小</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$originalRatio</span> <span class="token operator">></span> <span class="token variable">$thumbnailRatio</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$thumbnailActualWidth</span> <span class="token operator">=</span> <span class="token variable">$thumbnailWidth</span><span class="token punctuation">;</span> <span class="token variable">$thumbnailActualHeight</span> <span class="token operator">=</span> <span class="token variable">$thumbnailWidth</span> <span class="token operator">/</span> <span class="token variable">$originalRatio</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$thumbnailActualWidth</span> <span class="token operator">=</span> <span class="token variable">$thumbnailHeight</span> <span class="token operator">*</span> <span class="token variable">$originalRatio</span><span class="token punctuation">;</span> <span class="token variable">$thumbnailActualHeight</span> <span class="token operator">=</span> <span class="token variable">$thumbnailHeight</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 创建原始图像和缩略图的资源</span> <span class="token variable">$originalImage</span> <span class="token operator">=</span> <span class="token function">imagecreatefromjpeg</span><span class="token punctuation">(</span><span class="token variable">$sourcePath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$thumbnailImage</span> <span class="token operator">=</span> <span class="token function">imagecreatetruecolor</span><span class="token punctuation">(</span><span class="token variable">$thumbnailWidth</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailHeight</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 调整图像大小并将原始图像复制到缩略图中</span> <span class="token function">imagecopyresampled</span><span class="token punctuation">(</span><span class="token variable">$thumbnailImage</span><span class="token punctuation">,</span> <span class="token variable">$originalImage</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailActualWidth</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailActualHeight</span><span class="token punctuation">,</span> <span class="token variable">$originalWidth</span><span class="token punctuation">,</span> <span class="token variable">$originalHeight</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 将缩略图保存到文件</span> <span class="token function">imagejpeg</span><span class="token punctuation">(</span><span class="token variable">$thumbnailImage</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailPath</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 释放图像资源(养成好习惯释放资源)</span> <span class="token function">imagedestroy</span><span class="token punctuation">(</span><span class="token variable">$originalImage</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imagedestroy</span><span class="token punctuation">(</span><span class="token variable">$thumbnailImage</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//使用方法</span> <span class="token variable">$sourcePath</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'path/to/original_image.jpg'</span><span class="token punctuation">;</span> <span class="token variable">$thumbnailPath</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'path/to/thumbnail.jpg'</span><span class="token punctuation">;</span> <span class="token variable">$thumbnailWidth</span> <span class="token operator">=</span> <span class="token number">200</span><span class="token punctuation">;</span> <span class="token comment">// 缩略图的宽度</span> <span class="token variable">$thumbnailHeight</span> <span class="token operator">=</span> <span class="token number">150</span><span class="token punctuation">;</span> <span class="token comment">// 缩略图的高度</span> <span class="token function">createThumbnail</span><span class="token punctuation">(</span><span class="token variable">$sourcePath</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailPath</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailWidth</span><span class="token punctuation">,</span> <span class="token variable">$thumbnailHeight</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>总结:</strong></p> <p>在使用 PHP 处理图像时,有一些重要的注意点需要考虑:</p> <ol> <li> <p>安装 GD 库:PHP 的 GD 库是用于图像处理的常见库。在使用之前,确保你的 PHP 环境已安装并启用了 GD 库。你可以在 <code>phpinfo()</code> 中查看是否启用了 GD 库。</p> </li> <li> <p>图像格式支持:GD 库支持多种图像格式,包括 JPEG、PNG、GIF 等。根据你的需求选择适合的图像格式,并使用相应的 GD 函数来处理。</p> </li> <li> <p>错误处理:在图像处理过程中,可能会发生错误,如无法打开图像文件、内存不足等。确保在代码中进行错误处理,例如使用 <code>try-catch</code> 块捕获异常或使用 <code>imagecreatetruecolor()</code> 和 <code>imagecopyresampled()</code> 函数时检查返回值。</p> </li> <li> <p>图像尺寸调整:在创建缩略图或调整图像尺寸时,要确保维持图像的比例,避免图像变形。根据需要,可以裁剪图像、添加边框或在保持比例的同时填充空白区域。</p> </li> <li> <p>内存限制:图像处理可能需要大量的内存,特别是处理大尺寸的图像。确保 PHP 配置中的 <code>memory_limit</code> 设置足够大,以便处理所需的图像大小。</p> </li> <li> <p>图像优化:在保存图像时,可以使用图像优化工具来减小文件大小,例如使用 JPEG 图像时可以调整图像质量参数来平衡图像质量和文件大小。</p> </li> <li> <p>安全性考虑:接受用户上传的图像时,要进行适当的验证和过滤,以防止安全漏洞,如文件包含、路径遍历等。</p> </li> <li> <p>扩展功能:PHP 的 GD 库提供了一系列的函数和方法来处理图像,包括裁剪、旋转、水印、滤镜等。根据具体需求,可以深入了解这些功能并灵活运用。</p> </li> </ol> <p><strong>在实际生成开发中还是避免重复造轮子,用第三方库吧~</strong></p> <h3>PHP面向对象编程</h3> <p>PHP面向对象编程(简称OOP)是一种编程范式,通过使用类、对象、继承、封装、多态等概念来组织和管理代码。PHP从版本5开始引入了全面的面向对象支持,并提供了丰富的面向对象编程特性。</p> <p><strong>PHP面向对象编程的特点(或者说OOP基本都具有得特点):</strong></p> <ol> <li> <p>类:类是面向对象编程的基本构建块,用于定义对象的属性(成员变量)和行为(方法)。类可以看作是对象的蓝图或模板。</p> </li> <li> <p>对象:对象是类的实例化,具体的实体。对象具有类定义的属性和方法,并可以通过对象访问和操作它们。</p> </li> <li> <p>封装:封装是一种将数据和相关操作封装在类中的机制,通过访问控制(public、private、protected)来控制对类的成员的访问。</p> </li> <li> <p>继承:继承允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以扩展或重写父类的功能,实现代码的复用和层次化结构。</p> </li> <li> <p>多态:多态允许使用统一的接口来处理不同类的对象。通过继承和接口实现,可以在不同的类中使用相同的方法名称,但具体的实现可能不同。</p> </li> <li> <p>抽象类:抽象类是一种不能被实例化的类,用于作为其他类的基类。它可以定义抽象方法和具体方法,子类必须实现抽象方法。</p> </li> <li> <p>接口:接口定义了一组方法的规范,但不包含具体实现。类可以实现一个或多个接口,实现接口的类必须实现接口中定义的所有方法。</p> </li> </ol> <p>PHP面向对象编程提供了更模块化、可维护和可扩展的代码结构。它可以帮助开发者组织和管理复杂的应用程序,并提供了更高的代码重用性和灵活性。</p> <p><strong>除了面向对象编程还有面向过程:</strong></p> <p>程序员设计好程序代码流程图,辅助程序设计。优点:用什么功能就编写什么函数 缺点:数据管理上比较混乱 ,主要集中在函数成面上,面向对象把属性和方法进行封装,更好的可重用性和可扩展性。</p> <p>面向过程的编程语言有:<strong>C语言</strong>、Fortran、Pascal(也可以OOP)、COBOL</p> <p><strong>类与对象</strong></p> <p>万物皆对象,将构成问题的事务分解到各个对象上,建立对象的目的不是为了完成一个工作,而是为了描述某个事务在解决问题中的行为,更符合人的思维习惯,代码重用性高,可扩展性好。面向对象是由一系统具有属性和方法的对象构成,对象之间相互交互 ,从而实现业务需求。</p> <p><strong>简单理解:先要有类,然后生成对象,对象有属性和方法。</strong></p> <p><strong>属性</strong>:在类中定义的变量,即为成员属性,用于描述对象静态特性的数据可以通过对象来访问和修改。</p> <p><strong>方法</strong>:函数定义在类中即为成员方法,用于描述对象动态特性的操作行为。</p> <p><strong>生命周期:创建后,生命周期开始,当程序结束后或程序员清除对象后即销毁,或者PHP自动销毁对象。</strong></p> <p><strong>命名规范</strong>:首字母大写,一般一个类放一个文件中。</p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Person</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'啊小'</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">int</span> <span class="token variable">$age</span> <span class="token operator">=</span> <span class="token number">18</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$sex</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'女'</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">say</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token comment">//说话的方法</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token comment">//奔跑的方法</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$anoxia</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">;</span> <span class="token comment">// $xiaoxiao 就是一个对象,通过关键字 new 生成。</span> <span class="token keyword">echo</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">;</span> <span class="token comment">//以下是访问属性和方法的调用方式</span> <span class="token keyword">echo</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token property">sex</span><span class="token punctuation">;</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token function">say</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>**<span class="katex--inline"><span class="katex"><span class="katex-mathml"> t h i s ∗ ∗ : 对象中使用 ‘ this**: 对象中使用 ` </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.6944em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal">hi</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right: 0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.2222em;"></span></span><span class="base"><span class="strut" style="height: 0.4653em;"></span><span class="mord">∗</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right: 0.2778em;"></span></span><span class="base"><span class="strut" style="height: 0.6944em;"></span><span class="mord cjk_fallback">对象中使用</span><span class="mord">‘</span></span></span></span></span>this` 指针可以访问属性或方法。</p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'啊小'</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">int</span> <span class="token variable">$age</span> <span class="token operator">=</span> <span class="token number">18</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$sex</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'女'</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">say</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>说:我性别是<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">sex</span><span class="token punctuation">}</span></span>的,今年<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">}</span></span>岁了"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>说:今年<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">}</span></span>岁,我可以跑得很快"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$anoxia</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token property">name</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token property">age</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token property">sex</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token function">say</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$anoxia</span><span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>注意: PHP_EOL 是预定义常量,它表示换行符(line break)。</strong></p> <p>不同操作系统使用不同的换行符来表示新行。例如,Windows 系统使用回车符和换行符(“\r\n”),Unix/Linux 系统使用换行符(“\n”),Macintosh 系统使用回车符(“\r”)。</p> <p>以下结果是PHP CLI模式下输出得结果:</p> <p><a href="http://img.e-com-net.com/image/info8/3edae367c0844c89b800a128392623b0.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/3edae367c0844c89b800a128392623b0.jpg" alt="当今最强大的PHP技巧,让你成为编程巨匠_第2张图片" width="650" height="117" style="border:1px solid black;"></a></p> <p><strong>类的继承</strong></p> <p>php通过使用 <code>extends</code> 可以继承父类的属性与方法,在 PHP 中继承是<strong>单一</strong>的。(多继承可以通过Trait)</p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'迪迦'</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">int</span> <span class="token variable">$age</span> <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$sex</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'难'</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">say</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>说:我是<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">sex</span><span class="token punctuation">}</span></span>的,今年<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">}</span></span>岁了"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>说:今年<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">}</span></span>岁,我可以跑得很快"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">SupperMan</span> <span class="token keyword">extends</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">int</span> <span class="token variable">$ap</span> <span class="token operator">=</span> <span class="token number">99</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">int</span> <span class="token variable">$mp</span> <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$special_move</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"动感光波"</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">attacks</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"超人:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>,攻击力:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">ap</span><span class="token punctuation">}</span></span>,能量值:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">mp</span><span class="token punctuation">}</span></span>,必杀技:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">special_move</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$supperMan</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SupperMan</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$supperMan</span><span class="token operator">-></span><span class="token function">say</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> <span class="token variable">$supperMan</span><span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> <span class="token variable">$supperMan</span><span class="token operator">-></span><span class="token function">attacks</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>输出的结果是:</strong></p> <p><a href="http://img.e-com-net.com/image/info8/ce1d1c88bcbf46798ca16bda08e4b267.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/ce1d1c88bcbf46798ca16bda08e4b267.jpg" alt="当今最强大的PHP技巧,让你成为编程巨匠_第3张图片" width="650" height="205" style="border:1px solid black;"></a></p> <p><strong>子类调用父类、方式重写、禁止重写</strong></p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'迪迦'</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">int</span> <span class="token variable">$age</span> <span class="token operator">=</span> <span class="token number">1000</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$sex</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'难'</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">say</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>说:我是<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">sex</span><span class="token punctuation">}</span></span>的,今年<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">}</span></span>岁了"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>说:今年<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">}</span></span>岁,我可以跑得很快"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// public final function run(): void {</span> <span class="token comment">// echo "{$this->name}说:今年{$this->age}岁,我可以跑得很快";</span> <span class="token comment">// }</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">SupperMan</span> <span class="token keyword">extends</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">int</span> <span class="token variable">$ap</span> <span class="token operator">=</span> <span class="token number">99</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">int</span> <span class="token variable">$mp</span> <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword type-declaration">string</span> <span class="token variable">$special_move</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"动感光波"</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">attacks</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"超人:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>,攻击力:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">ap</span><span class="token punctuation">}</span></span>,能量值:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">mp</span><span class="token punctuation">}</span></span>,必杀技:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">special_move</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword return-type">void</span><span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"超人:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>,除了再地面对战还可以飞"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token keyword static-context">parent</span><span class="token operator">::</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 直接用parent::方法名 调用父类的方法</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"超人:<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">}</span></span>,特有的跑步姿势!帅"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$supperMan</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SupperMan</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$supperMan</span><span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> </code></pre> <p><strong>注意:当子类与父类方法名一致时即方法重写,如果想调用父类可以用直接用parent::方法名 调用父类的方法,当父类方法使用了final声明,那么子类就不能重写父类方法。</strong></p> <p><strong>封装</strong></p> <table> <thead> <tr> <th>名称</th> <th>介绍</th> </tr> </thead> <tbody> <tr> <td>public 公有</td> <td>在类的内部与外部或子类都可以访问,是最开放的权限</td> </tr> <tr> <td>private 私有</td> <td>定义类的属性和方法,在类的内部可以访问,在类的外部或子类都不可以访问</td> </tr> <tr> <td>protected 受保护</td> <td>定义类的属性和方法,在类的内部或子类可以访问,类的外部不可以访问</td> </tr> </tbody> </table> <p><strong>多继承(Trait)</strong></p> <p>Trait 是一种代码复用机制,它允许开发者在不同类之间共享方法的集合。当使用多个 Trait 时,可以通过逗号分隔的方式在类中引入多个 Trait。可能会遇到方法命名冲突或访问控制的问题,可以使用 <code>insteadof</code> 关键字来明确指定使用哪个 Trait 中的方法。</p> <pre><code class="prism language-php"><span class="token keyword">trait</span> <span class="token class-name-definition class-name">TraitA</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"TraitA's foo\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">trait</span> <span class="token class-name-definition class-name">TraitB</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> foo<span class="token string backtick-quoted-string">``</span>`php <span class="token keyword">trait</span> <span class="token class-name-definition class-name">TraitA</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"TraitA's foo\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">trait</span> <span class="token class-name-definition class-name">TraitB</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"TraitB's foo\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">trait</span> <span class="token class-name-definition class-name">TraitC</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"TraitC's foo\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">MyClass</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">TraitA</span><span class="token punctuation">,</span> TraitB<span class="token punctuation">,</span> TraitC <span class="token punctuation">{</span> <span class="token class-name static-context">TraitC</span><span class="token operator">::</span><span class="token constant">foo</span> <span class="token keyword">as</span> <span class="token keyword">public</span> bar<span class="token punctuation">;</span> <span class="token comment">// 将TraitC的foo方法重命名为bar,并设置为public访问权限</span> <span class="token class-name static-context">TraitB</span><span class="token operator">::</span><span class="token constant">foo</span> <span class="token keyword">insteadof</span> TraitA<span class="token punctuation">,</span> TraitC<span class="token punctuation">;</span> <span class="token comment">// 解决TraitA、TraitC和TraitB之间的冲突</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$obj</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$obj</span><span class="token operator">-></span><span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:TraitB's foo</span> <span class="token variable">$obj</span><span class="token operator">-></span><span class="token function">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:TraitC's foo</span> </code></pre> <p><strong>抽象方法</strong></p> <p>抽象方法是一种在抽象类中声明但不提供具体实现的方法。抽象方法只能存在于抽象类中,而抽象类本身不能被实例化,只能被继承。</p> <p>要声明一个抽象方法,需要在方法前面加上 <code>abstract</code> 关键字,并且不需要提供具体的实现。子类继承抽象类后,必须实现父类中的所有抽象方法,否则子类也必须声明为抽象类。</p> <pre><code class="prism language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">abstract</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeSound</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Dog</span> <span class="token keyword">extends</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeSound</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Woof!\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Cat</span> <span class="token keyword">extends</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">makeSound</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Miao!\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$dog</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Dog</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$dog</span><span class="token operator">-></span><span class="token function">makeSound</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:Woof!</span> <span class="token variable">$cat</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Cat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$cat</span><span class="token operator">-></span><span class="token function">makeSound</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:Miao!</span> </code></pre> <p><strong>静态方法</strong></p> <p>在PHP中,静态方法是属于类本身而不是类的实例的方法。可以通过类名直接调用静态方法,而无需创建类的实例。</p> <p>要声明一个静态方法,需要在方法前面加上 <code>static</code> 关键字。静态方法可以直接访问类的静态属性,并且不能访问非静态属性。</p> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">MathUtils</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">sum</span><span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword return-type">int</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">multiply</span><span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword return-type">int</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$a</span> <span class="token operator">*</span> <span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">sub</span><span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword return-type">int</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token function">multiply</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token variable">$b</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token function">sum</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span><span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// 调用静态方法</span> <span class="token keyword">echo</span> <span class="token class-name static-context">MathUtils</span><span class="token operator">::</span><span class="token function">sum</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:8</span> <span class="token keyword">echo</span> <span class="token class-name static-context">MathUtils</span><span class="token operator">::</span><span class="token function">multiply</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:15</span> <span class="token variable">$m</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MathUtils</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token variable">$m</span><span class="token operator">-></span><span class="token function">sub</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//输出:7</span> </code></pre> <p><strong>static</strong></p> <ul> <li>需要一个数据对象只服务于类,即类内部可用,对外不可用时。建对象是极其耗费资源的,因此当一个方法具有比较强的公用性的时候,没有必要为了调用这个方法而重新再生成该类的实例。定义的方法或变量在程序第一次加载时即驻留内存,程序结束释放。</li> </ul> <p><strong>static 变量:</strong></p> <ul> <li>通过 static 声明的成员变量为静态变量或叫类变量,是该类的公共变量,在第一次使用时即生成,对于该类的所有对象只有一份,是属于类的,不是属于对象的。static 变量是属于类而不属于对象,可以在任何地方通地类来访问,是类的全局变量,类创建时即存入内存。对多个对象来说,静态数据成员只存储一处,可以节省内存。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值。</li> </ul> <p><strong>static 方法:</strong></p> <ul> <li>用 static 声明的方法为静态方法或叫类方法,执行该方法时不会将对象引用传给函数,所以我们不能访问非静态成员,只能访问静态方法或静态变量。只能使用关于类的方式如 self static parent 等。使用时不用生成对象即可执行</li> </ul> <p><strong>类常量:</strong></p> <p>使用 <code>const</code> 来定义类常量,常量使用 <code>self::</code>来调用。</p> <p><strong>类的魔术方法</strong></p> <p>PHP中的魔术方法(Magic Methods)是一组特殊的方法,用于在特定的情况下自动调用。这些方法以两个下划线(__)开头和结尾,它们允许您拦截并响应类的内部事件,例如实例化、属性访问、方法调用等。</p> <table> <thead> <tr> <th>方法名</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td>__construct()</td> <td>当一个对象被实例化时自动调用的构造方法。</td> </tr> <tr> <td>__destruct()</td> <td>当一个对象不再被引用时自动调用的析构方法。</td> </tr> <tr> <td>__get($property)</td> <td>在访问一个不存在或不可访问的属性时自动调用,可以用于动态获取属性的值。</td> </tr> <tr> <td>__set(<code>$property</code>,<code>$value</code>)</td> <td>在给一个不存在或不可访问的属性赋值时自动调用,可以用于动态设置属性的值。</td> </tr> <tr> <td>__isset($property)</td> <td>在使用 <code>isset()</code> 或 <code>empty()</code> 检查一个不存在或不可访问的属性时自动调用。</td> </tr> <tr> <td>__call(<code>$method, </code>$<code>arguments</code>)</td> <td>在调用一个不存在或不可访问的方法时自动调用。</td> </tr> <tr> <td>__callStatic(<code>$method</code>, <code>$arguments</code>)</td> <td>在调用一个不存在或不可访问的静态方法时自动调用。</td> </tr> <tr> <td>__unset($property)</td> <td>在使用 <code>unset()</code> 删除一个不存在或不可访问的属性时自动调用。</td> </tr> <tr> <td>__sleep()</td> <td>在使用 <code>serialize()</code> 时自动调用,用于准备对象序列化过程中需要保存的属性列表。</td> </tr> <tr> <td>__wakeup()</td> <td>在使用 <code>unserialize()</code> 时自动调用,用于重新初始化对象。</td> </tr> <tr> <td>__toString()</td> <td>当将对象作为字符串进行输出时自动调用。</td> </tr> <tr> <td>__set_state($data)</td> <td>在使用 <code>var_export()</code> 导出类时自动调用,用于返回类的代码表示。</td> </tr> <tr> <td>__clone()</td> <td>当通过 <code>clone</code> 关键字克隆一个对象时自动调用。</td> </tr> <tr> <td>__debugInfo()</td> <td>在使用 <code>var_dump()</code> 或 <code>print_r()</code> 打印对象时自动调用,用于返回调试信息的数组。</td> </tr> </tbody> </table> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token variable">$email</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$email</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__get</span><span class="token punctuation">(</span><span class="token variable">$property</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token variable">$property</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token variable">$property</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token constant">null</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__set</span><span class="token punctuation">(</span><span class="token variable">$property</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token variable">$property</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$value</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string double-quoted-string">"User: "</span> <span class="token operator">.</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">" ("</span> <span class="token operator">.</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">")"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__call</span><span class="token punctuation">(</span><span class="token variable">$method</span><span class="token punctuation">,</span> <span class="token variable">$arguments</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$method</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'greet'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$arguments</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token variable">$arguments</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token string single-quoted-string">'Guest'</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Hello, <span class="token interpolation"><span class="token variable">$name</span></span>! Nice to meet you!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'John Doe'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'john@example.com'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">;</span> <span class="token comment">// 输出:John Doe</span> <span class="token keyword">echo</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">email</span><span class="token punctuation">;</span> <span class="token comment">// 输出:john@example.com</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">age</span> <span class="token operator">=</span> <span class="token number">25</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">;</span> <span class="token comment">// 输出:25</span> <span class="token keyword">echo</span> <span class="token variable">$user</span><span class="token punctuation">;</span> <span class="token comment">// 输出:User: John Doe (john@example.com)</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token function">greet</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Alice'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:Hello, Alice! Nice to meet you!</span> </code></pre> <p><strong>抽象类与抽象方法</strong></p> <p>抽象类和抽象方法是面向对象编程中的概念,用于实现抽象和多态性的特性。具有抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承,通过 extends 来实现,抽象类中也可以定义普通方法。</p> <ul> <li>当父类为抽象类时,子类必须重写父类的抽象方法</li> <li>抽象类里不一定非要写抽象方法,但有抽象方法的类必须定义为抽象类</li> <li>抽象类必须继承使用</li> <li>抽象方法不能有主体即{}</li> </ul> <p><strong>注意:</strong></p> <p>抽象类(Abstract Class)是不能被实例化的类,它只能被用作其他类的基类。抽象类可以包含具体的方法实现,也可以包含抽象方法的声明。抽象类通过 <code>abstract</code> 关键字进行声明。</p> <p>抽象方法(Abstract Method)是在抽象类中声明的方法,没有具体的实现代码。它只是定义了方法的名称、参数列表和返回类型,而具体的方法实现需要在继承的子类中完成。抽象方法通过在方法声明中使用 <code>abstract</code> 关键字进行声明。</p> <pre><code class="prism language-php"><span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">AbstractClass</span> <span class="token punctuation">{</span> <span class="token comment">// 强制要求子类定义这些方法</span> <span class="token keyword">abstract</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">abstract</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">prefixValue</span><span class="token punctuation">(</span><span class="token variable">$prefix</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 普通方法(非抽象方法)</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">printOut</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">print</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p><strong>接口(interface )</strong></p> <p>接口(Interface)是一种定义了一组方法的抽象类型,它只定义了方法的签名(名称、参数和返回类型),而没有具体的实现。接口可以被类实现(implement),一个类可以实现一个或多个接口。</p> <p>接口与抽象类的区别:</p> <p>​ 1 接口只能用 implements 实现 抽象类用 extends 继承实现。</p> <p>​ 2 接口没有数据成员,可以定义常量,抽象类可以有。</p> <p>​ 3 接口没有构造函数,抽象类可以定义构造函数。</p> <p>​ 4 接口方法都是 public 抽象类方法可以用 protected private public 来修饰。</p> <p>​ 5 一个类可以实现多个接口,但只能继承一个抽象类。</p> <p>​ 6 接口中不可以有成员方法,抽象类可以有成员方法。</p> <p>例子:</p> <pre><code class="prism language-php"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Logger</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">log</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">DbOperate</span> <span class="token keyword">implements</span> <span class="token class-name">Logger</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">log</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Logging message to a file: <span class="token interpolation"><span class="token variable">$message</span></span>\n"</span><span class="token punctuation">;</span> <span class="token comment">//实现log接口方法</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">CreateGoods</span> <span class="token keyword">implements</span> <span class="token class-name">Logger</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">log</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Logging message to a createGoods: <span class="token interpolation"><span class="token variable">$message</span></span>\n"</span><span class="token punctuation">;</span> <span class="token comment">//实现log接口方法</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$fileLogger</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DbOperate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$fileLogger</span><span class="token operator">-></span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Error Info"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:Logging message to a file: Error Info</span> <span class="token variable">$databaseLogger</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CreateGoods</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$databaseLogger</span><span class="token operator">-></span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Warning"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:Logging message to a createGoods: Warning</span> </code></pre> <p>事件,例如实例化、属性访问、方法调用等。</p> <table> <thead> <tr> <th>方法名</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td>__construct()</td> <td>当一个对象被实例化时自动调用的构造方法。</td> </tr> <tr> <td>__destruct()</td> <td>当一个对象不再被引用时自动调用的析构方法。</td> </tr> <tr> <td>__get($property)</td> <td>在访问一个不存在或不可访问的属性时自动调用,可以用于动态获取属性的值。</td> </tr> <tr> <td>__set(<code>$property</code>,<code>$value</code>)</td> <td>在给一个不存在或不可访问的属性赋值时自动调用,可以用于动态设置属性的值。</td> </tr> <tr> <td>__isset($property)</td> <td>在使用 <code>isset()</code> 或 <code>empty()</code> 检查一个不存在或不可访问的属性时自动调用。</td> </tr> <tr> <td>__call(<code>$method, </code>$<code>arguments</code>)</td> <td>在调用一个不存在或不可访问的方法时自动调用。</td> </tr> <tr> <td>__callStatic(<code>$method</code>, <code>$arguments</code>)</td> <td>在调用一个不存在或不可访问的静态方法时自动调用。</td> </tr> <tr> <td>__unset($property)</td> <td>在使用 <code>unset()</code> 删除一个不存在或不可访问的属性时自动调用。</td> </tr> <tr> <td>__sleep()</td> <td>在使用 <code>serialize()</code> 时自动调用,用于准备对象序列化过程中需要保存的属性列表。</td> </tr> <tr> <td>__wakeup()</td> <td>在使用 <code>unserialize()</code> 时自动调用,用于重新初始化对象。</td> </tr> <tr> <td>__toString()</td> <td>当将对象作为字符串进行输出时自动调用。</td> </tr> <tr> <td>__set_state($data)</td> <td>在使用 <code>var_export()</code> 导出类时自动调用,用于返回类的代码表示。</td> </tr> <tr> <td>__clone()</td> <td>当通过 <code>clone</code> 关键字克隆一个对象时自动调用。</td> </tr> <tr> <td>__debugInfo()</td> <td>在使用 <code>var_dump()</code> 或 <code>print_r()</code> 打印对象时自动调用,用于返回调试信息的数组。</td> </tr> </tbody> </table> <pre><code class="prism language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token variable">$email</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$email</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__get</span><span class="token punctuation">(</span><span class="token variable">$property</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token variable">$property</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token variable">$property</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token constant">null</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__set</span><span class="token punctuation">(</span><span class="token variable">$property</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token variable">$property</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$value</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string double-quoted-string">"User: "</span> <span class="token operator">.</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">" ("</span> <span class="token operator">.</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'email'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">")"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__call</span><span class="token punctuation">(</span><span class="token variable">$method</span><span class="token punctuation">,</span> <span class="token variable">$arguments</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$method</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'greet'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$arguments</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token variable">$arguments</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token string single-quoted-string">'Guest'</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Hello, <span class="token interpolation"><span class="token variable">$name</span></span>! Nice to meet you!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'John Doe'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'john@example.com'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">;</span> <span class="token comment">// 输出:John Doe</span> <span class="token keyword">echo</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">email</span><span class="token punctuation">;</span> <span class="token comment">// 输出:john@example.com</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">age</span> <span class="token operator">=</span> <span class="token number">25</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token property">age</span><span class="token punctuation">;</span> <span class="token comment">// 输出:25</span> <span class="token keyword">echo</span> <span class="token variable">$user</span><span class="token punctuation">;</span> <span class="token comment">// 输出:User: John Doe (john@example.com)</span> <span class="token variable">$user</span><span class="token operator">-></span><span class="token function">greet</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Alice'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:Hello, Alice! Nice to meet you!</span> </code></pre> <p><strong>抽象类与抽象方法</strong></p> <p>抽象类和抽象方法是面向对象编程中的概念,用于实现抽象和多态性的特性。具有抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承,通过 extends 来实现,抽象类中也可以定义普通方法。</p> <ul> <li>当父类为抽象类时,子类必须重写父类的抽象方法</li> <li>抽象类里不一定非要写抽象方法,但有抽象方法的类必须定义为抽象类</li> <li>抽象类必须继承使用</li> <li>抽象方法不能有主体即{}</li> </ul> <p><strong>注意:</strong></p> <p>抽象类(Abstract Class)是不能被实例化的类,它只能被用作其他类的基类。抽象类可以包含具体的方法实现,也可以包含抽象方法的声明。抽象类通过 <code>abstract</code> 关键字进行声明。</p> <p>抽象方法(Abstract Method)是在抽象类中声明的方法,没有具体的实现代码。它只是定义了方法的名称、参数列表和返回类型,而具体的方法实现需要在继承的子类中完成。抽象方法通过在方法声明中使用 <code>abstract</code> 关键字进行声明。</p> <pre><code class="prism language-php"><span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">AbstractClass</span> <span class="token punctuation">{</span> <span class="token comment">// 强制要求子类定义这些方法</span> <span class="token keyword">abstract</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">abstract</span> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">prefixValue</span><span class="token punctuation">(</span><span class="token variable">$prefix</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 普通方法(非抽象方法)</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">printOut</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">print</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p><strong>接口(interface )</strong></p> <p>接口(Interface)是一种定义了一组方法的抽象类型,它只定义了方法的签名(名称、参数和返回类型),而没有具体的实现。接口可以被类实现(implement),一个类可以实现一个或多个接口。</p> <p>接口与抽象类的区别:</p> <p>​ 1 接口只能用 implements 实现 抽象类用 extends 继承实现。</p> <p>​ 2 接口没有数据成员,可以定义常量,抽象类可以有。</p> <p>​ 3 接口没有构造函数,抽象类可以定义构造函数。</p> <p>​ 4 接口方法都是 public 抽象类方法可以用 protected private public 来修饰。</p> <p>​ 5 一个类可以实现多个接口,但只能继承一个抽象类。</p> <p>​ 6 接口中不可以有成员方法,抽象类可以有成员方法。</p> <p>例子:</p> <pre><code class="prism language-php"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Logger</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">log</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">DbOperate</span> <span class="token keyword">implements</span> <span class="token class-name">Logger</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">log</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Logging message to a file: <span class="token interpolation"><span class="token variable">$message</span></span>\n"</span><span class="token punctuation">;</span> <span class="token comment">//实现log接口方法</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">CreateGoods</span> <span class="token keyword">implements</span> <span class="token class-name">Logger</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">log</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Logging message to a createGoods: <span class="token interpolation"><span class="token variable">$message</span></span>\n"</span><span class="token punctuation">;</span> <span class="token comment">//实现log接口方法</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$fileLogger</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DbOperate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$fileLogger</span><span class="token operator">-></span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Error Info"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:Logging message to a file: Error Info</span> <span class="token variable">$databaseLogger</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CreateGoods</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$databaseLogger</span><span class="token operator">-></span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Warning"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出:Logging message to a createGoods: Warning</span> </code></pre> <p><strong>欢迎点赞,评论,加关注!谢谢</strong></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1742641799987478528"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(PHP全世界最好的语言,php,开发语言,javascript,laravel,phpstorm,后端,爬虫)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1899588126276382720.htm" title="Dash-FastAPI-Admin 技术文档" target="_blank">Dash-FastAPI-Admin 技术文档</a> <span class="text-muted">钟音洋Winona</span> <div>Dash-FastAPI-Admin技术文档Dash-FastAPI-AdminAgeneralmiddleandbackendmanagementsystemdevelopedpurelyinPythonbasedonDash+FastAPI.基于Dash+FastAPI纯Python开发的一个通用中后台管理系统。项目地址:https://gitcode.com/gh_mirrors/da/Da</div> </li> <li><a href="/article/1899588126679035904.htm" title="【FFmpeg】AVpacket中解析出Nalu" target="_blank">【FFmpeg】AVpacket中解析出Nalu</a> <span class="text-muted">gma999</span> <a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a> <div>概述项目中遇到的一个难题,即需要从RTSP流地址中解析出来Nalu,然后对Nalu进行封包发送到GB28181平台。本文仅仅总结如何利用FFmpeg库中的函数通过AVpacket解析出来Nalu的可行性以及方法。如果是非嵌入式设备,也可以自己搭建一个小型RTSP服务器来实现,其中各种功能也可以自行控制,后面文章再进行总结源码分析可行性分析FFmpeg库中没有找到直接解析出来的Nalu的方法,如果无</div> </li> <li><a href="/article/1899588127173963776.htm" title="Ajax 封装Ajax函数(含注释)" target="_blank">Ajax 封装Ajax函数(含注释)</a> <span class="text-muted">夏沐_lk</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/%E5%B0%81%E8%A3%85%E5%87%BD%E6%95%B0/1.htm">封装函数</a> <div>封装好的Ajax函数/***发送一个AJAX请求*@param{String}method请求方法*@param{String}url请求地址*@param{Object}params请求参数*@param{Function}done请求完成过后需要做的事情(委托/回调)*/functionajax(method,url,params,done){//统一转换为大写便于后续判断method=met</div> </li> <li><a href="/article/1899587873204662272.htm" title="探索YubiKey的Go语言PIV实现:piv-go" target="_blank">探索YubiKey的Go语言PIV实现:piv-go</a> <span class="text-muted">诸盼忱Gazelle</span> <div>探索YubiKey的Go语言PIV实现:piv-gopiv-goKeysandcertificatesforYubiKeys,writteninGo项目地址:https://gitcode.com/gh_mirrors/pi/piv-go项目介绍piv-go是一个用Go语言实现的YubiKeyPIV(个人身份验证)规范的库。YubiKey是一种智能卡设备,广泛用于安全身份验证和加密操作。PIV规范</div> </li> <li><a href="/article/1899587873624092672.htm" title="Yubico PIV Tool 常见问题解决方案" target="_blank">Yubico PIV Tool 常见问题解决方案</a> <span class="text-muted">华坦璞Teresa</span> <div>YubicoPIVTool常见问题解决方案yubico-piv-toolCommandlinetoolfortheYubiKeyPIVapplication项目地址:https://gitcode.com/gh_mirrors/yu/yubico-piv-tool项目基础介绍YubicoPIVTool是一个用于与YubiKey上的个人身份验证(PIV)应用程序进行交互的命令行工具。通过该工具,用户</div> </li> <li><a href="/article/1899587874051911680.htm" title="Dash FastAPI Admin项目教程" target="_blank">Dash FastAPI Admin项目教程</a> <span class="text-muted">倪燃喆Queenie</span> <div>DashFastAPIAdmin项目教程项目地址:https://gitcode.com/gh_mirrors/da/Dash-FastAPI-Admin项目介绍DashFastAPIAdmin是一个基于FastAPI构建的后台管理界面框架,它旨在简化现代Web应用程序的管理任务。该项目利用了Dash库的强大图形界面功能,结合FastAPI的高性能和简洁的API设计,为开发者提供了一个开箱即用的解</div> </li> <li><a href="/article/1899587746876420096.htm" title="推荐项目:Yubico PIV Tool" target="_blank">推荐项目:Yubico PIV Tool</a> <span class="text-muted">刘瑛蓉</span> <div>推荐项目:YubicoPIVToolyubico-piv-toolCommandlinetoolfortheYubiKeyPIVapplication项目地址:https://gitcode.com/gh_mirrors/yu/yubico-piv-tool1、项目介绍YubicoPIVTool是一个与YubiKey的个人身份验证(PIV)应用交互的强大工具。它允许你在设备上生成密钥,导入密钥和证</div> </li> <li><a href="/article/1899587620510429184.htm" title="探索Yubico PIV工具:安全身份验证的新纪元" target="_blank">探索Yubico PIV工具:安全身份验证的新纪元</a> <span class="text-muted">秋玥多</span> <div>探索YubicoPIV工具:安全身份验证的新纪元yubico-piv-toolCommandlinetoolfortheYubiKeyPIVapplication项目地址:https://gitcode.com/gh_mirrors/yu/yubico-piv-tool项目介绍YubicoPIV工具是一款专为与YubiKey上的个人身份验证(PIV)应用交互而设计的软件。YubiKey是一种流行的</div> </li> <li><a href="/article/1899587494295433216.htm" title="探索Dash-FastAPI-Admin:一款强大的Web应用后台构建工具" target="_blank">探索Dash-FastAPI-Admin:一款强大的Web应用后台构建工具</a> <span class="text-muted">司莹嫣Maude</span> <div>探索Dash-FastAPI-Admin:一款强大的Web应用后台构建工具项目地址:https://gitcode.com/gh_mirrors/da/Dash-FastAPI-Admin是一个开源项目,它结合了Dash和FastAPI两大流行框架的威力,为开发者提供了一站式解决方案,用于快速构建美观且功能丰富的Web应用后台。通过本文,我们将深入了解其核心特性、工作原理,以及如何利用它来提升开发</div> </li> <li><a href="/article/1899587367988162560.htm" title="设计模式-工厂模式(Factory Pattern)" target="_blank">设计模式-工厂模式(Factory Pattern)</a> <span class="text-muted">砥砺前行~</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/1.htm">简单工厂模式</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F/1.htm">工厂方法模式</a><a class="tag" taget="_blank" href="/search/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/1.htm">抽象工厂模式</a> <div>承接Qt/C++软件开发项目,高质量交付,灵活沟通,长期维护支持。需求所寻,技术正适,共创完美,欢迎私信联系!一、工厂模式说明工厂模式是一种创建型设计模式,它提供了一种将对象的创建与使用分离的方式。工厂模式通过引入一个公共的接口来创建对象,而不是通过直接调用构造函数来创建对象。这样做的好处是使得代码更加灵活,更容易维护和扩展。工厂模式通常包含以下几个角色:产品(Product):产品是工厂模式所创</div> </li> <li><a href="/article/1899586989888434176.htm" title="C++中的&(引用与地址)" target="_blank">C++中的&(引用与地址)</a> <span class="text-muted">南陵花神</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>大纲1引用简介2引用应用2.1引用作为参数2.2常引用2.3引用作为返回值2.4引用和多态3引用总结1引用简介在C++中,&既有引用又有取地址,其实他们的区别可以用一句话概括:=号左边是引用,=号右边是取址。比如inta=3;int&b=a;//引用;int*p=&a;//取地址引用b,它是变量a的引用,即别名,&在此不是求地址运算,而是起标识作用,引用声明完毕后,相当于目标变量名有两个名称,操作</div> </li> <li><a href="/article/1899586988739194880.htm" title="从0开始的操作系统手搓教程22——锁让我们的并发变得更加安全" target="_blank">从0开始的操作系统手搓教程22——锁让我们的并发变得更加安全</a> <span class="text-muted">charlie114514191</span> <a class="tag" taget="_blank" href="/search/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%95%99%E7%A8%8B/1.htm">从0开始的操作系统教程</a><a class="tag" taget="_blank" href="/search/%E6%95%99%E7%A8%8B/1.htm">教程</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a><a class="tag" taget="_blank" href="/search/%E6%89%8B%E6%90%93%E6%95%99%E7%A8%8B/1.htm">手搓教程</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91%E5%AE%89%E5%85%A8/1.htm">并发安全</a> <div>目录所以,我们需要锁实现一个锁:CCLocker与CCSemaphore实现一个带有锁的控制台Output子系统写一下代码效果图下一篇笔者是先于此项目才知道的锁的。实际上,上一个问题的根源是——锁的缺失导致程序潜在的不安全。如果你学习过锁和信号量,那显然,你就可以直接跳到实现上,直接实现一个信号量和锁就可以结束本小节的内容了,如果你没有,请听我慢慢道来。现在呢,我们启动这个存在问题的内核。然后当运</div> </li> <li><a href="/article/1899586735889772544.htm" title="nacos下载及安装" target="_blank">nacos下载及安装</a> <span class="text-muted">bxp1321</span> <a class="tag" taget="_blank" href="/search/springcloud/1.htm">springcloud</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>下载官方最新稳定版github下载较慢,推荐下面的下载链接NacosServer下载|Nacos官网点击下载和试用下载最新稳定版NacosServer下载|Nacos官网配置检查(可选)默认情况下,Nacos使用内置的Derby数据库(单机模式无需修改)。如需使用MySQL(生产环境推荐),需修改配置文件:打开conf/application.properties。修改数据库配置:spring.d</div> </li> <li><a href="/article/1899586736640552960.htm" title="springcloud gateway搭建及动态获取nacos注册的服务信息信息" target="_blank">springcloud gateway搭建及动态获取nacos注册的服务信息信息</a> <span class="text-muted">bxp1321</span> <a class="tag" taget="_blank" href="/search/springcloud/1.htm">springcloud</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a><a class="tag" taget="_blank" href="/search/gateway/1.htm">gateway</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>前言SpringCloudGateway通过集成Nacos服务发现,可以动态获取注册到Nacos的微服务实例信息,并根据服务名(ServiceName)自动生成路由规则或手动配置路由规则,实现请求的动态路由和负载均衡。一个最简单的网关就是实现所有微服务的代理即可,但是生产环境通常需要服务鉴权限制访问等,这里先简单示例一个没有鉴权,可以访问所有微服务接口的网关创建项目创建一个springboot项目</div> </li> <li><a href="/article/1899585728749301760.htm" title="mathpix snpping公式输入不限次数的方法" target="_blank">mathpix snpping公式输入不限次数的方法</a> <span class="text-muted">冰虺</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E8%BE%91%E5%99%A8/1.htm">编辑器</a> <div>在写论文时,不可避免的需要输入大量的公式,为了减少公式输入所需的时间,mathpixsnpping这款软件,带来了极大的方便。仅需截图,就能快速输入好数学公式(化学式)。但由于已经过了推广的时期,该软件已经开始收费了!!!!!!为了不限次数输入,特地提供以下开源网站,供大家使用!!!!!使用方法:1、win+shift+s将公式截取复制到粘贴板2、打开以下网站在线LaTeX公式编辑器-编辑器3、将</div> </li> <li><a href="/article/1899585601938714624.htm" title="AttributeError: ‘NoneType‘ object has no attribute ‘astype‘" target="_blank">AttributeError: ‘NoneType‘ object has no attribute ‘astype‘</a> <span class="text-muted">冰虺</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>今天在复现fasterRCNN网络时,出现AttributeError:'NoneType'objecthasnoattribute'astype'报错,如下图所示通过dug,发现im的shape为none,究其原因是因为cv.imread无法读取图像,主要原因是因为我数据集中存在中文名称。更加详细的请参考一下大佬的博客pythoncv2.imread读取中文路径的图片返回为None的问题_陶将的</div> </li> <li><a href="/article/1899585602387505152.htm" title="origin2021去除demo的方法" target="_blank">origin2021去除demo的方法</a> <span class="text-muted">冰虺</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a> <div>Origin软件去除demo水印_七爷OK的博客-CSDN博客_origin去除demo水印PS:替换origin.exe过后一定得双击一下,不然水印仍然存在</div> </li> <li><a href="/article/1899585601125019648.htm" title="比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)" target="_blank">比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)</a> <span class="text-muted">ThetaarSofVenice</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F/1.htm">工厂方法模式</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>工厂方法模式(FactoryMethodPattern)工厂方法模式(FactoryMethodPattern)工厂方法模式(FactoryMethodPattern)概述工厂方法模式(FactoryMethodPattern)结构图工厂方法模式(FactoryMethodPattern)涉及的角色talkischeap,showyoumycode总结工厂方法模式(FactoryMethodPat</div> </li> <li><a href="/article/1899584468054765568.htm" title="网络编程基础知识总结" target="_blank">网络编程基础知识总结</a> <span class="text-muted">老梁学Android&HarmonyOS</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/1.htm">网络编程</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>1、网络编程的基础知识总结网络编程说的是在不同计算机之间进行数据传输和通信。本文主要是一些基础知识的总结:本文的“计算机”包含电脑、手机、平板、手表、汽车等可以联网的设备。1.1网络协议1.1.1描述:网络协议是计算机网络中通信双方共同遵守的规则和约定,就是马路上的红绿灯约定红灯停绿灯行一样,专门用于指导数据的传输和处理。1.1.2协议层次:协议通常有两种说法,分别是OSI七层模型或TCP/IP四</div> </li> <li><a href="/article/1899584215893209088.htm" title="展开说说:Android之View基础知识解析" target="_blank">展开说说:Android之View基础知识解析</a> <span class="text-muted">老梁学Android&HarmonyOS</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/View/1.htm">View</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>View虽不属于Android四代组件,但应用程度却非常非常广泛。在Android客户端,君所见之处皆是View。我们看到的Button、ImageView、TextView等等可视化的控件都是View,ViewGroup是View的子类因此它也是View。但是现在我们把View和ViewGroup当成两个类来看待,ViewGroup可以容纳View和ViewGroup,但View不可以再容纳其他</div> </li> <li><a href="/article/1899584089531412480.htm" title="代理模式(Proxy Pattern)详解" target="_blank">代理模式(Proxy Pattern)详解</a> <span class="text-muted">FHKHH</span> <a class="tag" taget="_blank" href="/search/C%2B%2B%E5%AD%A6%E4%B9%A0/1.htm">C++学习</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/1.htm">代理模式</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>代理模式(ProxyPattern)详解一、什么是代理模式?代理模式是一种结构型设计模式,通过创建代理对象来间接访问目标对象(委托类),实现对目标对象的访问控制、权限验证、延迟加载或功能增强。代理对象起到中介作用,它不仅仅是对目标对象的直接替代,还能在访问目标对象时增加一些额外的逻辑。二、代理模式的应用场景权限控制:只有特定角色才能访问某些资源或功能。远程访问:通过代理访问分布式系统中的远程对象(</div> </li> <li><a href="/article/1899583961991016448.htm" title="工程化与框架系列(27)--前端音视频处理" target="_blank">工程化与框架系列(27)--前端音视频处理</a> <span class="text-muted">一进制ᅟᅠ        ‌‍‎‏ </span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96%E4%B8%8E%E6%A1%86%E6%9E%B6/1.htm">前端工程化与框架</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>前端音视频处理引言前端音视频处理是现代Web应用中的重要组成部分,涉及音频播放、视频处理、流媒体传输等多个方面。本文将深入探讨前端音视频处理的关键技术和最佳实践,帮助开发者构建高质量的多媒体应用。音视频技术概述前端音视频处理主要包括以下技术方向:音频处理:音频播放、录制、分析视频处理:视频播放、录制、编辑流媒体:实时音视频、直播推流WebRTC:点对点通信媒体格式:编解码、转换音频处理实现音频播放</div> </li> <li><a href="/article/1899583963257696256.htm" title="工程化与框架系列(29)--前端错误处理实践" target="_blank">工程化与框架系列(29)--前端错误处理实践</a> <span class="text-muted">一进制ᅟᅠ        ‌‍‎‏ </span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96%E4%B8%8E%E6%A1%86%E6%9E%B6/1.htm">前端工程化与框架</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>前端错误处理实践引言前端错误处理是保证应用稳定性和用户体验的关键环节。本文将深入探讨前端错误处理的最佳实践,包括错误捕获、监控、上报和恢复等方面,帮助开发者构建更加健壮的前端应用。错误处理概述前端错误处理主要包括以下方面:错误捕获:运行时错误、Promise错误、网络错误等错误监控:错误收集、分析和统计错误上报:错误信息发送到服务器错误恢复:优雅降级和容错处理调试支持:错误定位和调试辅助错误处理实</div> </li> <li><a href="/article/1899583709741379584.htm" title="国赛数学建模高教社杯历届优秀论文全集" target="_blank">国赛数学建模高教社杯历届优秀论文全集</a> <span class="text-muted">BanDeng001</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1/1.htm">数学建模</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1/1.htm">数学建模</a> <div>2004到2024高教社杯全国大学生数学建模竞赛题目及优秀论文1往届高教社杯题目2024年:A题:“板凳龙”闹元宵B题:生产过程中的决策问题C题:农作物的种植策略D题:反潜航空深弹命中概率问题E题:交通流量管控2023年:A题:定日镜场的优化设计B题:多波束测线问题C题:蔬菜类商品的自动定价与补货决策D题:圈养湖羊的空间利用率E题:黄河水沙检测数据分析2022年:A题:波浪能最大输出功率设计B题:</div> </li> <li><a href="/article/1899583708147544064.htm" title="STM32中CAN通信详解与示例代码" target="_blank">STM32中CAN通信详解与示例代码</a> <span class="text-muted">ArqLoop</span> <a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E4%B8%8E%E9%80%9A%E4%BF%A1/1.htm">信息与通信</a> <div>CAN通信是一种常用的总线通信协议,广泛应用于工业控制、汽车电子等领域。在本文中,我们将详细介绍如何在STM32微控制器上实现CAN通信,并提供相应的示例代码。硬件准备在开始之前,我们需要准备以下硬件:STM32微控制器开发板(例如STM32F4Discovery)CAN收发器(例如MCP2551)CAN总线连接线引脚配置首先,我们需要配置STM32的引脚来支持CAN功能。根据具体的型号和开发板,</div> </li> <li><a href="/article/1899582574662053888.htm" title="Typecho 极致美化:打造与众不同的博客" target="_blank">Typecho 极致美化:打造与众不同的博客</a> <span class="text-muted">6v6-博客</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>Typecho极致美化:打造与众不同的博客Typecho是一款轻量级的博客系统,但通过一些高级美化技巧,你可以让它变得与众不同。本文将介绍如何通过自定义JS、自定义CSS、自定义侧边栏模块等功能,实现Typecho的极致美化。1.自定义JS:动态效果与交互通过自定义JS,你可以为Typecho添加动态效果和交互功能。示例1:页面滚动动画在header.php中添加以下代码:ScrollReveal</div> </li> <li><a href="/article/1899582447910187008.htm" title="从零开始搭建私有云服务器" target="_blank">从零开始搭建私有云服务器</a> <span class="text-muted">6v6-博客</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>从零开始搭建私有云服务器1.准备工作硬件要求:一台性能足够的服务器(可以是物理机或虚拟机)。建议配置:至少4核CPU、8GB内存、100GB硬盘。操作系统:推荐使用UbuntuServer20.04LTS。网络环境:确保服务器有稳定的公网IP或内网穿透能力。2.安装操作系统下载UbuntuServer20.04LTS镜像:https://ubuntu.com/download/server。使用工</div> </li> <li><a href="/article/1899582448400920576.htm" title="机器学习入门指南:从 TensorFlow 到 PyTorch" target="_blank">机器学习入门指南:从 TensorFlow 到 PyTorch</a> <span class="text-muted">6v6-博客</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/tensorflow/1.htm">tensorflow</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a> <div>机器学习入门指南:从TensorFlow到PyTorch机器学习(MachineLearning)是人工智能的核心领域之一,近年来在图像识别、自然语言处理、推荐系统等领域取得了巨大进展。本文将从基础概念入手,介绍机器学习的核心知识,并带你快速上手两大主流框架:TensorFlow和PyTorch。机器学习基础什么是机器学习?机器学习是一种通过数据训练模型,使计算机能够自动学习和改进的技术。它主要分</div> </li> <li><a href="/article/1899582070011785216.htm" title="【无标题】DeepSeek是可对接那些端口" target="_blank">【无标题】DeepSeek是可对接那些端口</a> <span class="text-muted">李鲶鱼</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>DeepSeek是一个强大的AI模型,可以应用于多个端口,为各种场景提供智能解决方案。移动端应用智能手机助手:DeepSeek集成到手机助手中,提供智能对话、文本写作、语言翻译等功能。例如,华为的小艺助手和荣耀的YOYO智能体通过接入DeepSeek,提升了对话流畅度和知识库的时效性。虚拟主播:利用DeepSeek生成虚拟主播,进行24小时优质播报。桌面端应用智能客服:在医院的官方公众号中接入De</div> </li> <li><a href="/article/1899581062724513792.htm" title="PDF 文件的安全功能概述" target="_blank">PDF 文件的安全功能概述</a> <span class="text-muted">IDRSolutions_CN</span> <a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/1.htm">软件工程</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E5%9B%A2%E9%98%9F%E5%BC%80%E5%8F%91/1.htm">团队开发</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>由于安全问题始终存在,我们希望重点介绍PDF文件格式提供的一些安全功能。如果您希望控制或限制用户可以执行的操作,这些功能可以启用。本文将介绍可以阻止哪些类型的操作,以及可以实施哪些不同的身份验证技术来提高PDF的安全性。可以控制哪些操作?在深入探讨可用的不同安全选项之前,我认为提供一些示例来说明可以控制的操作是有用的。这些操作包括限制谁可以:1查看内容2添加/修改文本注释3填写交互式表单字段(包括</div> </li> <li><a href="/article/62.htm" title="关于旗正规则引擎下载页面需要弹窗保存到本地目录的问题" target="_blank">关于旗正规则引擎下载页面需要弹窗保存到本地目录的问题</a> <span class="text-muted">何必如此</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/%E8%B6%85%E9%93%BE%E6%8E%A5/1.htm">超链接</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD/1.htm">文件下载</a><a class="tag" taget="_blank" href="/search/%E7%AA%97%E5%8F%A3/1.htm">窗口</a> <div>生成下载页面是需要选择“录入提交页面”,生成之后默认的下载页面<a>标签超链接为:<a href="<%=root_stimage%>stimage/image.jsp?filename=<%=strfile234%>&attachname=<%=java.net.URLEncoder.encode(file234filesourc</div> </li> <li><a href="/article/189.htm" title="【Spark九十八】Standalone Cluster Mode下的资源调度源代码分析" target="_blank">【Spark九十八】Standalone Cluster Mode下的资源调度源代码分析</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/cluster/1.htm">cluster</a> <div>在分析源代码之前,首先对Standalone Cluster Mode的资源调度有一个基本的认识: 首先,运行一个Application需要Driver进程和一组Executor进程。在Standalone Cluster Mode下,Driver和Executor都是在Master的监护下给Worker发消息创建(Driver进程和Executor进程都需要分配内存和CPU,这就需要Maste</div> </li> <li><a href="/article/316.htm" title="linux上独立安装部署spark" target="_blank">linux上独立安装部署spark</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85/1.htm">安装</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/1.4/1.htm">1.4</a><a class="tag" taget="_blank" href="/search/%E9%83%A8%E7%BD%B2/1.htm">部署</a> <div>下面讲一下linux上安装spark,以 Standalone Mode 安装   1)首先安装JDK   下载JDK:jdk-7u79-linux-x64.tar.gz  ,版本是1.7以上都行,解压 tar -zxvf jdk-7u79-linux-x64.tar.gz     然后配置 ~/.bashrc&nb</div> </li> <li><a href="/article/443.htm" title="Java 字节码之解析一" target="_blank">Java 字节码之解析一</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E8%8A%82%E7%A0%81/1.htm">字节码</a><a class="tag" taget="_blank" href="/search/javap/1.htm">javap</a> <div>    一: Java 字节代码的组织形式   类文件 {     OxCAFEBABE ,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组,方法个数,方法信息数组,属性个数,属性信息数组 } &nbs</div> </li> <li><a href="/article/570.htm" title="java各种小工具代码" target="_blank">java各种小工具代码</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1.数组转换成List import java.util.Arrays; Arrays.asList(Object[] obj); 2.判断一个String型是否有值 import org.springframework.util.StringUtils; if (StringUtils.hasText(str)) 3.判断一个List是否有值 import org.spring</div> </li> <li><a href="/article/697.htm" title="加快FineReport报表设计的几个心得体会" target="_blank">加快FineReport报表设计的几个心得体会</a> <span class="text-muted">老A不折腾</span> <a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a> <div>一、从远程服务器大批量取数进行表样设计时,最好按“列顺序”取一个“空的SQL语句”,这样可提高设计速度。否则每次设计时模板均要从远程读取数据,速度相当慢!! 二、找一个富文本编辑软件(如NOTEPAD+)编辑SQL语句,这样会很好地检查语法。有时候带参数较多检查语法复杂时,结合FineReport中生成的日志,再找一个第三方数据库访问软件(如PL/SQL)进行数据检索,可以很快定位语法错误。 </div> </li> <li><a href="/article/824.htm" title="mysql linux启动与停止" target="_blank">mysql linux启动与停止</a> <span class="text-muted">墙头上一根草</span> <div>如何启动/停止/重启MySQL一、启动方式1、使用 service 启动:service mysqld start2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start3、使用 safe_mysqld 启动:safe_mysqld&二、停止1、使用 service 启动:service mysqld stop2、使用 mysqld 脚本启动:/etc/inin</div> </li> <li><a href="/article/951.htm" title="Spring中事务管理浅谈" target="_blank">Spring中事务管理浅谈</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86/1.htm">事务管理</a> <div> Spring中事务管理浅谈 By Tony Jiang@2012-1-20 Spring中对事务的声明式管理 拿一个XML举例 [html]  view plain copy print ? <?xml version="1.0" encoding="UTF-8"?>&nb</div> </li> <li><a href="/article/1078.htm" title="php中隐形字符65279(utf-8的BOM头)问题" target="_blank">php中隐形字符65279(utf-8的BOM头)问题</a> <span class="text-muted">alxw4616</span> <div>php中隐形字符65279(utf-8的BOM头)问题 今天遇到一个问题. php输出JSON 前端在解析时发生问题:parsererror.   调试: 1.仔细对比字符串发现字符串拼写正确.怀疑是 非打印字符的问题. 2.逐一将字符串还原为unicode编码. 发现在字符串头的位置出现了一个 65279的非打印字符.        </div> </li> <li><a href="/article/1205.htm" title="调用对象是否需要传递对象(初学者一定要注意这个问题)" target="_blank">调用对象是否需要传递对象(初学者一定要注意这个问题)</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%BC%A0%E9%80%92%E4%B8%8E%E8%B0%83%E7%94%A8%E6%8A%80%E5%B7%A7/1.htm">对象的传递与调用技巧</a> <div>    类和对象的简单的复习,在做项目的过程中有时候不知道怎样来调用类创建的对象,简单的几个类可以看清楚,一般在项目中创建十几个类往往就不知道怎么来看   为了以后能够看清楚,现在来回顾一下类和对象的创建,对象的调用和传递(前面写过一篇)   类和对象的基础概念:   JAVA中万事万物都是类 类有字段(属性),方法,嵌套类和嵌套接</div> </li> <li><a href="/article/1332.htm" title="JDK1.5 AtomicLong实例" target="_blank">JDK1.5 AtomicLong实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a><a class="tag" taget="_blank" href="/search/AtomicLong/1.htm">AtomicLong</a> <div>JDK1.5 AtomicLong实例 类 AtomicLong 可以用原子方式更新的 long 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicLong 可用在应用程序中(如以原子方式增加的序列号),并且不能用于替换 Long。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。  </div> </li> <li><a href="/article/1459.htm" title="自定义的RPC的Java实现" target="_blank">自定义的RPC的Java实现</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a> <div>        网上看到纯java实现的RPC,很不错。         RPC的全名Remote Process Call,即远程过程调用。使用RPC,可以像使用本地的程序一样使用远程服务器上的程序。下面是一个简单的RPC 调用实例,从中可以看到RPC如何</div> </li> <li><a href="/article/1586.htm" title="【RPC框架Hessian一】Hessian RPC Hello World" target="_blank">【RPC框架Hessian一】Hessian RPC Hello World</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Hello+world/1.htm">Hello world</a> <div>什么是Hessian The Hessian binary web service protocol makes web services usable without requiring a large framework, and without learning yet another alphabet soup of protocols. Because it is a binary p</div> </li> <li><a href="/article/1713.htm" title="【Spark九十五】Spark Shell操作Spark SQL" target="_blank">【Spark九十五】Spark Shell操作Spark SQL</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a> <div>在Spark Shell上,通过创建HiveContext可以直接进行Hive操作   1. 操作Hive中已存在的表   [hadoop@hadoop bin]$ ./spark-shell Spark assembly has been built with Hive, including Datanucleus jars on classpath Welcom</div> </li> <li><a href="/article/1840.htm" title="F5 往header加入客户端的ip" target="_blank">F5 往header加入客户端的ip</a> <span class="text-muted">ronin47</span> <div>when HTTP_RESPONSE {if {[HTTP::is_redirect]}{         HTTP::header replace Location [string map {:port/ /} [HTTP::header value Location]]HTTP::header replace Lo</div> </li> <li><a href="/article/1967.htm" title="java-61-在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差. 求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5," target="_blank">java-61-在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差. 求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5,</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>思路来自: http://zhedahht.blog.163.com/blog/static/2541117420116135376632/ 写了个java版的 public class GreatestLeftRightDiff { /** * Q61.在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差。 * 求所有数对之差的最大值。例如在数组</div> </li> <li><a href="/article/2094.htm" title="mongoDB 索引" target="_blank">mongoDB 索引</a> <span class="text-muted">开窍的石头</span> <a class="tag" taget="_blank" href="/search/mongoDB%E7%B4%A2%E5%BC%95/1.htm">mongoDB索引</a> <div>在这一节中我们讲讲在mongo中如何创建索引       得到当前查询的索引信息      db.user.find(_id:12).explain();        cursor: basicCoursor 指的是没有索引  &</div> </li> <li><a href="/article/2221.htm" title="[硬件和系统]迎峰度夏" target="_blank">[硬件和系统]迎峰度夏</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F/1.htm">系统</a> <div>  从这几天的气温来看,今年夏天的高温天气可能会维持在一个比较长的时间内    所以,从现在开始准备渡过炎热的夏天。。。。    每间房屋要有一个落地电风扇,一个空调(空调的功率和房间的面积有密切的关系)    坐的,躺的地方要有凉垫,床上要有凉席       电脑的机箱</div> </li> <li><a href="/article/2348.htm" title="基于ThinkPHP开发的公司官网" target="_blank">基于ThinkPHP开发的公司官网</a> <span class="text-muted">cuiyadll</span> <a class="tag" taget="_blank" href="/search/%E8%A1%8C%E4%B8%9A%E7%B3%BB%E7%BB%9F/1.htm">行业系统</a> <div>后端基于ThinkPHP,前端基于jQuery和BootstrapCo.MZ 企业系统 轻量级企业网站管理系统 运行环境:PHP5.3+, MySQL5.0 系统预览 系统下载:http://www.tecmz.com 预览地址:http://co.tecmz.com 各种设备自适应 响应式的网站设计能够对用户产生友好度,并且对于</div> </li> <li><a href="/article/2475.htm" title="Transaction and redelivery in JMS (JMS的事务和失败消息重发机制)" target="_blank">Transaction and redelivery in JMS (JMS的事务和失败消息重发机制)</a> <span class="text-muted">darrenzhu</span> <a class="tag" taget="_blank" href="/search/jms/1.htm">jms</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1/1.htm">事务</a><a class="tag" taget="_blank" href="/search/%E6%89%BF%E8%AE%A4/1.htm">承认</a><a class="tag" taget="_blank" href="/search/MQ/1.htm">MQ</a><a class="tag" taget="_blank" href="/search/acknowledge/1.htm">acknowledge</a> <div>JMS Message Delivery Reliability and Acknowledgement Patterns http://wso2.com/library/articles/2013/01/jms-message-delivery-reliability-acknowledgement-patterns/ Transaction and redelivery in </div> </li> <li><a href="/article/2602.htm" title="Centos添加硬盘完全教程" target="_blank">Centos添加硬盘完全教程</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/hardware/1.htm">hardware</a> <div>Linux的硬盘识别: sda        表示第1块SCSI硬盘 hda       表示第1块IDE硬盘 scd0      表示第1个USB光驱 一般使用“fdisk -l”命</div> </li> <li><a href="/article/2729.htm" title="yii2 restful web服务路由" target="_blank">yii2 restful web服务路由</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/yii2/1.htm">yii2</a> <div>路由 随着资源和控制器类准备,您可以使用URL如 http://localhost/index.php?r=user/create访问资源,类似于你可以用正常的Web应用程序做法。 在实践中,你通常要用美观的URL并采取有优势的HTTP动词。 例如,请求POST /users意味着访问user/create动作。 这可以很容易地通过配置urlManager应用程序组件来完成 如下所示</div> </li> <li><a href="/article/2856.htm" title="MongoDB查询(4)——游标和分页[八]" target="_blank">MongoDB查询(4)——游标和分页[八]</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/MongoDB%E6%B8%B8%E6%A0%87/1.htm">MongoDB游标</a><a class="tag" taget="_blank" href="/search/MongoDB%E6%B7%B1%E5%88%86%E9%A1%B5/1.htm">MongoDB深分页</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2177567 一、游标         数据库使用游标返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效控制,从shell中定义一个游标非常简单,就是将查询结果分配给一个变量(用var声明的变量就是局部变量),便创建了一个游标,如下所示: > var </div> </li> <li><a href="/article/2983.htm" title="Activity的四种启动模式和onNewIntent()" target="_blank">Activity的四种启动模式和onNewIntent()</a> <span class="text-muted">gundumw100</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>Android中Activity启动模式详解   在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。   Android总Activity的启动模式分为四种: Activity启动模式设置: <acti</div> </li> <li><a href="/article/3110.htm" title="攻城狮送女友的CSS3生日蛋糕" target="_blank">攻城狮送女友的CSS3生日蛋糕</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/css3/1.htm">css3</a> <div>在线预览:http://keleyi.com/keleyi/phtml/html5/29.htm   代码如下:   <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>攻城狮送女友的CSS3生日蛋糕-柯乐义<</div> </li> <li><a href="/article/3237.htm" title="读源码学Servlet(1)GenericServlet 源码分析" target="_blank">读源码学Servlet(1)GenericServlet 源码分析</a> <span class="text-muted">jzinfo</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8/1.htm">网络应用</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a> <div>Servlet API的核心就是javax.servlet.Servlet接口,所有的Servlet 类(抽象的或者自己写的)都必须实现这个接口。在Servlet接口中定义了5个方法,其中有3个方法是由Servlet 容器在Servlet的生命周期的不同阶段来调用的特定方法。     先看javax.servlet.servlet接口源码:  package </div> </li> <li><a href="/article/3364.htm" title="JAVA进阶:VO(DTO)与PO(DAO)之间的转换" target="_blank">JAVA进阶:VO(DTO)与PO(DAO)之间的转换</a> <span class="text-muted">snoopy7713</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/po/1.htm">po</a> <div>  PO即 Persistence Object  VO即 Value Object  VO和PO的主要区别在于:  VO是独立的Java Object。  PO是由Hibernate纳入其实体容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反应到实际数据库中。  实际上,这个VO被用作Data Transfer </div> </li> <li><a href="/article/3491.htm" title="mongodb group by date 聚合查询日期 统计每天数据(信息量)" target="_blank">mongodb group by date 聚合查询日期 统计每天数据(信息量)</a> <span class="text-muted">qiaolevip</span> <a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/%E7%BA%B5%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">纵观千象</a> <div>/* 1 */ { "_id" : ObjectId("557ac1e2153c43c320393d9d"), "msgType" : "text", "sendTime" : ISODate("2015-06-12T11:26:26.000Z")</div> </li> <li><a href="/article/3618.htm" title="java之18天 常用的类(一)" target="_blank">java之18天 常用的类(一)</a> <span class="text-muted">Luob.</span> <a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/Date/1.htm">Date</a><a class="tag" taget="_blank" href="/search/System/1.htm">System</a><a class="tag" taget="_blank" href="/search/Runtime/1.htm">Runtime</a><a class="tag" taget="_blank" href="/search/Rundom/1.htm">Rundom</a> <div>System类 import java.util.Properties; /** * System: * out:标准输出,默认是控制台 * in:标准输入,默认是键盘 * * 描述系统的一些信息 * 获取系统的属性信息:Properties getProperties(); * * * */ public class Sy</div> </li> <li><a href="/article/3745.htm" title="maven" target="_blank">maven</a> <span class="text-muted">wuai</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>1、安装maven:解压缩、添加M2_HOME、添加环境变量path 2、创建maven_home文件夹,创建项目mvn_ch01,在其下面建立src、pom.xml,在src下面简历main、test、main下面建立java文件夹 3、编写类,在java文件夹下面依照类的包逐层创建文件夹,将此类放入最后一级文件夹 4、进入mvn_ch01 4.1、mvn compile ,执行后会在</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>