博客列表 >自定义异常类、框架中的模型的实现原理、 文件上传 --2019/08/08

自定义异常类、框架中的模型的实现原理、 文件上传 --2019/08/08

LISTEN的博客
LISTEN的博客原创
2019年08月09日 21:44:38826浏览

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();

运行实例 »

点击 "运行实例" 按钮查看在线实例

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议