博客列表 >匿名对象与匿名类,Trait类,类的自动加载,对象的序列化与反序列化作业

匿名对象与匿名类,Trait类,类的自动加载,对象的序列化与反序列化作业

YHF的博客
YHF的博客原创
2018年09月10日 19:47:17839浏览
  1. 编程: 匿名对象与匿名类的实现过程;


    实例

    <?php
    /**
     *匿名类:
     * 1.php7.0后才有的
     * 2.类似匿名函数,就是没有名称的类
     * 3.匿名类适合一次性创建与引用
     * 4.匿名类总是与:new配套使用喔
     */
    
    class demo1{
        private $name='马云';
        public function compary($create){
            return $this->name.'创建了'.$create;
        }
    }
    //访问compary()的方式
    //1.对象
    $com1=new demo1();
    echo $com1->compary('阿里巴巴'),'<hr>';
    //2.匿名对象
    echo (new demo1())->compary('蚂蚁借呗'),'<hr>';
    //3.匿名类
    echo (new class{
        private $name='马化腾';
        public function compary($create){
            return $this->name.'创建了'.$create;
        }
    
    })->compary('QQ'),'<hr>';
    //匿名类的三种应用场景
    //1.匿名类可以使用构造方法
    echo (new class('王健林'){
            private $name;
            public function __construct($name)
            {
                $this->name=$name;
            }
            public function son($son){
                return '听说'.$this->name.'的儿子是'.$son;
            }
    })->son('王思聪'),'<hr>';
    //2.匿名类可以继承其它类中的成员
    class salary{
        protected $salary;//工资
        public function __construct($salary=0)
        {
            $this->salary=$salary;
        }
        public function show(){
            return ($this->salary ==0 )?'未知':$this->salary;
        }
    }
    echo (new class ('昆山龙哥') extends salary{
        private $name;
        public function __construct($name,$salary=0)
        {
            parent::__construct($salary);
            $this->name=$name;
        }
        public function test($addr){
            return $this->name.'住在'.$addr;
        }
        public function show()
        {
            return $this->name.'的工资是:'.parent::show();
        }
    })->test('昆山'),'<hr>';
    
    //3.可以在类声明中嵌套一个匿名类
    class Item{//宿主类,父类的角色
        public $name='纯牛奶';
        protected $addr='内蒙古';
        private $brand='蒙牛';
        public function info(){
            return '进货价1毛钱一顿';
        }
        public function demo1(){
            //宿主类中的私有成员不能再匿名类中直接使用
            //可以通过在匿名类创建一个构造方法将宿主类中的私有成员进行注入
            //将宿主类中的私有属性作为匿名类的构造方法的参数传入即可
            return (new class($this->brand) extends Item{
               //1.在匿名类中创建一个属性用来接收宿主类中的私有属性
                private $brand;
                //2.创建一个构造方法
                public function __construct($brand)
                {
                    $this->brand=$brand;
                }
                public function demo2(){
                    return '我是嵌套在匿名类方法中的方法:'.__METHOD__;
                }
                public function show(){
                    return
                        '商品类别:'.$this->name.'<br>'.
                        '商品产地:'.$this->addr.'<br>'.
                        '商品品-牌:'.$this->brand;
    
                }
    
            });
        }
    
    }
    //访问匿名类中的demo2
    echo (new Item())->demo1()->demo2();
    echo '<hr>';
    echo (new Item())->demo1()->show();

    运行实例 »

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

    demo1.jpg

    2. 编程: Trait类的声明与工作原理


    实例

    <?php
    /**
     * Trait
     * 1.php能只能实现单继承,trait打破了限制
     * 2.trait 是代码复用机制(函数,类的继承)
     * 3.trait 是类的语法,但不是类,所以不能实例化
     * 4.trait 相当于方法集
     */
    
    if(!class_exists('Person')){
        class Person{
            protected $naem;
            public function __construct($name='小绿')
            {
                $this->name=$name;
            }
            public function eat($food='香蕉'){
                return $this->name.'在吃:'.$food;
            }
        }
    }
    //创建一个trait特殊类
    trait playing{
        public $name2='小黑';
        public function play($play='王者荣耀'){
            return $this->name2.'在玩:'.$play;
        }
    }
    trait playing2{
        public $name3='小白';
        public function play($play='英雄联盟'){
            return $this->name3.'不在玩:'.$play;
        }
    }
    //父类Person与trait类之间的关系:
    //trait类位于父类与子类之间
    class Child extends Person {
        //导入一个trait类,简单!
        //use playing;
    
        //导入两个类,并且防止类中的方法名重复带来的报错
        use playing,playing2{
            playing::play insteadof playing2;
            playing2::play as high;
        }
    }
    $ch=new Child();
    echo $ch->play('刺激战场'),'<hr>';
    echo $ch->high();

    运行实例 »

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

    demo2.jpg

    3. 编程: 类的自动加载函数的写法


    实例

    <?php
    /**
     * 类的自动加载
     */
    //非自动
    //include './class/class1.php';
    //include './class/class2.php';
    
    spl_autoload_register(function($className){
        //require './class/'.$className.'.php';
        //存在命名空间的情况下
        $className=str_replace("\\","/",$className);
        require './class/'.$className.'.php';
    });
    
    echo class1::CLASS_NAME;
    echo class2::CLASS_NAME;

    运行实例 »

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

    demo3.jpg

    4.编程: 对象的序列化与反序列化的原理与应用;


  2. 实例

    <?php
    /**
     * 对象的序列化:serialize()
     * 反序列化:unserialize()
     */
    //$num = 500;
    //echo serialize($num),'<hr>'; // i:500;
    //$name = 'peter';
    //echo serialize($name), '<hr>'; // s:5:"peter";
    //$course = ['html','css','javascript'];
    //echo serialize($course), '<hr>';
    
    class Two{
        public $pdo=null;
        public $dsn;
        public $pass;
        public $user;
        //构造方法
        public function __construct($dsn='mysql:host=127.0.0.1;dbname=test', $user='root', $pass='')
        {
            $this->dsn = $dsn;
            $this->user =  $user;
            $this->pass = $pass;
            // 确保实例化对象的时候能自动连接上数据库
            $this->connect();
        }
        private function connect(){
            $this->pdo=new PDO($this->dsn,$this->user,$this->pass);
    
        }
    //    序列化时自动调用
        public function __sleep(){
            return ['dsn','user','pass'];
        }
    //    反序列化时
        public function __wakeup(){
            $this->connect();
        }
    }
    $obj = new Two();
    /**
     * 对象序列化的特点:
     * 1. 只保存对象中的属性,不保存方法
     * 2. 只保存类名,不保存对象名
     */
    
    echo serialize($obj);
    $ser=serialize($obj);
    echo '<pre>',print_r(unserialize($ser),true);

    运行实例 »

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

    demo7.jpg

    5.问答:谈谈你对面向对象编程的基本理解


    A.面向对象的目的:解决软件系统的可扩展性,可维护性和可重用性;

    B. 面向对象的三大特性:封装、多态和继承

                1. 封装(对应可扩展性):隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级                别。封装是通过访问控制符(public protected private)来实现。一个类就可看成一个封装。

                2.  多态(可维护性和可扩展性):接口的不同实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到                    变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关                    的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和                     超人,都实现这个接口。

                3.继承(重用性和扩展性):子类继承父类,可以继承父类的方法和属性。可以对父类方向进行覆盖(实现了多                        态)。但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破                    坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用。所以继承要慎用,尽量优先使用组合。

    C. 面向对象编程(OOP)其实就是一种设计思想,在程序设计过程中把每一部分都尽量当成一个对象来考虑,以实现软件系统的可扩展性,可维护性和可重用性。

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