批改状态:合格
老师批语:写得很认真, 望坚持下去
错误处理---自定义错误信息
自定义错误信息:
引入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>";
}点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号