php基础-系统函数-第15天

系统函数

一.常用系统函数有哪些?

1. 输出与调试

  • echo() / print():输出字符串。

    • 注意echo和print 不是函数 是一个语言结构

      • echo(string ...$expressions):void

        • 与print 的主要区别在于它 echo接受多个参数并且没有返回值

        • 参数以逗号分割

          php 复制代码
          $a = "Hello";
          $b = "World";
          
          // 用逗号分割 echo 多个值
          echo $a, " ", $b, "!";  
          // 输出:Hello World!
          php 复制代码
          $a = (echo "<pre>"); //因为没有返回值这样写是错的
      • print(string $expression): int

        • 与echo的区别是它只接受一个参数并且始终返回 1
  • print_r():输出数组或对象的结构。

    php 复制代码
    print_r(mixed $value, bool $return = false): string|true
    • $expression:要打印的变量,可以是数组、对象或其他类型

      复制代码
      $return`:布尔值,默认 `false
      • false直接输出到屏幕
      • true返回字符串,不输出
  • var_dump():详细输出变量类型和值。

    • var_dump(mixed $value, mixed ...$values): void
      • 可以多个参数
      • 函数没有返回值,只能直接输出
  • var_export():输出合法的 PHP 表达式形式。

1.1 示例

php 复制代码
<?php
// 1. echo 和 print
$name = "PHP";
echo "Hello, " . $name . "!"; // 输出: Hello, PHP!
echo "<br/>";
print(" This is print.");      // 输出:  This is print.
echo "<br/>";
// 2. print_r
$arr = ["apple", "banana", "cherry"];
echo "<pre>";
print_r($arr);
echo "</pre>";
echo "<br/>";
/*
输出结果(更适合看数组结构):
Array
(
    [0] => apple
    [1] => banana
    [2] => cherry
)
*/

// 3. var_dump
$age = 25;
echo "<pre>";
var_dump($age);
echo "</pre>";
echo "<br/>";
/*
输出:
int(25)
*/

$user = ["name" => "Tom", "age" => 20];
echo "<pre>";
var_dump($user);

echo "</pre>";
echo "<br/>";
/*
输出:
array(2) {
  ["name"]=>
  string(3) "Tom"
  ["age"]=>
  int(20)
}
*/

// 4. var_export
$colors = ["red", "green", "blue"];
echo "<pre>";
var_export($colors);

echo "</pre>";
echo "<br/>";
/*
输出(可以直接拿来当 PHP 代码执行):
array (
  0 => 'red',
  1 => 'green',
  2 => 'blue',
)
*/

1.2 使用场景

1.2.1 echo / print

就是普通输出文本、拼页面内容用的。比如:

php 复制代码
echo "<h1>欢迎回来, $username</h1>";

在模板里到处见。print基本没人单独用,它和echo差不多,只是返回值不同。

注意: 这里的参数必须能转化为字符串

php 复制代码
<?php
$a = 'xin chao';
$b = [1, 2, 3];

$obj = new stdClass(); // PHP 自带的空类
$obj->name = "Bob";
$obj->age = 25;

echo $a, 'xuu', $b, $obj; //会警报Warning: Array to string conversion  并打印Array
//对象会报错,Fatal error: Uncaught Error: Object of class stdClass could not be converted to string

如下图:

语法:

php 复制代码
echo([string]`...$expressions`):[ void]

echo:可以输出多个字符串,用逗号分割,没有返回值

print 是只能输出一个 且返回值是int 1

print_r 偏向日志、快照。

print_r 这个名字挺"直给"的:

  • print → 打印(输出)。
  • r → readable(可读的)。

也就是说:print_r 不是简单把变量吐出来,而是把数组、对象之类的复杂数据结构,用人类更容易看懂的方式打印出来。

调试数组或对象时首选,尤其快速看数据结构。比如:

php 复制代码
$data = ['id' => 1, 'name' => 'Tom'];
$arr = [1, 3, 34];
echo '<pre>';
print_r($data);
print_r($arr);
echo '</pre>';

输出人类肉眼好读的格式。写 CRUD、调接口返回值,经常用。

注意:

print_r 的输出里,数组开头是大写的 Array

这是为了给人类读者看,纯粹是一个"展示格式"。

它写死了大写 Array,并没有遵循 PHP 语法

var_export 的输出是 合法 PHP 代码 ,所以用小写的 array(这是 PHP 关键字)

UD 其实是程序员的"口头禅",是一组常见操作的缩写:

  • C = Create(创建)
  • R = Read(读取)
  • U = Update(更新)
  • D = Delete(删除)

第二种捕获方式(第二个参数设置为ture)主要是为了print_r() 的输出当作字符串来使用,而不是直接打印到屏幕。它有几个实际用途:

1. 写入日志文件

你可能想把数组或对象内容保存到日志,而不是直接显示在页面上:

php 复制代码
$arr = ['apple', 'banana', 'cherry'];
$log = print_r($arr, true);
file_put_contents('log.txt', $log);

这样日志里就能看到数组结构,方便调试。

2. 发送调试信息到邮箱或接口

