1、传统的错误处理方式
实例
<?php namespace _0808test\_1; // 传统方式的错误处理 class Calculator { protected $defaultOperators=['+','-','*','/','%']; protected $result; public function __construct(...$operators) { // 判断操作符是否在有效范围 foreach ($operators as $value){ // in_array() 函数搜索数组中是否存在指定的值。 if(in_array($value,$this->defaultOperators)){ continue; }else{ die('操作符错误'); } } // 更新操作默认操作符 $this->defaultOperators=$operators; } // 运算方法 public function operation($type,...$args) { // 判断操作符的合法性 if(in_array($type,$this->defaultOperators)){ // 获取操作数数量 $num=count($args); switch ($num){ case 0: die('参数不能为空'); break; case ($num<2): die('参数不能少于2个'); break; default: // 用参数的第一个值来初始化$this->result, 最终结果也会保存在这个属性中 // $this->result 也是第一个操作数 // array_shift() 函数删除数组中第一个元素,并返回被删除元素的值。 $this->result=array_shift($args); if (is_numeric($this->result)){ $this->execute($type,...$args); }else{ die('第一个参数必须是数值型'); } } }else{ die('操作类型错误'); } // 将最终的运算结果输出 // round() 函数对浮点数进行四舍五入。 return round($this->result,2); } // 运算执行器方法 public function execute($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; break; }else{ die('除数不能为零'); } case '%': if($arg!==0){ $this->result%=$arg; break; }else{ die('除数不能为零'); } } }else{ die('操作数必须是数值型'); } } } } // 测试代码 // 实例化并自定义允许的计算类型 $obj=new Calculator('+','-','*','/','%'); //$obj=new Calculator('+','-','*','hhh'); //echo $obj->operation('+'); //echo $obj->operation('+',5); //echo $obj->operation('+',5,'qqq'); echo $obj->operation('+',5,6,7); echo '<hr>'; echo $obj->operation('-',5,6,7); echo '<hr>'; echo $obj->operation('*',5,6,7); echo '<hr>'; echo $obj->operation('/',10,2,2); echo '<hr>'; echo $obj->operation('%',10,3,2);
运行实例 »
点击 "运行实例" 按钮查看在线实例
2、系统异常类常规处理
实例
<?php // 异常类: Exception namespace _0808test\_2; use Exception; try{ class Calculator { protected $defaultOperators=['+','-','*','/','%']; protected $result; public function __construct(...$operators) { // 判断操作符是否在有效范围 foreach ($operators as $value){ // in_array() 函数搜索数组中是否存在指定的值。 if(in_array($value,$this->defaultOperators)){ continue; }else{ // die('操作符错误'); throw new Exception('操作符错误',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 Exception('参数不能为空',102); break; case ($num<2): // die('参数不能少于2个'); throw new Exception('参数不能少于2个',103); break; default: // 用参数的第一个值来初始化$this->result, 最终结果也会保存在这个属性中 // $this->result 也是第一个操作数 // array_shift() 函数删除数组中第一个元素,并返回被删除元素的值。 $this->result=array_shift($args); if (is_numeric($this->result)){ $this->execute($type,...$args); }else{ // die('第一个参数必须是数值型'); throw new Exception('第一个参数必须是数值型',104); } } }else{ // die('操作类型错误'); throw new Exception('操作类型错误',105); } // 将最终的运算结果输出 // round() 函数对浮点数进行四舍五入。 return round($this->result,2); } // 运算执行器方法 public function execute($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; break; }else{ // die('除数不能为零'); throw new Exception('除数不能为零',106); } case '%': if($arg!==0){ $this->result%=$arg; break; }else{ // die('除数不能为零'); throw new Exception('除数不能为零',106); } } }else{ // die('操作数必须是数值型'); throw new Exception('操作数必须是数值型',107); } } } } // 测试代码 // 实例化并自定义允许的计算类型 $obj=new Calculator('+','-','*','/','%'); //$obj=new Calculator('+','-','*','hhh'); //echo $obj->operation('+'); //echo $obj->operation('+',5); //echo $obj->operation('+',5,'qqq'); echo $obj->operation('+',5,6,7); echo '<hr>'; echo $obj->operation('-',5,6,7); echo '<hr>'; echo $obj->operation('*',5,6,7); echo '<hr>'; echo $obj->operation('/',10,2,2); echo '<hr>'; echo $obj->operation('%',10,3,2); }catch (Exception $e){ // 输出异常信息 echo $e->getCode().' : '.$e->getMessage(); }
运行实例 »
点击 "运行实例" 按钮查看在线实例
3、自定义异常类处理
实例
<?php // 自定义异常类: 继承自 Exception namespace _0808test\_3; use Exception; // 自定义异常类 class CalException extends Exception { // 只有__construct(), __toString(),两个方法可以重写, 其它方法统统是Final 不允许重写 // 自定义错误信息的输出样式 // 将错误编码加粗, 将错误文本描红 public function errorInfo() { // $str="<h3> // <strong>{$this->getCode()}</strong> // <span style='color: red'>{$this->getMessage()}</span> // </h3>"; // return $str; return <<< ERROR <h3> <strong>{$this->getCode()}</strong> <span style='color: red'>{$this->getMessage()}</span> </h3> ERROR; } } try{ class Calculator { protected $defaultOperators=['+','-','*','/','%']; protected $result; public function __construct(...$operators) { // 判断操作符是否在有效范围 foreach ($operators as $value){ // in_array() 函数搜索数组中是否存在指定的值。 if(in_array($value,$this->defaultOperators)){ continue; }else{ // die('操作符错误'); throw new CalException('操作符错误',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 CalException('参数不能为空',102); break; case ($num<2): // die('参数不能少于2个'); throw new CalException('参数不能少于2个',103); break; default: // 用参数的第一个值来初始化$this->result, 最终结果也会保存在这个属性中 // $this->result 也是第一个操作数 // array_shift() 函数删除数组中第一个元素,并返回被删除元素的值。 $this->result=array_shift($args); if (is_numeric($this->result)){ $this->execute($type,...$args); }else{ // die('第一个参数必须是数值型'); throw new CalException('第一个参数必须是数值型',104); } } }else{ // die('操作类型错误'); throw new CalException('操作类型错误',105); } // 将最终的运算结果输出 // round() 函数对浮点数进行四舍五入。 return round($this->result,2); } // 运算执行器方法 public function execute($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; break; }else{ // die('除数不能为零'); throw new CalException('除数不能为零',106); } case '%': if($arg!==0){ $this->result%=$arg; break; }else{ // die('除数不能为零'); throw new CalException('除数不能为零',106); } } }else{ // die('操作数必须是数值型'); throw new CalException('操作数必须是数值型',107); } } } } // 测试代码 // 实例化并自定义允许的计算类型 $obj=new Calculator('+','-','*','/','%'); //$obj=new Calculator('+','-','*','hhh'); //echo $obj->operation('+'); //echo $obj->operation('+',5); //echo $obj->operation('+',5,'qqq'); // echo $obj->operation('+','qqq',6,7); echo $obj->operation('+',0.5,6,7); echo '<hr>'; echo $obj->operation('-',5,6,7); echo '<hr>'; echo $obj->operation('*',5,6,7); echo '<hr>'; echo $obj->operation('/',10,2,2); echo '<hr>'; echo $obj->operation('%',10,3,2); }catch (CalException $e){ // 输出异常信息 echo $e->errorInfo(); }
运行实例 »
点击 "运行实例" 按钮查看在线实例
4、框架中的模型的实现原理
实例
<?php // 框架中的模型, 通常会与一张数据表对应, 而模型对象,则与数据表中的一条记录对应 // 这种数据表到类的映射关系, 对于面向对象的方式管理数据库极其重要 namespace _0808test; use PDO; // 模型对应数据表: Staff class Staff { // 类中属性与表字段对应 private $staff_id; private $name; private $age; private $sex; private $position; private $hiredate; public function __get($name) { return $this->$name; } public function __set($name, $value) { $this->$name=$value; } public function __construct() { // 在这里做一些初始化或数据转换 // 在构造函数中设置属性值,会在获取的时候就直接修改获取到的对象(记录)的相应字段值,但不会修改数据库的原本的值 // $this->name='哈哈哈';//将获取到的所有数据的name值改成 哈哈哈 $this->sex=$this->sex?'男':'女';//直接将数据库sex字段值 1、0 改成 男、女 $this->hiredate=date('Y-m-d',$this->hiredate); } } $pdo=new PDO('mysql:host=localhost;dbname=php','root','root'); $stmt=$pdo->prepare('select * from `staff`'); // 将数据表与类关联 $stmt->setFetchMode(PDO::FETCH_CLASS,Staff::class); $stmt->execute(); while ($staff=$stmt->fetch()){ // 属性重载 echo "<li>{$staff->staff_id}:{$staff->name}-- {$staff->sex}--{$staff->hiredate}</li>"; } //$res=$stmt->fetch();//获取到的是一个对象,$res是一个对象 //print_r($res); //$arr=(array)$res; //$res->name='aaa';// 会修改对象的name值,但不会修改数据库的原本的值 //echo "<li>{$res->staff_id}:{$res->name}-- {$res->sex}--{$res->hiredate}</li>"; //print_r($arr);
运行实例 »
点击 "运行实例" 按钮查看在线实例
5、文件上传的完整流程
index.html 代码
实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <form action="demo5.php" method="post" enctype="multipart/form-data"> <!--设置上传文件大小最大为3M 这段代码一定要放到文件提交框之前--> <!-- 1M = 1024K = 1024*1024Byte=1048576Byte--> <input type="hidden" name="MAX_FILE_SIZE" value="3145728"> <input type="file" name="my_file" id=""> <!--button默认为提交按钮--> <button>上传</button> </form> </body> </html>
运行实例 »
点击 "运行实例" 按钮查看在线实例
文件上传处理代码
实例
<?php //文件上传的完整流程 // 1. 配置上传参数 // 允许上传的文件类型 $fileType=['jpg','jpeg','png','gif']; $fileSize=3145728; // 文件上传到服务器上的目录 $filePath='/uploads/'; echo '<pre>'; //print_r($_FILES); //die; // 原始文件名称 $fileName=$_FILES['my_file']['name']; // 临时文件名 $tmpFile=$_FILES['my_file']['tmp_name']; // 2. 判断是否上传成功? $uploadError=$_FILES['my_file']['error']; if($uploadError>0){ switch ($uploadError){ case 1:die('上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值。'); case 2: die('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。上传文件不允许超过3M'); case 3: die('文件只有部分被上传。上传文件不完整'); case 4: die('没有文件被上传'); case 6:die('找不到临时文件夹。'); case 7:die('文件写入失败。'); default: die('未知错误'); } } // 3. 判断扩展名是否正确? $extension=explode('.',$fileName)[1]; if(!in_array($extension,$fileType)){ die('不允许上传'.$extension.'文件类型'); } //$myImg = explode('.', $_FILES['file']['name']); //$extension = array_pop($myImg); // 4. 为了防止同名文件相互覆盖, 应该将上传到目录中 的文件重命名 //mt_rand() 使用 Mersenne Twister 算法返回随机整数。 $fileName=date('YmdHis',time()).md5(mt_rand(1,99)).'.'.$extension; // 5. 上传文件 // 检测是否是通过 post 上传的 is_uploaded_file() 函数判断指定的文件是否是通过 HTTP POST 上传的。 if(is_uploaded_file($tmpFile)){ // move_uploaded_file() 函数将上传的文件移动到新位置。 if(move_uploaded_file($tmpFile,__DIR__.$filePath.$fileName)){ echo '<script>alert("上传成功");history.back();</script>'; }else{ die('文件无法移动到指定目录, 请检查目录的写权限'); } }else { die('非法操作'); } exit();
运行实例 »
点击 "运行实例" 按钮查看在线实例