1、传统的错误处理方式
实例
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 '
';
echo $obj->operation('-',5,6,7);
echo '
';
echo $obj->operation('*',5,6,7);
echo '
';
echo $obj->operation('/',10,2,2);
echo '
';
echo $obj->operation('%',10,3,2);
运行实例 »
点击 "运行实例" 按钮查看在线实例
2、系统异常类常规处理
实例
// 异常类: 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 '
';
echo $obj->operation('-',5,6,7);
echo '
';
echo $obj->operation('*',5,6,7);
echo '
';
echo $obj->operation('/',10,2,2);
echo '
';
echo $obj->operation('%',10,3,2);
}catch (Exception $e){
// 输出异常信息
echo $e->getCode().' : '.$e->getMessage();
}
运行实例 »
点击 "运行实例" 按钮查看在线实例
3、自定义异常类处理
实例
// 自定义异常类: 继承自 Exception
namespace _0808test\_3;
use Exception;
// 自定义异常类
class CalException extends Exception
{
// 只有__construct(), __toString(),两个方法可以重写, 其它方法统统是Final 不允许重写
// 自定义错误信息的输出样式
// 将错误编码加粗, 将错误文本描红
public function errorInfo()
{
// $str="
// {$this->getCode()}
// {$this->getMessage()}
// ";
// return $str;
return <<
{$this->getCode()}
{$this->getMessage()}
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 '
';
echo $obj->operation('-',5,6,7);
echo '
';
echo $obj->operation('*',5,6,7);
echo '
';
echo $obj->operation('/',10,2,2);
echo '
';
echo $obj->operation('%',10,3,2);
}catch (CalException $e){
// 输出异常信息
echo $e->errorInfo();
}
运行实例 »
点击 "运行实例" 按钮查看在线实例
4、框架中的模型的实现原理
实例
// 框架中的模型, 通常会与一张数据表对应, 而模型对象,则与数据表中的一条记录对应
// 这种数据表到类的映射关系, 对于面向对象的方式管理数据库极其重要
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 "
{$staff->staff_id}:{$staff->name}-- {$staff->sex}--{$staff->hiredate}";}
//$res=$stmt->fetch();//获取到的是一个对象,$res是一个对象
//print_r($res);
//$arr=(array)$res;
//$res->name='aaa';// 会修改对象的name值,但不会修改数据库的原本的值
//echo "
{$res->staff_id}:{$res->name}-- {$res->sex}--{$res->hiredate}";//print_r($arr);
运行实例 »
点击 "运行实例" 按钮查看在线实例
5、文件上传的完整流程
index.html 代码
实例
html>
上传文件上传
运行实例 »
点击 "运行实例" 按钮查看在线实例
文件上传处理代码
实例
//文件上传的完整流程
// 1. 配置上传参数
// 允许上传的文件类型
$fileType=['jpg','jpeg','png','gif'];
$fileSize=3145728;
// 文件上传到服务器上的目录
$filePath='/uploads/';
echo '
';
//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 '';
}else{
die('文件无法移动到指定目录, 请检查目录的写权限');
}
}else {
die('非法操作');
}
exit();
运行实例 »
点击 "运行实例" 按钮查看在线实例