比如调试 API 时,把复杂数组格式化成字符串发送给开发者:

php 复制代码
$arr = ['user' => 'Tom', 'age' => 20];
$debug = print_r($arr, true);
mail('dev@example.com', '调试信息', $debug);
3. 拼接到其他字符串

有时候你想把数组内容放到 HTML 或文本中:

php 复制代码
$arr = ['a', 'b', 'c'];
$text = "数组内容如下:\n" . print_r($arr, true);
echo "<pre>$text</pre>";
4. 做模板或缓存

你可以把 print_r 输出的字符串存到缓存,方便后续恢复或调试:

php 复制代码
$cache = print_r($arr, true);
file_put_contents('cache.txt', $cache);
// 下次读取再用 eval() 或直接解析

简单理解:

  • 默认 print_r打印到屏幕 → 方便快速调试
  • 第二种 $return=true返回字符串 → 可以存储、发送或拼接,灵活使用
1.2.3 var_dump

var_dump 这个名字,其实直接反映了它的功能。拆开来看:

  • var → variable,意思是"变量"
  • dump → 倒出、倾倒、抛出

当你怀疑变量类型不对时,用它看得清清楚楚。比如:

php 复制代码
var_dump($_GET['id']);

它会告诉你是 string(2) "15" 还是 int(15),这在类型敏感场景特别重要。

可多个参数:

php 复制代码
$a = 123;
$b = "hello";
$c = [1, 2, 3];

var_dump($a, $b, $c);
1.2.4 var_export

var_export 偏向代码、复用

语法:

复制代码
var_export(mixed $value, bool $return = false): ?string

var_export 这个名字,其实也像 var_dump 一样,很形象地描述了它的功能。拆开来看:

  • var → variable(变量)
  • export → 导出、输出成代码
特点
  1. 输出的是 PHP 代码
    • 可以直接把输出复制到另一个 PHP 文件里执行
    • 也可以保存到配置文件、缓存文件
  2. 返回值可选
    • 默认直接输出 没有格式
      • 函数会 直接输出变量的可执行 PHP 代码
      • var_export 存下来的内容是可执行的 PHP 代码 ,可以直接 include 还原变量
      • 返回值是 null
    • 如果第二个参数设为 true,会返回字符串,而不输出

用得少,但在需要"复制变量,生成可执行代码"时挺好用。比如保存配置:

php 复制代码
$config = ['host' => '127.0.0.1', 'port' => 3306];
file_put_contents('config.php', '<?php return ' . var_export($config, true) . ';');
$data = include 'config.php';
var_dump($data);//直接 `include` 还原变量

1.3总结

  • 页面展示 → echo

  • 快速调试数组 → print_r

  • 精准检查类型和值 → var_dump

  • 导出配置/代码片段 → var_export

2. 字符串处理

分类 函数 作用 示例
基本操作 strlen($str) 获取字符串长度 strlen("Hello") → 5
substr($str, $start, $len) 截取子串 substr("Hello",1,3) → "ell"
strtoupper($str) 转为大写 "php" → "PHP"
strtolower($str) 转为小写 "HELLO" → "hello"
ucfirst($str) 首字母转大写 ucfirst("hello") → "Hello"
lcfirst($str) 首字母转小写 lcfirst("Hello") → "hello"
trim($str) 去除首尾空格或指定字符 trim(" hi ") → "hi"
ltrim($str) 去除左侧空格 " hi" → "hi"
rtrim($str) 去除右侧空格 "hi " → "hi"
查找与替换 strpos($str, $substr) 查找第一次出现位置 strpos("apple","p") → 1
strrpos($str, $substr) 查找最后一次出现位置 strrpos("apple","p") → 2
str_replace($search, $replace, $subject) 替换字符串 str_replace("a","A","apple") → "Apple"
分割与合并 explode($delimiter, $string) 分割字符串为数组 explode(",", "a,b,c") → ["a","b","c"]
implode($glue, $array) / join() 数组拼接为字符串 implode("-", ["a","b","c"]) → "a-b-c"
格式化输出 printf($format, ...) 格式化输出(直接打印) printf("Hi %s, %d yrs", "Tom", 20)
sprintf($format, ...) 格式化并返回字符串 sprintf("Pi≈%.2f", 3.14159) → "Pi≈3.14"
随机与重复 str_repeat($str, $count) 重复字符串 str_repeat("*",5) → "*****"
str_shuffle($str) 打乱字符串顺序 str_shuffle("abcd") → "cbad"(随机)

3. 数组处理

  • count():计算元素个数。
  • array_merge():合并数组。
  • array_push() / array_pop():压入/弹出数组元素。
  • array_shift() / array_unshift():数组头部出队/入队。
  • in_array():判断是否在数组中。
  • array_key_exists():检查键是否存在。
  • array_keys() / array_values():获取键/值。
  • sort() / asort() / ksort():排序函数。

4. 变量处理

  • isset():检测变量是否已设置且不为 null
  • empty():检测是否为空。
  • unset():销毁变量。
  • is_array() / is_string() / is_int() 等:判断变量类型。
  • gettype():获取变量类型。

5. 数学相关

5.1abs():绝对值

