当前位置: 首页 > news >正文

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
  • print_r():输出数组或对象的结构。

    • 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
// 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 → 导出、输出成代码
特点
  1. 输出的是 PHP 代码
    • 可以直接把输出复制到另一个 PHP 文件里执行
    • 也可以保存到配置文件、缓存文件
  2. 返回值可选
    • 默认直接输出 没有格式
      • 函数会 直接输出变量的可执行 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 比较。
    • 多个非数字字符串:按字母顺序(字典顺序)比较。

示例:

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-minmax(最小值和最大值之间的随机整数)如果不带参返回随机整数

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:00Unix 时间戳
'yesterday'昨天 00:00:00Unix 时间戳
'tomorrow'明天 00:00:00Unix 时间戳
'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
参数
参数类型是否可选说明
$hourint必填小时(0-23)
$minuteint可选分钟(0-59),默认当前时间
$secondint可选秒(0-59),默认当前时间
$monthint可选月份(1-12),默认当前月份
$dayint可选日期(1-31),默认当前日
$yearint可选年份(四位数),默认当前年份
返回值:整数类型时间戳
示例
// 生成 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_floatboolfalse是否返回浮点数。如果 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_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
示例
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.0error_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 = 1
  • E_WARNING = 2
  • E_PARSE = 4
  • E_NOTICE = 8
  • E_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;
}
http://www.dtcms.com/a/577399.html

相关文章:

  • CSP-J教程——第一阶段——第五课:程序流程控制 - 选择结构
  • 【Go微服务框架深度对比】Kratos、Go-Zero、Go-Micro、GoFrame、Sponge五大框架
  • 基于FPGA实现Mini-LVDS转LVDS
  • 做网站的是如何赚钱的哪个小说网站版权做的好处
  • Cache的基本原理
  • 如何提高外贸网站排名南京高端定制网站建设
  • 建网站需要多久网站模板怎么制作
  • 计算机网络:基于TCP协议的自定义协议实现网络计算器功能
  • SpringBoot3+ApolloClient2.3.0集成Apollo2.4.0示例
  • UDP的recvfrom会返回一个完整的数据报
  • Rust实战教程:做一个UDP聊天软件
  • 基于遥感解译与GIS技术生态环境影响评价图件制作
  • 用asp制作一个简单的网站零基础学电脑培训班
  • 广东如何进行网站制作排名做网站在哪里买空间域名
  • 数据结构(长期更新)第6讲:双向链表
  • Debian系统的多内核共存
  • HTTPS 请求抓包,从原理到落地排查的工程化指南(Charles / tcpdump / Wireshark / Sniffmaster)
  • Debian 12 笔记本合盖不休眠设置指南
  • 线性代数 - 奇异值分解(SVD Singular Value Decomposition)- 奇异值在哪里
  • 商城网站开发的完整流程图视频制作价格明细
  • 如何保证Redis和Mysql数据缓存一致性?
  • 八股-Mysql 基础篇(1)
  • 建设公司网站需要准备什么科目苏州建网站的公司
  • Git 某个分支恢复到某个特定的 commit 状态
  • 【Prompt学习技能树地图】生成知识提示技术的深度解析与应用
  • 家用电脑怎么做网站服务器创意设计之都
  • 使用 Spire.XLS for Python 将 Excel 转换为 PDF
  • vue3封装el-dialog
  • 河南郑州网站顾问大连建设工程信息网官网入口
  • 记录一次K8S跨命名空间访问 xxx.xxx.svc.cluster.local 类似内部服务不通的问题