作业1:匿名对象与匿名类的实现过程;
实例
/**
匿名类就是没名字的类,与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类的声明与工作原理;
实例
/**
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 文件, 这会带来一个烦恼:每个脚本的开头,都需要包含(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:对象的序列化与反序列化的原理与应用
实例
/**
序列话和反序列化
*
* 在对象的序列化后,得到的是字节流,利于在网络上传输。反序列化,可以拿到序列化后的数据,还原为一个对象。
*/
//整数序列化
$i = 100;
echo serialize($i).'
';
//字符串序列化
$str = 'serialize';
echo serialize($str).'
';
// boolean 序列化
echo serialize(false).'
';
// array 序列化
$arr = ['name'=>'peter','sex'=>'female'];
echo serialize($arr).'
';
// 资源类型不可序列化,因为是引用的资源。
//对象的序列化和反序列化
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),'
';
//对象序列化:只保存对象中的属性,不保存方法;只保存类名,不保存对象名
var_dump(unserialize(serialize($db)));//反序列化
运行实例 »
点击 "运行实例" 按钮查看在线实例
作业5:谈谈你对面向对象编程的基本理解
* 面向对象是针对面向过程而言的,在面向过程编程时候,我们需要个功能直接用函数实现即可,但是面向对象编程,我们需要个对象
* 然后驱动对象的方法去完成,而对象的母版--类更好的实现了对象的方法和属性的封装,实现了代码的复用。多态和继承能灵活的实现更多功能。
* 有了面向对象编程,程序可以以类,对象为单元设计模块,实现模块化,分层编程,这样每个模块的更改,不会影响另一个模块/类。
* 消息/数据在对象中进行传递。