语法
php 复制代码
abs(int|float $num): int|float
参数与返回值

一个参数可传number伪类型

返回值:number伪类型

5.2 round()/ceil()/floor()`:

四舍五入 / 向上取整 / 向下取整。

5.2.1 round 四舍五入
语法
php 复制代码
round(int|float $num, int $precision = 0, int|RoundingMode $mode = RoundingMode::HalfAwayFromZero): float

$num:要四舍五入的数字。是整数或者浮点数

$precision:保留的小数位数,默认为 0。

  • 例如:round(3.14159, 2)3.14
  • 如果传负数,例如 round(1234, -2) → 会保留到百位,结果是 1200

$mode (PHP 8.0+):可选参数,用来指定"舍入模式",默认是 RoundingMode::HalfAwayFromZero,也就是"传统四舍五入"(.5 向远离 0 的方向舍入)。

示例
php 复制代码
echo round(3.5);     // 4
echo round(3.4);     // 3
echo round(-3.5);    // -4  (远离0)
echo round(-3.4);    // -3
mode
php 复制代码
$num = 2.5;
//传统的四舍五入规则
//小数部分 正好为 0.5 时向上舍入
echo round($num, 0, PHP_ROUND_HALF_UP);     // 3
echo "\n";
//小数部分 正好为 0.5 时向下舍入
echo round($num, 0, PHP_ROUND_HALF_DOWN);   // 2
echo "\n";
//小数部分 正好为 0.5 时,结果向最近的偶数舍入
//用于金融、统计计算,能减少长期累积误差
echo round($num, 0, PHP_ROUND_HALF_EVEN);   // 2
echo "\n";
//小数部分 正好为 0.5 时,结果向最近的奇数舍入
echo round($num, 0, PHP_ROUND_HALF_ODD);    // 3
5.2.2 ceil 向上取整
语法
php 复制代码
ceil(int|float $num): float
示例

PHP_EOL是php内置换行符

php 复制代码
echo ceil(4.3), PHP_EOL;    // 5
echo ceil(9.999), PHP_EOL;  // 10
echo ceil(-3.14), PHP_EOL;  // -3
5.2.3 floor 向下取整
语法
php 复制代码
floor(int|float $num): float
示例
php 复制代码
echo floor(4.3), PHP_EOL;   // 4
echo floor(9.999), PHP_EOL; // 9
echo floor(-3.14), PHP_EOL; // -4

5.3 max() :取最大值。

语法
php 复制代码
// 多参数形式
max(mixed $value, mixed ...$values): mixed

// 单数组形式
max(array $value_array): mixed
参数与返回值

参数可以是任意值,多个值或者数值形式

返回值是mixed 最大的那个值 不会改变非数字类型的值

示例
多参数形式
php 复制代码
echo max(2, 5, 1, 10);   // 10
echo max(-1, 0, -5);     // 0
数组形式
php 复制代码
$numbers = [3, 8, 1, 6];
echo max($numbers);       // 8
类型比较规则
  • 相同类型:直接比较大小。
  • 不同类型
    • 数字 vs 字符串:非数字字符串当作 0 比较。
    • 多个非数字字符串:按字母顺序(字典顺序)比较。

示例:

php 复制代码
echo max(5, "3");      // 5,因为字符串 "3" 会转成数字 3
echo max(5, "abc");    // 5,因为 "abc" 被当作 0
echo max("apple", "banana", "cherry"); // "cherry" 按字典顺序最大

⚠️ 注意:不同类型的值混合使用时可能产生不可预测结果,尤其是数字和非数字字符串混合。

5.4 min():取最小值

语法
php 复制代码
//多参数形式
min(mixed $value, mixed ...$values): mixed
//数组形式
min(array $value_array): mixed
示例
php 复制代码
echo min(2, 3, 1, 6, 7), PHP_EOL;  // 1
echo min(array(2, 4, 5)), PHP_EOL; // 2

// Here we are comparing -1 < 0, so -1 is the lowest value
echo min('hello', -1), PHP_EOL;    // -1

// With multiple arrays of different lengths, min returns the shortest
$val = min(array(2, 2, 2), array(1, 1, 1, 1)); // array(2, 2, 2)
var_dump($val);

// Multiple arrays of the same length are compared from left to right
// so in our example: 2 == 2, but 4 < 5
$val = min(array(2, 4, 8), array(2, 5, 1)); // array(2, 4, 8)
var_dump($val);

// If both an array and non-array are given, the array is never returned
// as comparisons treat arrays as greater than any other value
$val = min('string', array(2, 5, 7), 42);   // string
var_dump($val);

// If one argument is NULL or a boolean, it will be compared against
// other values using the rules FALSE < TRUE and NULL == FALSE regardless of the 
// other types involved
// In the below examples, both -10 and 10 are treated as TRUE in the comparison
$val = min(-10, FALSE, 10); // FALSE
var_dump($val);

$val = min(-10, NULL, 10);  // NULL
var_dump($val);

// 0, on the other hand, is treated as FALSE, so is "lower than" TRUE
$val = min(0, TRUE); // 0
var_dump($val);

5.5小技巧

Max结合 min() 可以轻松求数组的范围

php 复制代码
$values = [4, 9, 2, 7];
echo max($values) - min($values);  // 2-7

5.6 Pow():指数表达式

语法

php 复制代码
pow(mixed $num, mixed $exponent): int|float|object

参数:

$num 底数

exponent 指数

返回值:

num的exponent次方,如果两个参数都是非负整数且结果可以用整数表示,则返回int类型,否则返回float

5.7 mt_rand():随机数。

语法

php 复制代码
mt_rand(): int
mt_rand(int $min, int $max): int

许多旧版库的随机数生成器特性可疑或未知,速度较慢。mt_rand **()**函数是旧版rand()的简易替代品。它使用 >> 梅森旋转算法 (Mersenne Twister)生成随机数,其速度比普通库 rand() 快四倍

返回随机整数

5.8 rand()

语法
php 复制代码
rand(): int

rand(int $min, int $max): int

如果带参数返回 m i n − min- min−max(最小值和最大值之间的随机整数)如果不带参返回随机整数

5.9 sqrt 求平方根

php 复制代码
sqrt(float $num): float
参数

要处理的

示例
php 复制代码
// 精度取决于精度指令
echo sqrt(9), PHP_EOL; // 3
echo sqrt(10), PHP_EOL; // 3.16227766 ...


// sqrt(10) 的平方根是一个 无限不循环小数(大约 3.1622776601683795...),PHP 会把它以浮点数显示,显示多少位 取决于 PHP 的浮点数输出规则,也就是所谓的"精度指令"

6. 日期时间

6.1time():当前 Unix 时间戳

参考:https://www.php.net/manual/en/function.time.php

语法
复制代码
time(): int

Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).

没有参数 返回值int类型 当前unix时间戳

6.2date():格式化日期时间

语法

date(string $format, ?int $timestamp = null ): string

参数:
  • string $format
    • 第一个参数 $format 必须是 字符串 ,用来指定日期时间的格式,比如 "Y-m-d H:i:s"
  • ?int $timestamp = null
    • 第二个参数 $timestamp 可选。
    • ?int 表示可以是 整数null
    • 传整数时,它会被当作 Unix 时间戳;不传(默认 null),就是用当前时间。

返回值:

  • 格式化后端额日期时间是字符串类型
例子
php 复制代码
// 当前时间,格式化成年-月-日 时:分:秒
echo date("Y-m-d H:i:s");
// 比如输出:2025-09-25 16:32:10

// 指定时间戳(1600000000)对应的日期
echo date("Y-m-d H:i:s", 1600000000);
// 输出:2020-09-13 12:26:40
echo date("Y-m-d H:i:s", time()); //当前时间

6.3 strtotime():把字符串解析为时间戳

语法:

strtotime(string $datetime, ?int $baseTimestamp = null ): int|false

参数:

第一个参数 $datetime:必须,字符串类型。

  • 例如 "2025-10-01 12:00:00",或者 "next Monday",甚至 "last Sunday +2 days"
  • PHP 内部会用它的"自然语言解析器"把字符串变成时间戳。

第二个参数 $baseTimestamp:可选,整数或 null。

  • 如果不给,默认是当前时间。
  • 用它可以指定一个"参考点",比如从某个时间点计算 "next Monday"
返回值 :成功时返回整数(Unix 时间戳),失败时返回 false
示例
php 复制代码
// 指定时间
echo strtotime("2025-10-01 12:00:00");
// 输出: 1764609600

// 相对时间
echo strtotime("next Monday");
// 输出: 下一个周一的时间戳(取决于今天是哪天)

// 以某个时间点为基准
echo date("Y-m-d H:i:s", strtotime("+2 days", strtotime("2025-09-25 12:00:00")));
// 输出: 2025-09-27 12:00:00
注意
1. 标准日期/时间格式(PHP 可解析的数字日期)
示例 说明 输出类型
'YYYY-MM-DD' ISO 标准日期 Unix 时间戳
'YYYY/MM/DD' 斜杠分隔 Unix 时间戳
'YYYY-MM-DD HH:MM:SS' 日期加时间 Unix 时间戳
'YYYY/MM/DD HH:MM:SS' 日期加时间(斜杠) Unix 时间戳
'HH:MM:SS' 仅时间,会使用当天日期 Unix 时间戳
'YYYYMMDD' 紧凑数字日期 Unix 时间戳(部分版本有效)

注意 :点号分隔 '2001.01.01' 不被标准支持,会返回 false


2. 自然语言表达式(内置英文词汇)
示例 说明 输出类型
'today' 今天 00:00:00 Unix 时间戳
'yesterday' 昨天 00:00:00 Unix 时间戳
'tomorrow' 明天 00:00:00 Unix 时间戳
'next Monday' 下一个周一 Unix 时间戳
'last Friday' 上一个周五 Unix 时间戳
'next week' 下周同一时间 Unix 时间戳
'next month' 下个月同日 Unix 时间戳
'next year' 下一年同月同日 Unix 时间戳
'next weekday' 下一个工作日 Unix 时间戳
'+2 days' / '-3 hours' 相对时间偏移 Unix 时间戳

6.4 mktime():生成时间戳

php 复制代码
mktime(
    int $hour,
    ?int $minute = null,
    ?int $second = null,
    ?int $month = null,
    ?int $day = null,
    ?int $year = null
): int|false
参数
参数 类型 是否可选 说明
$hour int 必填 小时(0-23)
$minute int 可选 分钟(0-59),默认当前时间
$second int 可选 秒(0-59),默认当前时间
$month int 可选 月份(1-12),默认当前月份
$day int 可选 日期(1-31),默认当前日
$year int 可选 年份(四位数),默认当前年份
返回值:整数类型时间戳
示例
php 复制代码
// 生成 2025-09-25 12:30:00 的时间戳
$ts = mktime(12, 30, 0, 9, 25, 2025);
echo $ts;
// 输出:1758899400(Unix 时间戳)

// 只给小时,其他用当前时间
$ts2 = mktime(15);
echo date("Y-m-d H:i:s", $ts2);
// 输出类似:2025-09-25 15:当前分钟:当前秒

6.5 microtime

语法
php 复制代码
microtime(bool $as_float = false): string|float
参数
参数 类型 默认 说明
$as_float bool false 是否返回浮点数。如果 true,返回 浮点数秒数 (整数秒 + 小数微秒);如果 false,返回字符串 "微秒 秒数" 格式,例如 "0.123456 1758899400"
返回值
  • 如果 $as_float = false(默认):
php 复制代码
echo microtime();
// 可能输出:0.123456 1758899400
// 前半部分是微秒,后半部分是整数秒
  • 如果 $as_float = true
php 复制代码
echo microtime(true);
// 输出:1758899400.123456 (浮点数秒)
使用场景
  • 性能测量:记录代码开始/结束时间,计算耗时。
  • 生成高精度时间戳 :比 time() 精确到微秒。
示例:
php 复制代码
$start = microtime(true);

// 模拟耗时操作
usleep(500000); // 0.5 秒

$end = microtime(true);
echo "耗时: " . ($end - $start) . " 秒";
// 输出: 耗时: 0.500xxx 秒

6.5总结示例

php 复制代码
<?php
// 1. time() 当前 Unix 时间戳
echo time();  
// 输出类似:1737819540 (秒数,从1970-01-01 00:00:00 UTC开始)

// 2. date() 格式化时间
echo date("Y-m-d H:i:s");  
// 输出类似:2025-09-24 16:40:00
echo date("Y年m月d日 H:i");  
// 输出:2025年09月24日 16:40

// 3. strtotime() 字符串转时间戳
$timestamp = strtotime("2025-10-01 00:00:00");
echo $timestamp;  
// 输出:1738185600

// 4. mktime() 生成时间戳
// 参数顺序:hour, minute, second, month, day, year
$ts = mktime(0, 0, 0, 10, 1, 2025);
echo $ts;  
// 输出:1738185600
?>
、

7. 文件与目录

  • fopen() / fclose():打开/关闭文件。
  • fread() / fwrite():读写文件。
  • file_get_contents() / file_put_contents():快速读写整个文件。
  • file_exists():检查文件是否存在。
  • unlink():删除文件。
  • is_dir() / mkdir() / rmdir():目录操作。

8. 会话与请求

  • session_start():开启会话。
  • setcookie():设置 Cookie。
  • $_GET / $_POST / $_SERVER:超级全局变量(伪函数)。

9. 错误与异常

9.1 错误分类

  • 语法错误
    • 用户输血的代码不符合PHP的语法规范,语法错误会导致代码在编译的过程中不通过。所以代码不会执行(parse error)
  • 运行时错误:
    • 代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error)
  • 逻辑错误
    • 程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果

9.2 错误代号

参考:https://www.php.net/manual/en/errorfunc.constants.php

所有看到的错误代码在PHP中都被定义成了系统常量(可以直接使用)

  • 系统错误:
    • E_PARSE 编译错误,代码不会执行
    • E_ERROR
      • fatal error
      • 致命运行时错误,
      • 会导致代码不能正确继续执行(出错的位置断掉)
      • 常量值1
    • E_WARNING warning
      • 运行时警告错误(非致命错误)
      • 不会影响代码执行,但是可能得到意想不到的结果
      • 常量值 2
    • E_NOTICE notice
      • 运行时通知错误
      • 不会影响代码执行
      • 常量值为 8
  • 用户错误
    • 用户在使用自定义错误触发的时候,会使用到错误代号(系统不会用到)
    • E_USER_ERROR
    • E_USER_WARNING
      • 用户生成的警告消息 类似于 E_WARNING
      • 常量值512
      • 常和 trigger_error配合使用
    • E_USER_NOTICE
      • 用户生成的通知消息
      • 常量值16384
      • 常和 trigger_error配合使用
  • 其他
    • 代表着所有错误(通常在进行错误控制的时候用的比较多)建议在开发过程中(开发环境)使用
    • E_ALL
      • 包含每个错误、警告和通知的位掩码
      • 常量值:30719
      • 在 PHP 8.4 之前,常量值为:32767

所有E开头的错误常量(代号)其实都是有一个字节存储,然后每种错误占据一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作

排除通知级别 notice: E_ALL & ^E_NOTICE

只要警告和通知 E_WARNING | E_NOTICE

9.3 E 系列常量是「位标志」(bit flag)

在 PHP 中,各种错误类型(比如 E_ERRORE_WARNINGE_NOTICE 等)不是简单的整数,而是一组 二进制标志

举例:

复制代码
E_ERROR      = 1        // 00000001
E_WARNING    = 2        // 00000010
E_PARSE      = 4        // 00000100
E_NOTICE     = 8        // 00001000
E_ALL        = 32767    // 111111111111111

每种错误类型占据一个 二进制位 (bit)。

这样多个错误类型就可以通过"按位或(|)"组合到一起,比如:

复制代码
E_ERROR | E_WARNING   // => 00000011

代表同时打开"致命错误 + 警告"两种类型。


9.3.1 那 E_ALL & ~E_NOTICE 是啥意思?

拆开:

  • E_ALL 代表"开启所有错误类型"
  • ~E_NOTICE(或 ^E_NOTICE)代表"把 E_NOTICE 这一位取反",也就是"除了 E_NOTICE 之外的所有位"

再做:

复制代码
E_ALL & ~E_NOTICE

意思就是:
"保留 E_ALL 中的所有位,但把 E_NOTICE 这一位清掉"

也就是 关闭 Notice 级别的错误

换句话说:

"报告所有错误,除了 Notice(通知)"


9.3.2 示例

假设二进制这么玩:

复制代码
E_ALL     = 11111111
E_NOTICE  = 00001000
~E_NOTICE = 11110111

E_ALL & ~E_NOTICE

复制代码
11111111
&
11110111
---------
11110111   // 除了 notice 那一位全保留

9.3.3 用途举例
复制代码
error_reporting(E_ALL & ~E_NOTICE);

意思:让 PHP 报告所有错误(error、warning、deprecated...),但不显示 Notice 级别的提示

Notice 通常是一些"小毛病",比如未定义变量、数组下标不存在等,不会导致程序中断,所以有时候在生产环境下会被排除。


9.3.4几个常见写法对比
写法 意义
E_ALL 报告所有错误
E_ALL & ~E_NOTICE 除了 Notice 都报
E_ALL & ~E_DEPRECATED 排除已弃用的警
9.3.5 位的逻辑运算符 按位与&,按位或|,按位异或^,按位取反~
总结
运算符 逻辑意义 结果为 1 的位组合
& 按位与(AND) 1 & 1 → 1
| 按位或(OR) 1,1->1 1,0->1 1,1->1
^ 按位异或(XOR) 1 & 0, 0 & 1 → 1(不同才为 1)
~ 按位取反(NOT) 1 → 0, 0 → 1
示例
php 复制代码
5 & 3  // => 0101 & 0011 = 0001 = 1
5 | 3  // => 0101 | 0011 = 0111 = 7
5 ^ 3  // => 0101 ^ 0011 = 0110 = 6
~5  // 5 = 00000101 → 取反 = 11111010 

9.4 错误触发

9.4.1 错误触发的两种情况
  • 程序运行时触发

    • 系统个自动根据错误发生后,对比对应的错误信息,输出给用户:主要是针对代码的语法错误和运行时错误
  • 人为触发

    • 知道某些逻辑可能会出现错误,从而使用对应的判断代码来触发响应的错误提示

    • Trigger_error

    php 复制代码
    $a = 1;
    $b = 0;
    if ($b === 0) {
        trigger_error("分母不能为0"); //默认notice 会继续执行
    } else {
        $c = $b / $a;
    };
    echo "hello world", PHP_EOL;

    结果如下图:

9.4.2 trigger_error函数

(PHP 4 >= 4.0.1、PHP 5、PHP 7、PHP 8)

trigger_error 生成用户级错误/警告/通知消息

语法
php 复制代码
trigger_error(string $message, int $error_level = E_USER_NOTICE): true

$message 必传

$error_level 非必传

示例
php 复制代码
$a = 1;
$b = 0;
if ($b === 0) {
    trigger_error("分母不能为0"); //默认notice 会继续执行
    trigger_error("分母不能为0", E_USER_ERROR); //触发错误 会中断执行,不继续执行 (致命错误)
} else {
    $c = $b / $a;
};
echo "hello world", PHP_EOL;
echo "</pre>";

9.5 错误设置

9.5.1 错误显示设置

那些错误该显示,以及如何显示

在PHP中,其实有两种方式来设置当前脚本的错误处理

  • PHP的配置文件:全局配置文件 php.ini文件

    • display_errors:是否显示错误
    • Error_reporting 显示什么级别的错误
  • 可以在运行的php脚本中设置

    • error_reporting函数
9.5.2 error_reporting 在脚本中设置 错误显示

设置报道哪些php错误

语法
php 复制代码
error_reporting(?int $error_level = null): int
参数

$error_level 错误级别

  • 位掩码或命名常量
版本 描述
8.0.0 error_level现在可为空。
返回值

如果没有设置带可选选项,直接返回当前的错误报告级别

示例
php 复制代码
// Turn off all error reporting
error_reporting(0);

//只报告"运行时严重错误"、"警告"、"语法解析错误"
error_reporting(E_ERROR | E_WARNING | E_PARSE);

//比上一个多了一个 E_NOTICE 会报告"未定义变量""拼写错误"等小问题。
//一般用于开发阶段,帮助发现小 bug
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// 报告所有错误,除了 Notice。

//~E_NOTICE 是按位取反,然后 & 与 E_ALL 结合,
//这是非常常用的配置,因为 Notice 很多时候太啰嗦。
error_reporting(E_ALL & ~E_NOTICE);

// 报告所有级别的错误
error_reporting(E_ALL);

// 报告所有级别的错误PHP 中 E_ALL 实际上就是 -1 的位掩码表示
error_reporting(-1);

// Same as error_reporting(E_ALL);
//php.ini 是"全局设置",作用于所有 PHP 程序;
//ini_set() 是"脚本内即时修改",只影响当前脚本;
//两者谁"后执行"谁生效;
//脚本执行完毕后,一切又恢复默认
ini_set('error_reporting', E_ALL);
位掩码

PHP 的错误常量其实是位掩码(bitmask),比如:

  • E_ERROR = 1
  • E_WARNING = 2
  • E_PARSE = 4
  • E_NOTICE = 8
  • E_ALL = 32767(包含所有位)
9.5.3 ini_set函数

设置配置项的值

语法
php 复制代码
ini_set(string $option, string|int|float|bool|null $value): string|false
参数

option :

https://www.php.net/manual/en/ini.list.php只有在这里面的配置才能更改

value

该选项的新值

返回值

成功时返回旧值,失败时返回false

示例
php 复制代码
echo ini_get('display_errors');

if (!ini_get('display_errors')) {
    ini_set('display_errors', '1');
}

echo ini_get('display_errors');
9.5.4 错误日志设置

在实际生产环境中,不会直接让错误赤裸裸的展示给用户

1.不友好,

2.不安全 错误会暴漏网站很多信息(路径,文件名)

所以在生产环境中,一般不显示错误(错误也比较少),但是不可能避免会出现错误(测试的时候不会发现所有的问题---),这个时候不希望看到,但又想捕捉到可以让后台程序员去修改,需要保存到日志文件中,需要在php配置文件中或代码中(ini_set)设置对应error_log

如图:

设置是否将脚本运行的错误信息记录到服务器错误日志或者 error_log。注意,这是与服务器相关的特定配置项。

注意:

在生产环境 web 网站中,强烈建议使用错误日志记录代替错误显示。

1.开启日志功能:默认是开启的

2.可以自己设置配置日志存放路径

9.6 自定义错误处理

9.6.1概念

最简单的错误处理:trigger_error()函数,但是改函数不会阻止系统报错

php系统提供了一种用户处理错误的机制:

用户自定义错误处理函数,然后将该函数增加操作系统错误处理的句柄中,然后系统会在碰到错误以后,使用用户定义的错误函数

9.6.2 .如何将用户自定义的函数放到系统中?set_error_handler
作用

设置用户定义的错误处理函数

语法
php 复制代码
set_error_handler(?callable $callback, int $error_levels = E_ALL): ?callable
参数

$callback 回调函数

$error_levels 错误等级(位掩码或命名常量) 默认为E_ALL 所有

注意

"标准错误处理器会被绕过"

意思是,只要错误级别在 $error_levels 范围内,PHP 自带的错误输出机制就不会再执行了。

除非你的回调函数返回 false,这才让 PHP 继续执行默认的错误处理。

error_reporting() 设置不会阻止回调执行

即使全局关闭了错误显示(error_reporting(0)),这个自定义处理器仍然会被调用。

但你仍然可以在回调里读取当前的 error_reporting() 值,然后决定要不要处理。

不会自动停止脚本

如果你希望出错后脚本立即结束,要在回调函数里自己 exit()die()

否则执行会继续往下跑。

有些错误是"致命的",根本接管不了

这些类型不能被自定义处理器捕获:

php 复制代码
E_ERROR //脚本运行时 出现致命错误 例如调用了一个未声明不存在的函数
E_PARSE //脚本运行时 出现语法错误
E_CORE_ERROR // 在 PHP 启动初期(比如 PHP 在加载扩展(extensions)、解析配置、初始化环境时)发生的致命错误 ,CORE是核心引擎 (core核)
E_CORE_WARNING //PHP 在初始化自身时(加载扩展、配置等阶段)出现的警告级别错误,
//但不会导致程序中断,PHP 会继续往下执行
E_COMPILE_ERROR//编译时错误(compile time)
E_COMPILE_WARNING//编译时警告(compile time)

因为它们是在 PHP 引擎启动或编译阶段就崩溃的,根本还没运行到你的代码。

示例

php 复制代码
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
  echo "<b>自定义错误:</b> [$errno] $errstr<br>";
  echo "错误发生在文件 $errfile 的第 $errline 行<br>";
}
set_error_handler("myErrorHandler");
9.6.3 error_reporting

作用:设置要报告哪些 PHP 错误

php 复制代码
error_reporting(?int $error_level = null): int

参数

$error_level:包报告的错误级别

新增的错误报告 级别。它接受位掩码或命名常量。强烈建议使用命名常量,以确保与未来版本的兼容性。随着错误级别的增加,整数的范围也会扩大,因此旧的基于整数的错误级别可能并非总是按预期运行

如果此为空(8.0支持)表示获取当前的错误报告级别

如:**error_reporting()**将仅返回当前的错误报告级别。

实例:

php 复制代码
// Turn off all error reporting
error_reporting(0);

// Report simple running errors 
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);

// Report all PHP errors
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

统一管理播报情况

php 复制代码
function my_error($errno, $errstr, $errfile, $errline)
{
  //这个错误等级是不是被当前配置允许显示的 因为error_reporting 返回一个整数(多个敞亮组合 例如32767 每个位代表一个错误等级)
  //按位& 就是errno是 当前发生的错误类型编号,是否可以被播报,如果不能被播放怎返回false
  // 所以我们可以用位运算 来判断这个错误等级是否被允许显示
  if (error_reporting() & $errno) {
    return false;
  }
  //开始判断错误类型
  switch ($errno) {
    case E_ERROR;
    case E_USER_ERROR:
      echo "错误发生在文件 $errfile 的第 $errline 行<br>";
      echo "错误信息:  $errstr<br>";
      break;
    case E_WARNING;
    case E_USER_WARNING:
      echo "警告发生在文件 $errfile 的第 $errline 行<br>";
      echo "错误信息:  $errstr<br>";
      break;
    case E_NOTICE;
    case E_USER_NOTICE:
      echo "注意信息发生在文件 $errfile 的第 $errline 行<br>";
      echo "错误信息:  $errstr<br>";
  }
  return true;
}

//和上面的设置自定义错误处理配合
set_error_handler("my_error");

// 故意触发一个错误
echo $undefinedVar; // 未定义变量 
//结果
//警告发生在文件 xx.php 的第 xxx 行
//错误信息:  Undefined variable $undefinedVar
9.6.3 总结

error_reporting():设置错误级别。或获取当前错误级别

  • trigger_error():触发一个用户级错误。
  • set_error_handler():自定义错误处理。
  • try {} catch () {} 结构:异常捕获(不是函数,但常用)。

10.有关于函数的函数

10.1 function_exists

语法
php 复制代码
function_exists(string $function): bool

在已经定义的函数列表(包裹系统自带的函数和用户自定义的函数)中查找function

参数

函数名 必须为一个字符串

返回值

如果存在返回true 不存在返回false

示例
php 复制代码
echo function_exists('function_exists') ,PHP_EOL; //注意返回的是1 echo 会字符串化
echo false, PHP_EOL; //""空字符串
echo true, PHP_EOL; //"1"
var_dump(function_exists('function_exists'));   //注意返回的是bool(true)
echo  PHP_EOL;
var_dump(function_exists('function_exists') . PHP_EOL); //注意返回的是string(2) "1"  因为.拼接触发了默认转换

10.2 func_get_arg ,func_get_args,func_num_args

语法

func_get_arg:从用户定义函数的参数列表中获取指定的参数。

php 复制代码
func_get_arg(int $position): mixed
func_get_args(): array //无参。返回一个数组,其中每个元素都是当前用户定义函数的参数列表的相应成员的副
  func_num_args (): int //无参 返回传递到当前用户定义函数的参数数量

参数

整数类型

  • position

    参数偏移量。函数参数从零开始计数。

返回值

返回指定的参数,或**false**返回错误

示例

php 复制代码
function sum($a, $b)
{
    $numargs = func_num_args();
    echo "参数个数是: $numargs\n"; //2
    $arr = func_get_args();
    /* 
        array(2) {
            [0]=>
            string(1) "a"
            [1]=>
            string(1) "b"
        }
     */
    var_dump($arr);

    echo  func_get_arg(1), PHP_EOL;
    return $a . $b;
}
相关推荐
laocaibulao14 小时前
mac电脑composer命令如何指定PHP版本
macos·php·composer
zz-zjx14 小时前
云原生LVS+Keepalived高可用方案(二)
开发语言·php·lvs
网络精创大傻14 小时前
PHP 与 Node.js:实际性能对比
开发语言·node.js·php
KevinLyu14 小时前
PHP内核详解· 内存管理篇(七)· 调整内存块大小
php
hj104318 小时前
php上传企业微信附件的方法
开发语言·php·企业微信
游九尘18 小时前
在 PHP 中打印数据(调试、输出内容)
php
深圳市恒讯科技20 小时前
使用站群服务器做SEO,如何避免被搜索引擎判定为“站群作弊”?
服务器·搜索引擎·php
APIshop1 天前
代码实战:PHP爬虫抓取信息及反爬虫API接口
开发语言·爬虫·php
一直向钱1 天前
基于你的 SRS 直播流煤体配置(通过 http_hooks 回调实现鉴权),结合 TP6 框架,以下是完整的 PHP SDK 封装方案
网络协议·http·php