作业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()); //调用别的类的方法;
运行实例 »
点击 "运行实例" 按钮查看在线实例
代码结构截图:
作业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:谈谈你对面向对象编程的基本理解
* 面向对象是针对面向过程而言的,在面向过程编程时候,我们需要个功能直接用函数实现即可,但是面向对象编程,我们需要个对象
* 然后驱动对象的方法去完成,而对象的母版--类更好的实现了对象的方法和属性的封装,实现了代码的复用。多态和继承能灵活的实现更多功能。
* 有了面向对象编程,程序可以以类,对象为单元设计模块,实现模块化,分层编程,这样每个模块的更改,不会影响另一个模块/类。
* 消息/数据在对象中进行传递。