登录  /  注册
博主信息
博文 42
粉丝 2
评论 0
访问量 52193
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
文件上传功能、类的属性,方法,构造方法及子类(上传功能的实现 类的定义 对象的定义 对象属性 对象方法 子类及子类继承的实例)2019年3月1日22时
小明的博客
原创
1009人浏览过

今天,学习了上传功能,还有具体学习了类与对象,类中的对象属性,对象方法,构造方法,子类及其继承  还有一个小案例。

一、上传功能

首先构建前端页面,这里需要一个表单 ,方法是post,因为上传内容一般都大,然后用了特殊的上传格式enctype="multipart/form-data"。其次,用php处理,上传之后,文件的相关信息都在$_FILE中。具体步骤:

1、检测是否是post方法

2、设置允许的文件类型  将$_FILE中的type  tmp_name  name error分别赋给变量

3、判断如果文件的类型在预设的文件类型数组中,那么在看把临时文件移到了制定的文件夹中的话就输出上传成功;

4、如果不再支持的文件类型数组中,那么就输出文件类型不支持

5、如果$error大于0 那么代表上传出错 那么输出上传出错

代码

实例

<?php
 echo '<pre>',print_r($_FILES, true);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
//    设置文件允许的类型
    $allowed = ['image/jpeg', 'image/JPG', 'image/png'];
    $type = $_FILES['user_pic']['type'];
    $tmpName = $_FILES['user_pic']['tmp_name'];
    $name = $_FILES['user_pic']['name'];
    if (in_array($type, $allowed)) {
        if (move_uploaded_file($tmpName, './upload/'.$name)) {
            echo "<script>alert('上传成功')</script>";
        }
    } else {
        echo "<script>alert('不支持的文档类型!')</script>";
    }
    $error = $_FILES['user_pic']['error'];
    if ($error > 0) {
        echo "<script>alert('上传失败')</script>";
    }
}

?>


<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">

    <title>文件上传</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data">
        <input type="file" name="user_pic" id="user_pic">
<!--        将文件的大小设置在隐藏域里传递给php处理-->
        <input type="hidden" name="MAX_FILE_SIZE" value="30000">
        <button id="btn">上传</button>

    </form>
</body>
</html>

运行实例 »

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

还有用ajax的方式代码,自己没做 日后参考

实例

<?php
    // 设置允许的文件类型
    $allowed = ['image/jpeg','image/JPG','image/png'];

    // 确保用户执行了上传操作,再执行以下代码
    if (isset($_FILES['user_pic'])) {
        // 上传的文件类型
        $type = $_FILES['user_pic']['type'];
        // 临时文件名
        $tmpName = $_FILES['user_pic']['tmp_name'];

        // 上传的原始文件名
        $name = $_FILES['user_pic']['name'];

        // 上传的图片地址
        $imgFile = 'uploads/' . $name;

        // 确保用户上传的类型是图片
        if (in_array($type, $allowed)) {
            if (move_uploaded_file($tmpName, 'uploads/'.$name)) {
                // 如果上传成功,除返回提示信息外,还要返回文件名,用于在客户端预览图片
                exit(json_encode(['status'=>1,'message'=>'上传成功','img_url'=>$imgFile]));
            }
        } else {
            exit(json_encode(['status'=>0,'message'=>'类型错误']));
        }

        // 错误处理, 0 表示无错误,大于0即表示有错误,对于具体类型可以暂不作判断,感兴趣查阅手册
        $error = $_FILES['user_pic']['error'];
        if ($error > 0) {
            exit(json_encode(['status'=>-1,'message'=>'上传失败']));
        }
    }


?>

<!--以上是前端页面部分-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>异步文件上传</title>
</head>
<body>

    <h3>上传用户头像</h3>
    <!--因为是异步提交,通过js发送http请求,不再需要设置form属性-->
    <p>选择头像:<input type="file" name="user_pic" id="user_pic"></p>
    <p><button id="btn">上传</button><span id="tips"></span></p>



