博客列表 >匿名对象与匿名类的实现过程和Trait类的声明与工作原理类的自动加载函数的写法以及对象的序列化与反序列化的原理与应用

匿名对象与匿名类的实现过程和Trait类的声明与工作原理类的自动加载函数的写法以及对象的序列化与反序列化的原理与应用

coolperJie
coolperJie原创
2018年09月06日 21:39:26657浏览

1、以下代码主要介绍了匿名对象和匿名类的使用方法以及匿名类的三种使用场景:

<?php
header("content-type:text/html; charset=utf8");
/*
*匿名类
*1.php7.0+才支持
*2.匿名类类似于匿名函数
*3.匿名类适合于一次性的创建与引用
*4.匿名类总是于new一并用
*/
class BadPerson{
 private $name = '西门大官人';
 public function story($name)
 {
  return $this->name.'喜欢上了:<span style="color:red">'.$name.'</span>';
 }
}
//有三种方式访问story()
//1.对象
$badPerson = new BadPerson();
echo $badPerson->story('金莲妹妹').'<hr>';
//2.匿名对象
echo (new BadPerson())->story('绿茶妹妹').'<hr>';
//3.匿名类
echo (new class {
 private $name = '西门大官人';
 public function story($name)
 {
  return $this->name.'喜欢上了:<span style="color:red">'.$name.'</span>';
 }
})->story('神仙姐姐').'<hr>';

//匿名类的三种使用场景
//1.匿名类中可以使用构造方法
echo (new class ('欧阳克'){
 private $name;
 //匿名类中的构造方法
 public function __construct($name){
   $this->name = $name;
 }
 public function story($name)
    {
        return $this->name.'喜欢上了: <span style="color:red">'.$name.'</span>';
    }
})->story('黄蓉').'<hr>';
//2.在匿名类中可以继承其他类中的成员
class Kuhgfu{
 protected $skill; //技能
 public function __construct($art=''){
  $this->skill = $art;
 }
 public function show()
 {
  return $this->skill ? : '排山倒海';
 }
}
echo (new class ('西门庆','葵花点穴手') extends Kuhgfu{
 private $name ;
 //匿名类中的构造方法
 public function __construct($art='',$name)
 {
  parent::__construct($art);
  $this->name = $name;
 }
 public function story($name)
    {
        return $this->name.'喜欢上了: <span style="color:red">'.$name.'</span>';
    }
    public function show()
    {
        return $this->name.'的绝招是: '.'<span style="color:red">'.parent::show().'</span>';
    }
})->show().'<hr>';
//3.可以在类中嵌套一个匿名类
class Animal { //宿主类,扮演父类的角色
 public $name = '狗';
 protected $color ='黑色';
 private $type = '哈士奇';
 protected function info()
 {
  return '售价3000元';
 }
 public function demo1()
 {
  //宿主类中的私有成员不能在匿名类中直接使用
  //可以通过在匿名类中创建一个构造方法将宿主类中的成员进行注入
  //将宿主类中的私有成员属性作为匿名类中的构造方法的参数传入即可
  return (new class ($this->type) extends Animal {
   //1.在匿名类中创建一个属性用来接受宿主的私有属性
   private $type;
   //2.创建一个构造方法
   public function __construct($type){
    $this->type = $type;
   }
   public function demo2(){
    return '我是嵌套匿名类中的方法'.__METHOD__;
   }
   public function show(){
    return '动物的名称是:'.$this->name.'<br>'.
    '动物的颜色是:'.$this->color.'<br>'.
    '动物的种类是:'.$this->type.'<br>';
   }
  });
 }
}
//访问匿名类中的 demo2()
echo (new Animal())->demo1()->demo2();
echo '<hr>';
echo (new Animal())->demo1()->show();

说明:以上代码主要介绍了匿名对象及匿名类的使用方法及场景,匿名类只能在php7.0之后的版本中才可以使用,其中匿名类的三种使用场景主要有:1.匿名类中可以使用构造方法;2.在匿名类中可以继承其他类中的成员;3.匿名类可以在类中嵌套一个匿名类,其原理是:通过在匿名类中创建一个构造方法将宿主类中的成员进行注入,将宿主类中的私有成员属性作为匿名类中的构造方法的参数传入即可。

2、以下代码主要介绍了Trait类技术:

