匿名类和匿名对象的实现过程
匿名对象是没有名称的对象,而匿名类则是没有类名的类,使用于一次性的创建于应用,总是与new配套使用。
匿名类有三种应用场景:1.匿名类可以有构造方法 2.匿名类可以继承其他类 3.可以在类中嵌套匿名类
class Hero
{
private $name = '杨过';
public function story($name){
return $this->name.'喜欢上了<span style="color:red">'.$name.'</span>';
}
}
//有3中访问方式
//1.对象
$hero = new Hero();
echo $hero->story('小龙女'),'<br>';
//2.匿名对象
echo (new Hero())->story('郭襄'),'<br>';
//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('jack'){
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function story($name){
return $this->name.'喜欢'.$name;
}
})->story('rose'),'<hr>';
//2.匿名类中可以继承其他类
class KongFu
{
protected $skill; //招数
public function __construct($art)
{
$this->skill = $art;
}
public function show()
{
return $this->skill? : '如来神掌';
}
}
echo (new class('老顽童','弹指神功') extends KongFu {
private $name;
//匿名类中构造方法
public function __construct($name,$art)
{
parent::__construct($art);//调用父类构造器
$this->name = $name;
}
public function story($food)
{
return $this->name.'喜欢'.$food;
}
public function show()
{
return $this->name.'的绝招是:'.$this->skill; // TODO: Change the autogenerated stub
}
} )->show(),'<hr>';
//3.可以在类中嵌套匿名类
class Animal //宿主类,父类
{
public $name = '狗';
protected $color = '灰色';
private $type = '哈士奇';
public function demo1()
{
return (new class($this->type) extends Animal {
private $type;
//用构造方法 初始化传参获取父类私有属性、
public function __construct($type)
{
$this->type = $type;
}
public function show()
{
return '动物名称:'.$this->name.'<br>'.
'动物颜色:'.$this->color.'<br>'.
'动物品 种:'.$this->type;
}
public function demo2()
{
return '我是嵌套匿名类中的方法:'.__METHOD__;
}
});
}
}
echo (new Animal())->demo1()->demo2();
echo '<hr>';
echo (new Animal())->demo1()->show();点击 "运行实例" 按钮查看在线实例
trait 类的声明与工作原理
trait 特性类
1.php只能单继承,trait 可以多继承,使用use来引入trait类
2.trait是代码复用机制(函数,类的继承)
3.trait 类不能实例化
4.trait 类相当于方法集
trait 类位于 Person 与 Student之间,比父类优先
实例
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 $friend = '小安';
public function study($name='打羽毛球')
{
return $this->name.'和'.$this->friend.$name;
}
}
trait Recreation
{
public $friends = '小强';
public function study($name='打篮球')
{
return $this->name.'和'.$this->friends.$name;
}
}
//trait类用use来引入类中,可以引入多个,可以使用trait类中的属性和方法
class student extends Person
{
use Course, Recreation{
Course::study insteadof Recreation;//使用Course中的study方法
Recreation::study as sport;//起别名
}
}
$student = new student();
// trait 类位于 Person 与 Student之间,比父类优先
echo $student->study(),'<hr>';
echo $student->sport(),'<hr>';
var_dump($student);点击 "运行实例" 按钮查看在线实例
3.类的自动加载写法
使用函数spl_autoload_register()可以实现类的自动加载,方便引入大量的类。代码如下:
//自动加载 注册
spl_autoload_register(function ($className){
require './class/'.$className.'.php';
});
echo Demo1::CLASS_NAME,'<hr>';
echo Demo2::CLASS_NAME;点击 "运行实例" 按钮查看在线实例
4.对象的序列化与反序列化
对象的序列化可以把对象的属性转为字符串保存起来,方便数据的保存于传输
而对象的反序列化则是把字符串还原成之前的对象。
序列化只保存类中的属性,不保存方法,只保存类名,不保存对象名
序列化使用函数serialize(),而反序列化则是unserialize()
class Db1
{
public $db = null;
public $host;
public $user;
public $pass;
public function __construct($host='localhost',$user='root',$pass='root')
{
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
//创建好对象就连接上数据库
$this->connect();
}
public function connect()
{
$this->db = new mysqli($this->host,$this->user,$this->pass);
}
//序列化自动调用
public function __sleep()
{
return ['host','user','pass'] ;// TODO: Implement __sleep() method.
}
public function __wakeup()
{
$this->connect(); // TODO: Implement __wakeup() method.
}
}
$db_con = new Db1();
//对象序列序列化特点
//只保存类中的属性,不保存方法,只保存类名,不保存对象名
$tmp = serialize($db_con);
var_dump($tmp);
var_dump($db_con->db);
var_dump(unserialize($tmp));点击 "运行实例" 按钮查看在线实例
5.面向对象的编程理解
个人认为面向对象的编程使得代码更加简洁,有效减少代码的复用,封装的程度更高。代码的可读性和维护性更加好了,更加适合实际的编程开发。而且面向对象的编程更加贴合实际生活,使得开发的逻辑更加明显。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号