<script>
    var btn = document.getElementById('btn');
    btn.onclick = function () {
        // 因为支持多文件上传,所以用files[0]获取第一个,其实就是单文件上传
        var file = document.getElementById('user_pic').files[0];

        // 通过FormData()对象获取用户提交的表单数据
        var form = new FormData();
        // append()可以将表单控制内容添加到对象属性中, 属性用name的值
        form.append('user_pic', file);

        // 创建Ajax请求对象
        var request = new XMLHttpRequest();

        // 监听请求过程, 设置成功回调
        request.onreadystatechange = function () {
            if (request.readyState === 4) {
                // console.log(request.responseText);
                // 解析服务器端返回的JSON数据
                var data = JSON.parse(request.responseText);

                // 获取占位符元素
                var tips = document.getElementById('tips');

                // 根据返回类型,确定应该执行的操作
                switch (data.status) {

                    // 1: 表示上传成功,除提示信息外, 还要显示预览小图片
                    case 1:
                        tips.style.color = 'green';

                        tips.innerHTML = '<img src="'
                            +data['img_url']
                            +'" alt="用户头像" width="80">'
                            +data.message;

                       break;

                    // 对于0,1,可以集中处理,因为他们都是出错信息,样式也一样
                    case 0:
                    case -1:
                        tips.style.color = 'red';
                        tips.innerText = data.message;
                        break;

                    // 如果错误信息未在上述情形中,则认为是未知错误
                    default:
                        tips.innerText = '未知错误';
                }
            }
        };

        // 设置请求参数,直接提交到当前页面处理, true 表示异步,可以省略
        request.open('post', '<?=$_SERVER['PHP_SELF']?>',true);

        // 使用FormDate,不要设置请求头
        // request.setRequestHeader('content-type','application/x-www-form-urlencoded');

        // 将Ajax请求发送到服务器端指定php脚本处理,当前就是本页面
        request.send(form);
    }
</script>
</body>
</html>

运行实例 »

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

二、类、对象

类就是生成对象的代码模版,对象就是实例化类,也就是把类具体化,比如,美女就是类,那么想冰冰  啵啵  这些就是具体化的美女  就是对象。由同一类实例化的各个对象都是不同的个体,他们彼此不相等。可以用instanceof  来判断是不是实例化自该类。

实例

<?php
//    类是生成对象的代码模版
class demo01
{

}
//对象:类的实例化,是类的具体的实例
//例如:将美女作为类的话,那么对象就有可能是冰冰 啵啵 凤姐等具体的个体
$obj1 = new demo01();
$obj2 = new demo01();
$obj3 = new demo01();
//虽然这三个对象都是由同一个类实例化的结果,但是这三个对象是三个独立的个体,有不同的id;
var_dump($obj1);
echo '<hr>';
var_dump($obj2);
echo '<hr>';
var_dump($obj3);
echo '<hr>';
//检测一个对象是不是这个类的实例
var_dump($obj1 instanceof demo01);
echo '<hr>';
var_dump($obj2 instanceof demo01);
echo '<hr>';
var_dump($obj3 instanceof demo01);
echo '<hr>';
//同一个类实例化的对象不相等
var_dump($obj1 === $obj2);
echo '<hr>';
var_dump($obj2 === $obj3);

/*用id区分对象是我们自己判断的系统并不认,那如何区别呢?
只有通过给不同的对象不同的属性值来区别*/

运行实例 »

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

三、类的对象属性

由同一类实例化的对象们怎么区分?可以用每个对象不同的属性来区分

对象属性,顾名思义是对象后才可以调用,他基本同变量相同,区别是前面需要家访问限定符,public private proteced,他的作用就是设定作用域

类实例化成对象之后,也可以通过对象添加属性,这就是动态属性,动态属性必然是public  只能通过对象访问,且没有代码错误提示

实例

<?php
/*类中的属性,也叫成员变量,他与变量基本差不多,但是有区别
在类中声明变量属性时,需要访问限定符,他是用来限定属性的作用域的
属性声明时,只能是常量而不能是运算符
public 是访问限定符,他可以在类内类外子类访问*/
class demo02
{
//    对象属性,因为只有对象才能访问
//        初始化并且给定了初始值
    public $product = '手机';
    public $price = 2800;
}
//类外
//实例化
$obj = new demo02();
//类外访问属性
echo '品名:'.$obj->product.', 价格:'.$obj->price;
echo '<hr>';
//动态属性
//类的属性除了在类内设定也可以在类外添加
$obj->brand = '华为';
echo '手机***是:'.$obj->brand;
echo '<hr>';
//动态属性必然是对象属性,因为只能通过对象访问
//动态属性必然是public,因为是在类外部添加的
//因为不是在类内声明的,所以编辑器不会由错误提示

//get_class_vars  返回类中声明的public属性组成的数组
$array = get_class_vars('demo02');
echo '<pre>', print_r($array, true);

//每次查看类中的属性都需要大量的代码拼接,
//如何才能在类中内部进行数据处理
//对象方法可以实现

运行实例 »

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

四、对象方法

对象方法可将对象属性这些数据集中在内部处理

对象方法就是对象才能调用,也需要访问限定符,可以传参,在类内部self代表类本身,$this就是值的实例化的对象在类中的相对于占位符的意思

实例

<?php
//对象方法即只有对象才能调用的方法
//对象方法与函数基本一直  只是多了访问限制符
//对象方法调用时同函数一致,方法名后面加上(),也可以传参
class demo03
{
    public $product = '手机';
    public $price = 2800;

