php基础-系统函数-第15天
系统函数
一.常用系统函数有哪些?
1. 输出与调试
-
echo()/print():输出字符串。-
注意echo和print 不是函数 是一个语言结构
-
echo(string
...$expressions): void-
与print 的主要区别在于它
echo接受多个参数并且没有返回值 -
参数以逗号分割
-
$a = "Hello"; $b = "World";// 用逗号分割 echo 多个值 echo $a, " ", $b, "!"; // 输出:Hello World! -
$a = (echo "<pre>"); //因为没有返回值这样写是错的
-
-
-
print(string
$expression): int- 与echo的区别是它只接受一个参数并且始终返回
1
- 与echo的区别是它只接受一个参数并且始终返回
-
-
-
print_r():输出数组或对象的结构。-
print_r(mixed $value, bool $return = false): string|true -
$expression:要打印的变量,可以是数组、对象或其他类型$return`:布尔值,默认 `falsefalse→ 直接输出到屏幕true→ 返回字符串,不输出
-
-
var_dump():详细输出变量类型和值。- var_dump(mixed
$value, mixed...$values): void- 可以多个参数
- 函数没有返回值,只能直接输出
- var_dump(mixed
-
var_export():输出合法的 PHP 表达式形式。
1.1 示例
<?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
就是普通输出文本、拼页面内容用的。比如:
echo "<h1>欢迎回来, $username</h1>";
在模板里到处见。print基本没人单独用,它和echo差不多,只是返回值不同。
注意: 这里的参数必须能转化为字符串
<?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
如下图:

语法:
echo([string]`...$expressions`):[ void]
echo:可以输出多个字符串,用逗号分割,没有返回值
print 是只能输出一个 且返回值是int 1
1.2.2 print_r
print_r 偏向日志、快照。
print_r 这个名字挺“直给”的:
- print → 打印(输出)。
- r → readable(可读的)。
也就是说:print_r 不是简单把变量吐出来,而是把数组、对象之类的复杂数据结构,用人类更容易看懂的方式打印出来。
调试数组或对象时首选,尤其快速看数据结构。比如:
$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. 写入日志文件
你可能想把数组或对象内容保存到日志,而不是直接显示在页面上:
$arr = ['apple', 'banana', 'cherry'];
$log = print_r($arr, true);
file_put_contents('log.txt', $log);
这样日志里就能看到数组结构,方便调试。
2. 发送调试信息到邮箱或接口
比如调试 API 时,把复杂数组格式化成字符串发送给开发者:
$arr = ['user' => 'Tom', 'age' => 20];
$debug = print_r($arr, true);
mail('dev@example.com', '调试信息', $debug);
3. 拼接到其他字符串
有时候你想把数组内容放到 HTML 或文本中:
$arr = ['a', 'b', 'c'];
$text = "数组内容如下:\n" . print_r($arr, true);
echo "<pre>$text</pre>";
4. 做模板或缓存
你可以把 print_r 输出的字符串存到缓存,方便后续恢复或调试:
$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→ 倒出、倾倒、抛出
当你怀疑变量类型不对时,用它看得清清楚楚。比如:
var_dump($_GET['id']);
它会告诉你是 string(2) "15" 还是 int(15),这在类型敏感场景特别重要。
可多个参数:
$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→ 导出、输出成代码
特点
- 输出的是 PHP 代码
- 可以直接把输出复制到另一个 PHP 文件里执行
- 也可以保存到配置文件、缓存文件
- 返回值可选
- 默认直接输出 没有格式
- 函数会 直接输出变量的可执行 PHP 代码
var_export存下来的内容是可执行的 PHP 代码,可以直接include还原变量- 返回值是
null
- 如果第二个参数设为
true,会返回字符串,而不输出
- 默认直接输出 没有格式
用得少,但在需要“复制变量,生成可执行代码”时挺好用。比如保存配置:
$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():获取字符串长度。substr():截取子串。strtoupper()/strtolower():大小写转换。strpos()/strrpos():查找子串位置。str_replace():替换字符串。trim()/ltrim()/rtrim():去除空格或其他字符。explode():分割字符串为数组。implode()/join():数组拼接成字符串。
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():绝对值
语法
abs(int|float $num): int|float
参数与返回值
一个参数可传number伪类型
返回值:number伪类型
5.2 round()/ceil()/floor()`:
四舍五入 / 向上取整 / 向下取整。
5.2.1 round 四舍五入
语法
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 的方向舍入)。
示例
echo round(3.5); // 4
echo round(3.4); // 3
echo round(-3.5); // -4 (远离0)
echo round(-3.4); // -3
mode
$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 向上取整
语法
ceil(int|float $num): float
示例
PHP_EOL是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 向下取整
语法
floor(int|float $num): float
示例
echo floor(4.3), PHP_EOL; // 4
echo floor(9.999), PHP_EOL; // 9
echo floor(-3.14), PHP_EOL; // -4
5.3 max() :取最大值。
语法
// 多参数形式
max(mixed $value, mixed ...$values): mixed// 单数组形式
max(array $value_array): mixed
参数与返回值
参数可以是任意值,多个值或者数值形式
返回值是mixed 最大的那个值 不会改变非数字类型的值
示例
多参数形式
echo max(2, 5, 1, 10); // 10
echo max(-1, 0, -5); // 0
数组形式
$numbers = [3, 8, 1, 6];
echo max($numbers); // 8
类型比较规则
- 相同类型:直接比较大小。
- 不同类型:
- 数字 vs 字符串:非数字字符串当作
0比较。 - 多个非数字字符串:按字母顺序(字典顺序)比较。
- 数字 vs 字符串:非数字字符串当作
示例:
echo max(5, "3"); // 5,因为字符串 "3" 会转成数字 3
echo max(5, "abc"); // 5,因为 "abc" 被当作 0
echo max("apple", "banana", "cherry"); // "cherry" 按字典顺序最大
⚠️ 注意:不同类型的值混合使用时可能产生不可预测结果,尤其是数字和非数字字符串混合。
5.4 min():取最小值
语法
//多参数形式
min(mixed $value, mixed ...$values): mixed
//数组形式
min(array $value_array): mixed
示例
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() 可以轻松求数组的范围:
$values = [4, 9, 2, 7];
echo max($values) - min($values); // 2-7
5.6 Pow():指数表达式
语法
pow(mixed $num, mixed $exponent): int|float|object
参数:
$num 底数
exponent 指数
返回值:
num的exponent次方,如果两个参数都是非负整数且结果可以用整数表示,则返回int类型,否则返回float
5.7 mt_rand():随机数。
语法
mt_rand(): int
mt_rand(int $min, int $max): int
许多旧版库的随机数生成器特性可疑或未知,速度较慢。mt_rand **()**函数是旧版rand()的简易替代品。它使用 » 梅森旋转算法 (Mersenne Twister)生成随机数,其速度比普通库 rand() 快四倍
返回随机整数
5.8 rand()
语法
rand(): intrand(int $min, int $max): int
如果带参数返回min−min-min−max(最小值和最大值之间的随机整数)如果不带参返回随机整数
5.9 sqrt 求平方根
sqrt(float $num): float
参数
要处理的
示例
// 精度取决于精度指令
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),就是用当前时间。
- 第二个参数
返回值:
- 格式化后端额日期时间是字符串类型
例子
// 当前时间,格式化成年-月-日 时:分:秒
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。
示例
// 指定时间
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():生成时间戳
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 | 可选 | 年份(四位数),默认当前年份 |
返回值:整数类型时间戳
示例
// 生成 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
语法
microtime(bool $as_float = false): string|float
参数
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
$as_float | bool | false | 是否返回浮点数。如果 true,返回 浮点数秒数(整数秒 + 小数微秒);如果 false,返回字符串 "微秒 秒数" 格式,例如 "0.123456 1758899400" |
返回值
- 如果
$as_float = false(默认):
echo microtime();
// 可能输出:0.123456 1758899400
// 前半部分是微秒,后半部分是整数秒
- 如果
$as_float = true:
echo microtime(true);
// 输出:1758899400.123456 (浮点数秒)
使用场景
- 性能测量:记录代码开始/结束时间,计算耗时。
- 生成高精度时间戳:比
time()精确到微秒。
示例:
$start = microtime(true);// 模拟耗时操作
usleep(500000); // 0.5 秒$end = microtime(true);
echo "耗时: " . ($end - $start) . " 秒";
// 输出: 耗时: 0.500xxx 秒
6.5总结示例
<?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_ERROR
- php 8.4 E_USER_ERROR同trigger_error() 的用法已弃用
- 建议改为抛出异常
throw或 调用exit()。
- 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_ERROR、E_WARNING、E_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 |
示例
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
-
$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 生成用户级错误/警告/通知消息
语法
trigger_error(string $message, int $error_level = E_USER_NOTICE): true
$message 必传
$error_level 非必传
示例
$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错误
语法
error_reporting(?int $error_level = null): int
参数
$error_level 错误级别
- 位掩码或命名常量
| 版本 | 描述 |
|---|---|
| 8.0.0 | error_level现在可为空。 |
返回值
如果没有设置带可选选项,直接返回当前的错误报告级别
示例
// 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 = 1E_WARNING = 2E_PARSE = 4E_NOTICE = 8E_ALL = 32767(包含所有位)
9.5.3 ini_set函数
设置配置项的值
语法
ini_set(string $option, string|int|float|bool|null $value): string|false
参数
option :
https://www.php.net/manual/en/ini.list.php只有在这里面的配置才能更改
value
该选项的新值
返回值
成功时返回旧值,失败时返回false
示例
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
作用
设置用户定义的错误处理函数
语法
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()。
否则执行会继续往下跑。
有些错误是“致命的”,根本接管不了
这些类型不能被自定义处理器捕获:
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 引擎启动或编译阶段就崩溃的,根本还没运行到你的代码。
示例
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 错误
error_reporting(?int $error_level = null): int
参数
$error_level:包报告的错误级别
新增的错误报告 级别。它接受位掩码或命名常量。强烈建议使用命名常量,以确保与未来版本的兼容性。随着错误级别的增加,整数的范围也会扩大,因此旧的基于整数的错误级别可能并非总是按预期运行
如果此为空(8.0支持)表示获取当前的错误报告级别
如:**error_reporting()**将仅返回当前的错误报告级别。
实例:
// 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);
统一管理播报情况
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
语法
function_exists(string $function): bool
在已经定义的函数列表(包裹系统自带的函数和用户自定义的函数)中查找function
参数
函数名 必须为一个字符串
返回值
如果存在返回true 不存在返回false
示例
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:从用户定义函数的参数列表中获取指定的参数。
func_get_arg(int $position): mixed
func_get_args(): array //无参。返回一个数组,其中每个元素都是当前用户定义函数的参数列表的相应成员的副func_num_args (): int //无参 返回传递到当前用户定义函数的参数数量
参数
整数类型
-
position参数偏移量。函数参数从零开始计数。
返回值
返回指定的参数,或**false**返回错误
示例
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;
}
