Blogger Information
Blog 22
fans 0
comment 0
visits 18093
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
【9/5】---匿名对象以及匿名类的实现;对象的序列化反序列化;Trait类的多继承和类的自动加载
花弄的博客
Original
771 people have browsed it

实例

<?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()方法分别是对应着序列化和反序列化的操作.

Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments