Blogger Information
Blog 34
fans 0
comment 1
visits 23369
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0905作业:匿名对象/trait/类的自动加载/abstract/serialize
Samoye
Original
807 people have browsed it

作业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:谈谈你对面向对象编程的基本理解

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

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post