博客列表 >【9/5】---匿名对象以及匿名类的实现;对象的序列化反序列化;Trait类的多继承和类的自动加载

【9/5】---匿名对象以及匿名类的实现;对象的序列化反序列化;Trait类的多继承和类的自动加载

花弄的博客
花弄的博客原创
2018年09月12日 15:42:27772浏览

实例

<?php

/**
 * 匿名类,php7.0+支持
 * 类似匿名函数,即没有名称的类
 * 匿名类适用于一次性的创建与使用
 * 匿名类总是与:new关键字配套使用
 */

class Test_Susu{
	private $name = '涂山苏苏';
	public function story($position,$color)
	{
		return $this->name.'成为了 : <span style="color:'.$color.'">'.$position.'</span>'; 
	}
}

//访问类方法的三种方式:
//1.对象
$susu = new Test_Susu();
echo $susu -> story('实习小红娘','pink'),'<p>';

//2.匿名对象	
echo (new Test_Susu()) -> story('初级小红娘','lightblue'),'<p>';

//3.匿名类
echo (new class ('涂山雅雅'){
	private $name;
	public function __construct($name)
	{
		$this ->name = $name;
	}

	public function story($position,$color)
	{
		return $this->name.'成为了 : <span style="color:'.$color.'">'.$position.'</span>'; 
	}
})->story('涂山苏苏','purple'),'<p><hr>';


//匿名类的三种应用场景
//1.匿名类中可以使用构造函数	
echo '匿名类的三种应用场景:1<p>';
echo (new class ('涂山苏苏'){
	private $name;
	public function __construct($name)
	{
		$this ->name = $name;
	}

	public function story($position,$color)
	{
		return $this->name.'成为了 : <span style="color:'.$color.'">'.$position.'</span>'; 
	}
})->story('正式小红娘','green');

//2.在匿名类中可以继承其他类中的成员
echo '<p>匿名类的三种应用场景:2<p>';

/**
 * test_poetry
 */
class poetry
{
	protected $poetry;		//诗
	//构造方法初始化
	public function __construct($ci)
	{
		$this ->poetry = $ci;
	}
	public function show($color)
	{
		return $this->poetry ? :'<span style="color:'.$color.'">一夜风呜花飘雨,两指竹哀箫弄魂</span>';
	}
}

//匿名类继承
echo (new class('涂山苏苏','呐,牵手吧,幸福') extends poetry{
	private $name;
	//匿名类的构造初始化
	public function __construct($name,$ci='')
	{
		parent::__construct($ci);
		$this ->name = $name;
	}

	public function story($position,$color)
	{
		return $this->name.'成为了 : <span style="color:'.$color.'">'.$position.'</span>'; 
	}

	public function show($color)
	{
		return $this->name . '的个性签名是 : <span style="color:'.$color.'">'.parent::show($color).'</span>';
	}
})->show('purple');

echo '<p>匿名类的三种应用场景:2<p>';
//3.可以在匿名类中声明嵌套一个匿名类
class Animal
{

	private $name = '狗子';
	private $color = '奶白';
	private $type = '金毛';


	protected function info()
	{
		return '市 场售价1500元';
	}

	public function nesting()
	{
		//宿主类的私有成员不可以在匿名类中直接使用
		//可以在匿名方法中创建一个构造方法将宿主类的私有成员注入
		//将宿主类中的私有属性作为匿名类中的构造方法的参数传入即可
		return (new class($this->type,$this->name,$this->color) extends Animal{
			//在匿名类中穿件一个私有属性来接收宿主类传来的值
			private $type;
			private $name;
			private $color;
			//构造初始化(接收传值)
			public function __construct($type,$name,$color)
			{
				$this->type = $type;
				$this->name = $name;
				$this->color = $color;
			}

			public function nesting_Meth()
			{
				return '我是嵌套匿名类中的方法 : ' . __METHOD__;
			}

			public function show()
			{
				return '动物的名称是 : ' . $this->name.'<br>'.
					   '动物的品 种是 : ' . $this->type.'<br>'.
					   '动物的颜色是 : ' . $this->color.'<br>';
			} 
		});		
	}
}
//访问匿名类中的方法
echo (new Animal())->nesting()->nesting_Meth().'<br><hr>';
echo (new Animal())->nesting()->show();

运行实例 »

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

实际上也就是去掉类关键字以及类的声明,直接new一个新的类的对象出现,虽然看起会有点绕,但是实际上会省很多力气,不用专门去定义一个类来做某件临时性的逻辑处理:

annoyclass.jpg

实例

<?php
/**
 * Trait,打破了PHP本身只能单继承的限制
 * 是代码复用机制的体现
 * 使用类的语法,但是不是类,无法实例化
 * 总体理解为一个方法集
 */

//语法规范
if(!class_exists('Person'))
{
	/**
	 * Person
	 * 测试Trait
	 */
	class Person 
	{
		protected $name;
		//构造初始化
		public function __construct($name = '涂山苏苏')
		{
			$this->name = $name;
		}
		public function study($course='PHP')
		{
			return $this->name . '在练习 : ' . $course;
		}

	}
}

//创建一个trait 特性类
trait course
{
	public $friend = '绿谷出久';
	public function study($act='踢足球')
	{
		return $this->friend.'在学习'.$act;
	}
}

trait recreation
{
	// public $friend = '蛙吹梅雨';
	public function study($do='练习绝招')
	{
		return $this->name.'和'.$this->friend.$do;
	}
}

class Student extends Person
{
	//导入trait类
	use course,recreation{
		course::study insteadof recreation;
		recreation::study as mysport;
	}
}

$stu = new Student();
echo $stu->study(),'<br>';
echo $stu->mysport();

运行实例 »

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

Trait类就是打破了其他类智能单继承的限制,它位于父类与子类之间,可以改用别用来调用其他类的同名方法


include和require确实方便,但是对于类多了之后,尤其是命名空间之后,就会显得异常繁琐.所以出现了有类的自动加载.两行代码.轻松解决

实例

spl_autoload_register(function($class_name){
	require $class_name . '.php';
});
	
echo PHP_Task10_chain_sel::CLASS_NAME;

运行实例 »

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

spl_autoload_register函数是自动将函数注册到该脚本的队列中,通过匿名函数来加载类名


在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。但是在序列化对象时,并不会的常量

实例

<?php

/**
 *对象序列化
 */

class dbconn
{
	//连接参数与返回值
	public $db = null;
	public $host;
	public $user;
	public $pwd;

	//构造初始化
	public function __construct($host = '127.0.0.1',$user = 'root',$pwd = 'root')
	{
		$this->host = $host;
		$this->user = $user;
		$this->pwd = $pwd;
		//确保实例化对象的能自动连上数据库
		$this->connect();
	}

	//数据库连接
	public function connect()
	{
		$this->db=mysqli_connect($this->host,$this->user,$this->pwd);
	}

	//对象序列化的时候自动调用
	public function __sleep()
	{
		return ['host','user','pwd'];
	}

	//反序列化
	public function __wakeup()
	{
		$this->connect();
	}

}

$obj = new dbconn();

/**
 * 对象序列化:
 * 1.只保存属性,不保存方法
 * 2.只保存类名,不保存对象名
 */

echo serialize($obj),'<hr>';
$tmp = serialize($obj);
var_dump($tmp);

运行实例 »

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

在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。__sleep()和__wakeup()方法分别是对应着序列化和反序列化的操作.

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