匿名类和匿名对象的实现过程
匿名对象是没有名称的对象,而匿名类则是没有类名的类,使用于一次性的创建于应用,总是与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.面向对象的编程理解
个人认为面向对象的编程使得代码更加简洁,有效减少代码的复用,封装的程度更高。代码的可读性和维护性更加好了,更加适合实际的编程开发。而且面向对象的编程更加贴合实际生活,使得开发的逻辑更加明显。