博客列表 >0905作业:匿名对象/trait/类的自动加载/abstract/serialize

0905作业:匿名对象/trait/类的自动加载/abstract/serialize

Samoye
Samoye原创
2018年09月07日 14:49:16808浏览

作业1:匿名对象与匿名类的实现过程;

实例

<?php
/**
  匿名类就是没名字的类,与new配合使用
 * 匿名对象就是没有名字的对象
 */

//举个栗子

class Animal {
    public $name = '大黄';
    public function sing ($voice){
        return $this->name.'在'.$voice.'唱歌!';
    }
}

// 通过匿名对象来访问sing();

echo (new Animal())->sing('汪汪地');

//通过匿名类访问sing()---其实就是直接搞个类啦
echo (new class{
    public $name = '黄鹂';
    public function sing ($voice){
        return $this->name.'在'.$voice.'唱歌';
    }
})->sing('嘤嘤的');

运行实例 »

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

//总结:
// 匿名类中可以有构造方法
//匿名类可以继承别的类
//匿名类中可以有类,类中类,内部类,不能直接访问宿主类的private的成员

作业2:Trait类的声明与工作原理;

实例

<?php
/**
    trait 打破了PHP单继承的特性
    trait类不能实例化
    trait类是方法集
 */
//特别实用的一个语句:if (!class_exists('XXX类')) {}

class Animal {
    public $name;
    public function eat(){
        return '所有的动物都会吃!';
    }
}

trait Fly{
    public function fly(){
        return '我有了会飞的技能!';
    }
}

trait Swim {
    public function swim(){
        return '我学会了游泳!';
    }
}


class Felid extends Animal {

    //声明实用 trait类,实现功能
     use Fly;
     use Swim;


    public function  burrow (){
        return '我们猫科动物还会打洞';
    }
}

echo ((new Felid())->fly());
echo ((new Felid())->swim());

运行实例 »

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

//总结:
//当同时实用几个trait类时候,内部有重名的方法时候,适用如下语法:
//   use A,B {
//       A::method insteadof B ;  用A的方法替代了B的方法,
//       B::method as new_method;  给B的同名方法取了一个别名


作业3:类的自动加载函数的写法

实例

<?php
/**
 *  类的自动加载
 * 很多开发者会为每个类新建一个 PHP 文件, 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。
 * 通过spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载,省了不少力气;
 */

   spl_autoload_register(function ($className){
       // 导入class目录下的所有类文件
      require './class/'.$className.'.php';
   });

   echo ((new Fly())->fly()); //使用匿名对象调用  //PHP7 中产生了一个警告,类名和方法名一样的构造风格,被弃用了。
   echo ((new Animal())->sleep()); //调用别的类的方法;

运行实例 »

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

代码结构截图:

QQ图片20180907144448.png

作业4:对象的序列化与反序列化的原理与应用

实例

<?php
/**
  序列话和反序列化
 *
 * 在对象的序列化后,得到的是字节流,利于在网络上传输。反序列化,可以拿到序列化后的数据,还原为一个对象。
 */

//整数序列化
$i = 100;
echo serialize($i).'<hr>';
//字符串序列化
$str = 'serialize';
echo serialize($str).'<hr>';
// boolean 序列化
echo serialize(false).'<hr>';
// array 序列化
$arr = ['name'=>'peter','sex'=>'female'];
echo serialize($arr).'<hr>';
// 资源类型不可序列化,因为是引用的资源。

//对象的序列化和反序列化

class Db
{
    public  $db = null;

    public $host;
    public $user;
    public $pass;


    private function connect(){
        $this->db = mysqli_connect($this->host,$this->user,$this->pass);
    }

    public function __construct($host='localhost',$user='root',$pass='root')
    {
        $this->host=$host;
        $this->user=$user;
        $this->pass=$pass;

        $this->connect();
    }

    //在序列化执行之前会调用钩子函数__sleep(),允许序列化的对象属性
    public function __sleep()
    {
        return ['host','user','pass'];
    }

    //在执行反序列化时候会调用__wakeup()
    public function __wakeup()
    {
        //获取序列化的属性值,建立连接。
        $this->connect();
    }

}

$db = new DB();
echo serialize($db),'<hr>';
//对象序列化:只保存对象中的属性,不保存方法;只保存类名,不保存对象名

var_dump(unserialize(serialize($db)));//反序列化

运行实例 »

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


作业5:谈谈你对面向对象编程的基本理解

* 面向对象是针对面向过程而言的,在面向过程编程时候,我们需要个功能直接用函数实现即可,但是面向对象编程,我们需要个对象
* 然后驱动对象的方法去完成,而对象的母版--类更好的实现了对象的方法和属性的封装,实现了代码的复用。多态和继承能灵活的实现更多功能。
* 有了面向对象编程,程序可以以类,对象为单元设计模块,实现模块化,分层编程,这样每个模块的更改,不会影响另一个模块/类。
* 消息/数据在对象中进行传递。

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