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

作业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()); //调用别的类的方法;

运行实例 »

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

代码结构截图:

758b035348a5a3b1398e748fb4ef1454.png

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

* 面向对象是针对面向过程而言的,在面向过程编程时候,我们需要个功能直接用函数实现即可,但是面向对象编程,我们需要个对象

* 然后驱动对象的方法去完成,而对象的母版--类更好的实现了对象的方法和属性的封装,实现了代码的复用。多态和继承能灵活的实现更多功能。

* 有了面向对象编程,程序可以以类,对象为单元设计模块,实现模块化,分层编程,这样每个模块的更改,不会影响另一个模块/类。

* 消息/数据在对象中进行传递。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值