错误处理---自定义错误信息
自定义错误信息:
引入Exception类和扩展Exception类的errorInfo()方法
实例
<?php //处理运行中的错误 namespace _1012_3; //异常错误处理 //异常经行错误的统一处理 //异常类是php中专用与错误,信息的同一处理 use Exception; //将系统的异常类进行自定义扩展 class ClaException extends Exception { public function __construct($message = "", $code = 0) { parent::__construct($message, $code); } //自定义错误信息 public function errorInfo() { //heredoc: 用来输出大段的html代码或字符中, 并且中间允许有变量且会解析 return <<< "ERROR" <h2> <strong>{$this->getCode()}: </strong> <span style="color: red;">{$this->getMessage()}</span> </h2> ERROR; } } //如果程序出现错误,则执行catch{中的代码} try { //完成算数四则运算 class Calculator { //操作符 protected $defaultOperators = ['+', '-', '*', '/', '%']; //结果 protected $result; //构造方法 public function __construct(...$operators) { //判断操作符是否在有效的范围内(其实这步可以不要) foreach ($operators as $operator) { if (in_array($operator, $this->defaultOperators)) { continue; } else { // die("操作符错误"); //Exception(‘提示信息’,自定义错误码) throw new ClaException("操作错误", 101); } } //更新当前的操作符列表 $this->defaultOperators = $operators; } //运算方法 public function operation($type, ...$args) { //判断操作符的合法性 if (in_array($type, $this->defaultOperators)) { //参数的个数 $num = count($args); switch ($num) { case 0: // die("参数不能为空"); throw new ClaException('参数不能为空', 102); break; case $num < 2: // die("参数不能少于2个"); throw new ClaException('参数不能少于2个', 103); break; default: $this->result = array_shift($args); if (is_numeric($this->result)) { $this->ececute($type, ...$args); } else { // die("第一个参数必须是数值型"); throw new ClaException('第一个参数必须是数值型', 104); } } } else { // die("操作符错误"); throw new ClaException('操作符错误', 105); } //返回结果,保留两位小数 return round($this->result, 2); } //运算+结果 public function ececute($type, ...$args) { //遍历传入参数 foreach ($args as $arg) { //如果第二个传入的参数是数字类型 if (is_numeric($arg)) { //根据类型来判断运算类型 switch ($type) { case '+': $this->result += $arg; break; case '-': $this->result -= $arg; break; case '*': $this->result *= $arg; break; case '/': if ($arg !== 0) { $this->result /= $arg; } else { // die("除数不能等于0"); throw new ClaException('除数不能为零', 106); } $this->result += $arg; break; case '%': $this->result %= $arg; break; } } else { // die("操作数据类型错误"); throw new ClaException('操作数类型错误', 107); } } } } //调用类 $calculator = new Calculator('+', '-', '*', '/', '%'); echo $calculator->operation('.', 35, 35); echo '<br>'; echo $calculator->operation('*', 45.234, 12.123); echo '<br>'; echo $calculator->operation('/', 45, 12.67); } catch (ClaException $e){ echo $e->errorInfo(); echo '<br>'; echo $e->getCode(), ': ' , $e->getMessage(); }
运行实例 »
点击 "运行实例" 按钮查看在线实例
文件上传的操作
实例
<?php // 将系统的异常类进行扩展,自定义 class ClaException extends Exception { public function __construct($message = "", $code = 0) { parent::__construct($message, $code); } //自定义错误信息 public function errorInfo() { //heredoc: 用来输出大段的html代码或字符中, 并且中间允许有变量且会解析 return <<< "ERROR" <h2> <strong>{$this->getCode()}: </strong> <span style="color: red;">{$this->getMessage()}</span> </h2> ERROR; } } // 文件上传 try { // PHP使用一个超全局变量:$_FILES 来处理文件上传 // 1. 配置上传参数 // 允许上传的文档类型 $fileType = ['jpg', 'jpeg', 'png', 'gif']; // 设置允许上传的文件最大长度 $fileSize = 3145728; // 上传到服务器上的指定的目录 $filePath = '/uploads/'; // 原始的文件名 $fileName = $_FILES['my_file']['name']; // 上传到服务器上的临时文件名 $tempFile = $_FILES['my_file']['tmp_name']; // 2. 判断文件是否上传成功? //$_FILES['my_file']['error'], 0: 表示成功,大于1出错 $uploadError = $_FILES['my_file']['error']; if ($uploadError > 0) { switch ($uploadError) { case 1: case 2: throw new ClaException('上传文档不允许超过3M', 101); case 3: throw new ClaException('上传文件不完整', 102); case 4: throw new ClaException('没有文件被上传', 103); default: throw new ClaException('未知错误', 104); } } // 3. 判断文件扩展名是否正确? //girl.jpg //['girl', 'jpg'] $extension = explode('.', $fileName)[1]; if (!in_array($extension, $fileType)) { throw new ClaException('不允许上传'.$extension.'文件类型',105); } // 4. 为了防止同名覆盖, 将上传的文件重命名: md5+时间戳 $fileName = date('YmdHis', time()) . md5(mt_rand(1, 99)) . '.' . $extension; // 5. 上传文件 if (is_uploaded_file($tempFile)) { if (move_uploaded_file($tempFile, __DIR__ . $filePath . $fileName)) { echo '<script>alert("上传成功");history.back();</script>'; } else { throw new ClaException('文件无法移动到指定目录, 请检查目录权限', 106); } } else { throw new ClaException('非法操作', 107); } } catch (ClaException $e){ echo $e->errorInfo(); } exit();
运行实例 »
点击 "运行实例" 按钮查看在线实例
模型关联
实例
<?php //框架中的模型通常是与一张表进行关联的 //实现的类到数据表的映射 namespace _1012_5; use PDO; //类名与表明要对应 class Staff { //属性与表中的字段对应 private $staff_id; private $name; private $age; private $sex; private $position; private $mobile; private $hiredate; //属性重载 public function __get($name) { // TODO: Implement __get() method. return $this->$name; } public function __set($name, $value) { // TODO: Implement __set() method. $this->$name = $value; } //构造方法 public function __construct() { $this->hiredate = date('Y/m/d',$this->hiredate); $this->sex = $this->sex? '男':'女'; } } //连接数据库 $pdo = new PDO('mysql:dbname=chen', 'root', 'root'); //创建预处理语句 $stmt = $pdo->prepare('SELECT * FROM `staff`'); //将此表的数据绑定到STAFF对象中 $stmt->setFetchMode(PDO::FETCH_CLASS,Staff::class); //执行sql $stmt->execute(); //var_dump($staff = $stmt->fetch());这时获得的结果,就是个对象,而不是数组 while ($staff = $stmt->fetch()){ echo"<li>{$staff->staff_id}:{$staff->name}--{$staff->age}--{$staff->sex}--{$staff->hiredate}</li>"; }
运行实例 »
点击 "运行实例" 按钮查看在线实例