<?php
header("content-type:text/html; charset=utf8");
/**
*
*Triat 是什么东西?
*1.php 只能实现单继承,trait打破了限制
*2.trait 是代码复用机制(函数,类的继承)
*3.trait 使用类的语法,但不是类,所以不能实例化
*4.trait 
*
**/
if (!class_exists('Person')){
 class Person {
  protected $name;
  public function __construct($name = '小明'){
   $this->name =$name;
  }
  public function study($course='php'){
   return $this->name.'在学习:'.$course;
  } 
 }
}
//创建一个trait 特性类
trait Course
{
 public $frient = '小红';
 public function study($name='踢足球'){
  return $this->name.'在学习'.$name;
 }
}
trait Recreation {
 public $friend = '小军';
 public function study($name='打篮球'){
  return $this->name.'和'.$this->friend.$name;
 }
}
//问题1:父类Person 与 trait类Course之间的关系?
//trait类位于Person与Student类之间
class Student extends Person
{
 // use Course;//导入了一个trait类
 // use Recreation;
 use Course, Recreation {
  Course::study insteadof Recreation;
  Recreation::study as MySport;
 }
}
$student = new Student();
echo $student->study().'<hr>';
echo $student->MySport().'<hr>';
 
 
?>

说明:Trait类在php中的使用是非常重要的,它打破了php中类的单继承的限制,可以使用Trait类实现代码复用机制,它使用类的语法,但不是类,所以不能实例化。

3、以下代码主要介绍了类的自动加函数的使用方法:

<?php
header("content-type:text/html; charset=utf8");
/**
*
*类的自动加载
*
**/

// require './class/Demo1.php';
// require './class/Demo2.php';
spl_autoload_register(function($className){
require './class/'.$className.'.php';
//存在命名空间的情况下
// $className = str_replace("\\","/", $className);
// require './class/'.$className.'.php';
});
 
echo Demo1::CLASS_NAME.'<hr>';
echo Demo2::CLASS_NAME.'<hr>';
?>

说明:类的自动加载主要是用spl_autoload_register()函数结合匿名方法得到类名,再通过拼接路径得到此类的存在路径从而实现类的自动加载;

4、以下代码主要介绍了对象的序列化和反序列化的实现方法及使用的对应的函数:

<?php
/*
*序列化&反序列化
*
*/
$num = 300;
echo serialize($num),'<hr>';
$name = 'coolper';
echo serialize($name),'<hr>';
$course = ['php','javascripr','html'];
echo serialize($course),'<hr>';

class Db
{
 //连接数据库与返回值
 public $db = null;
 public $host;
 public $user;
 public $pass;
 //构造方法
 public function __construct($host='127.0.0.1',$user='root',$pass='root'){
  $this->host = $host;
  $this->user = $user;
  $this->pass = $pass;
  //确保实例化对象的时候能自动连接数据库
  $this->connect();
 }
 private function connect()
 {
  $this->db=mysqli_connect($this->host,$this->user,$this->pass);
 }
 //对象序列化的时候自动调用
 public function __sleep()
 {
  return ['host','user','pass'];
 }
 //反序列化:
 public function __wakeup()
 {
  $this->connect();
 }
}
 $obj = new Db();
 /**
 *对象序列化
 *1.只保存对象中的属性,不保存方法
 *2.只保存类名,不保存对象名
 **/
 echo serialize($obj),'<br>';
 $tmp = serialize($obj);
 @var_dump(unserialize($tmp));
?>

说明:以上代码介绍了对象的序列化和反序列话,其中对象序列化使用的函数为serialize(),自动调用类中的sleep()方法将对象转化为字符串保存下来,而对象的反序列化则使用unserialize(),自动调用类中的wakeuo()方法将转化为字符串的对象重新转化为对象,其中sleep()函数中的返回值限制序列化的对象。

总结:对面向对象编程的基本理解:

        我的理解就是面向对象同一类的事物总结起来,然后把相同的属性进行统一管理,实现代码高效,规范和重用的目的,复就是把面向对象的三大特征就是封装,继承和多态,封装就是把一些重要的信息给封闭起来不是谁都可以随便访问,达到了重要信息保护的作用,三种范围限制符private、protected、public;继承则是将一类事物共有的属性和行为抽象成一个父类,每一个子类是一个特殊的父类--有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性;多态是面向对象的升华,多态允许父类指向子类的对象,使代码更加的灵活,功能更加的强大,面向对象是编程的重要思想,其中包括的知识点,例如对象的实例化,类的构造方法、接口,抽象,系统方法,静态函数等等都是需要建立在这一重要的思想上。

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