php 强制转换自定义类,自定义异常类、框架中的模型的实现原理、 文件上传 --2019/08/08...

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

运行实例 »

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值