php 中使用 Exception 类来管理异常
官网截图:
可以看到 只有 __construct() 方法和 __toString()方法可以被子类继承重载
异常处理一般结合 try-catch语法使用,一下为简单实例:
try {$errorInfo = '遇到错误';throw new Exception($errorInfo, 0); // 手动抛出异常,后面语句不会执行echo '测试语句';}catch(Exception $e){ // 这里会接收异常对象print_r($e->getMessage()); // 遇到错误print_r($e->getCode()); // 0}
 PHP中使用全局变量 $_FILES 来处理文件上传 
** $_FILES 为一个数组,保存着文件上传的信息,打印一下可以看到保存着5中信息。
这里要注意的是:PHP上传文件时会将文件上传至一个临时位置,需要再次移动该临时文件至指定目录。
这里我们将异常处理和文件上传结合一下写一个例子
先建个表单文件 upload.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>文件上传</title></head><body><form action="deal.php" method="POST" enctype="multipart/form-data"><!--设置一个隐藏域,限制上传文件大小--><input type="hidden" name="MAX_FILE_SIZE" value="20000"><input type="file" name="file1"><button>上传</button></form></body></html>
在建个处理文件 deal.php
<?php/*** 文件上传*/namespace day1012;use Exception;// 自定义异常类class MyException extends Exception{public function __construct($message = "", $code = 0){parent::__construct($message, $code);}public function errorInfo(){return <<<ERROR<h3 style="font-weight:bold; line-height: 30px"><img src="./warn-ico.png" width="30" height="30" style="float: left; margin-top: 15px" /><p style="margin: 0 0 0 40px">出现异常,异常编号:<em style="color: red">{$this->getCode()}</em> </p><p style="margin: 0 0 0 40px">异常信息:<em style="color: red">{$this->getMessage()}</em></p></h3>ERROR;}}try {// PHP中使用全局变量 $FILES 来处理文件上传print_r($_FILES);// 1. 设定上传文件限定类型$fileType = ['jpg', 'png'];// 2.设置允许上传文件大小$fileSize = 250000;// 3. 设置文件目录$path = './uploads/';// 文件名称$fileName = $_FILES['file1']['name'];// 临时文件名称$tmpName = $_FILES['file1']['tmp_name'];// 4. 判断文件是否上传成功,错误类型 0:成功,大于1 出错if ($_FILES['file1']['error'] > 0) {switch ($_FILES['file1']['error']) {case 1:throw new MyException('文件大小超出PHP配置文件限制',101);case 2:throw new MyException('文件大小超出表单限定值',102);case 3:throw new MyException('文件只有部分被上传',103);case 4:throw new MyException('没有上传任何文件',104);default :throw new MyException('未知错误',105);}}// 5. 判断文件类型是否为允许类型$type = explode('.', $fileName)[1];if (!in_array($type, $fileType)) {throw new MyException('不允许上传' . $type . '类型文件',106);}// 6. 判断文件是否超出限定值大小if ($_FILES['file1']['size'] > $fileSize) {throw new MyException('超出大小限制,请重新上传',107);}// 7. 设置新的文件名,注意别忘了加后缀名$newName = date('YmdHis') . rand(100, 999) . '.' . $type;if (is_uploaded_file($tmpName)) {if (!move_uploaded_file($tmpName, __DIR__ . $path . $newName)) {throw new MyException('移动文件失败',888);} else {echo '<script>alert("恭喜上传成功");window.history.back();</script>';}} else {throw new MyException('上传文件不是合法文件',999);}}catch(MyException $e){print_r($e->errorInfo());}
一些结果截图:

这里绑定 staff 表,因此建立一个 Staff类
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><link rel="stylesheet" href="table.css"></head><body><div><?phpclass Staff{// 先定义属性,用于和表中字段绑定private $staff_id;private $name;private $age;private $sex;private $position;private $mobile;private $hiredate;private static $pdo;public function __construct(){// 部分字段初始化$this->sex = $this->sex ? '男' : '女';$this->hiredate = date('Y/m/d', $this->hiredate);}public function __get($name){return $this->$name;}public function __set($name, $value){$this->$name = $value;}public static function connect(){static::$pdo = new \PDO('mysql:dbname=zmx;', 'root', 'root');}// 查询方法public static function select($where = ''){static::connect();$where = empty($where) ? '' : ' WHERE ' . $where;$sql = 'SELECT * FROM `staff` ' . $where;$stmt = static::$pdo->prepare($sql);// setFetchMode// 为语句设置默认的获取模式。// PDO::FETCH_CLASS// 指定获取方式,返回一个所请求类的新实例,映射列到类中对应的属性名。// 如果所请求的类中不存在该属性,则调用 __set() 魔术方法// 这里就是将拿到的数据库模型 和 当前 Staff 类进行关联$stmt->setFetchMode(\PDO::FETCH_CLASS, Staff::class);if ($stmt->execute()) {echo '<table border="1" cellpadding="0" cellspacing="0" width="400">';echo '<tr><th>ID</th><th>姓名</th><th>年龄</th><th>性别</th><th>职位</th><th>联系方式</th><th>入职时间</th></tr>';while ($staff = $stmt->fetch()) {echo '<tr>';echo '<td>' . $staff->staff_id . '</td>';echo '<td>' . $staff->name . '</td>';echo '<td>' . $staff->age . '</td>';echo '<td>' . $staff->sex . '</td>';echo '<td>' . $staff->position . '</td>';echo '<td>' . $staff->mobile . '</td>';echo '<td>' . $staff->hiredate . '</td>';echo '</tr>';}echo '</table>';}}// 增加方法public static function insert($data){static::connect();$set = ' SET ';foreach ($data as $key => $value) {$set .= $key . ' =:' . $key . ', ';}// 去掉最后一个 逗号$set = rtrim($set, ", ");$sql = 'INSERT INTO `staff` ' . $set;$stmt = static::$pdo->prepare($sql);if ($stmt->execute($data)) {if ($stmt->rowCount() > 0) {echo '成功新增了' . $stmt->rowCount() . '条记录,最后一条记录主键为' . static::$pdo->lastInsertId().'<br/>';}} else {die('新增失败:' . print_r($stmt->errorInfo()));}}// 更新方法public static function update($data,$where){static::connect();$where = empty($where) ? '' : ' WHERE ' . $where;$set = ' SET ';foreach ($data as $key => $value) {$set .= $key . ' =:' . $key . ', ';}// 去掉最后一个 逗号$set = rtrim($set, ", ");$sql = 'UPDATE `staff` ' . $set.$where;$stmt = static::$pdo->prepare($sql);if ($stmt->execute($data)) {if ($stmt->rowCount() > 0) {echo '成功更新了' . $stmt->rowCount() . '条记录<br/>';}} else {die('更新失败:' . print_r($stmt->errorInfo()));}}// 删除方法public static function delete($where){static::connect();$where = empty($where) ? '' : ' WHERE ' . $where;$sql = 'DELETE FROM `staff` '.$where;$stmt = static::$pdo->prepare($sql);if($stmt->execute()){if($stmt->rowCount() > 0){echo '成功删除了'.$stmt->rowCount().'条记录<br/>';}}else {die('查询失败:' . print_r($stmt->errorInfo()));}}}Staff::select();Staff::insert(['staff_id'=>20,'name'=>'小明','age'=>20,'sex'=>1,'position'=>'队长','mobile'=>'12345678','hiredate'=>'1218297600']);Staff::update(['name'=>'小张'],'staff_id=20');Staff::delete('staff_id=20');

                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号