    public function getInfo1()
    {
//        self 当前类
        $obj = new self();
        echo '品名:'.$obj->product.', 价格:'.$obj->price;
    }
    public function getInfo2()
    {
//     系统早就设定好了一个变量$this,用来代替类实例化后的对象,然后调用类里面属性或者方法的那个对象
       $this->price = 1200;
        echo '品名:'.$this->product.',价格:'.$this->price;
    }

}
$obj = new demo03();
$obj->getInfo1();
echo '<hr>';
$obj->getInfo2();
echo '<hr>';

//查看类中定义的对象方法  只有public才能显示
$method = get_class_methods('demo03');
print_r($method);

运行实例 »

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

五、构造方法

构造方法是类中的特殊的方法,他随着类的实例化自动执行,通常用来初始化类中的内部对象属性,案例是常用的连接数据的类

实例

<?php
//构造方法是一种特殊的类中的方法,他在类被实例化是自动执行,可用来作为初始化类中的成员
class demo04
{
    public $product;
    public $price;
//    构造函数
    public function __construct($product, $price)
    {
        $this->product = $product;
        $this->price = $price;
    }

    public function getInfo()
    {
        echo '品名:'.$this->product.',价格:'.$this->price;
    }

}
//实例化自动执行构造函数
$obj = new demo04('电脑', 5888);
$obj->getInfo();

//案例:用构造函数连接数据库
class Db
{
//    初始化连接数据库的3个参数
    public $dns;
    public $user;
    public $password;
//    初始化pdo对象
    public $pdo;
//    连接数据库的对象方法
    public function connect(){
        $this->pdo = new PDO($this->dns, $this->user, $this->password);
    }
//    构造函数初始化属性
    public function __construct($dns, $password, $user)
    {
        $this->dns = $dns;
        $this->user = $user;
        $this->password = $password;
//        自动连接数据库
        $this->connect();
    }

}
//测试是否连接
$db = new Db('mysql:dbname=php', 'root', 'root');
if ($db->pdo) {
    echo'连接成功';
}
//打印数据进行测试
$stmt = $db->pdo->prepare('SELECT * FROM `staff`');
$stmt->execute();
$staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($staffs as $staff) {
    print_r($staff); echo '<br>';
}

运行实例 »

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

六、子类

子类继承父类的所有属性 方法 构造方法,还可以扩展父类的功能,重构方法 构造方法。需要注意  parent::方法名 可以直接继承方法

实例

<?php
class demo05
{
    public $product;
    public $price;
//    构造函数
    public function __construct($product, $price)
    {
        $this->product = $product;
        $this->price = $price;
    }

    public function getInfo()
    {
        echo '品名:'.$this->product.',价格:'.$this->price;
    }

}

//子类继承自父类demo05  可以使用父类的方法属性
class sub1 extends demo05 {

}
$obj = new sub1('手机', '2800');
$obj->getInfo(); echo '<hr>';

//子类继承父类  增加属性和方法 扩展功能
class sub2 extends demo05
{
    public $num;
//    子类构造方法
    public function __construct($product, $price, $num)
    {
        parent::__construct($product, $price);
        $this->num = $num;
    }
//    扩展功能
    public function total() {
        return $this->price * $this->num;
    }
}
$sub2 = new sub2('手机', '3400', 5);
echo $sub2->getInfo().'总价是:'.$sub2->total().'<hr>';

//方法重写   sub3继承自sub2  由继承自demo05  都能使用和改写他们的方法
class sub3 extends sub2
{
    public function total()
    {
        $total = parent::total(); // TODO: Change the autogenerated stub

        switch (true) {
            case ($total >= 10000 && $total < 20000):
                $discountRate = 0.98;    // 98折
                break;
            case ($total > 20000 && $total < 40000):
                $discountRate = 0.88;    // 88折
                break;
            case ($total > 40000 && $total < 60000):
                $discountRate = 0.78;    // 78折
                break;
            case ($total >= 60000):
                $discountRate = 0.68;    // 68折
                break;
            default:
                $discountRate = 1;
        }
        // 结果四舍五入,保留2位小数
        return round($total*$discountRate, 2);

    }

}

//实例化
    $sub3 = new sub3('电脑', 2800, 15);
    echo $sub3->getInfo().' 数量'.$sub3->num.' 折扣价:'.$sub3->total();

运行实例 »

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

总结

1、上传功能需要前端现构建表单,提交方法post  enctype都是固定的,input类型是file,同时也可以用ajax方式 ,这种方法不需要设置form

2、类实例化的对象都是不同的个体,并不相等

3、类的对象属性和对象方法都有作用域,用访问限定符来设置

4、构造函数随着实例化自动执行,通常来初始化类中的属性等内部成员

5、子类突出的特点就是继承可以用父类的属性  方法,可以扩展功能,利用父类的数据增加方法,还可以修改父类的方法,需要注意,子类继承方法用parent::方法名  方便快速 不可缺少

批改状态:未批改

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学