1、编程: 匿名对象与匿名类的实现过程;
实例
<?php /*编程: 匿名对象与匿名类的实现过程;*/ class Animal{ public $name='dog'; protected $color='green'; private $type='哈士奇'; protected function info(){ return 'Thanks.'; } public function demo1(){ return (new class($this->type)extends Animal{ private $type; public function __construct($type) { $this->type=$type; } public function demo2(){ return 'I am method:'.__METHOD__.'<br>'; } }); } } echo (new Animal())->demo1()->demo2();
运行实例 »
点击 "运行实例" 按钮查看在线实例
2、编程: Trait类的声明与工作原理;
实例
<?php /** * Trait 是什么东西? * 1. php 只能实现单继承,trait打破了限制 * 2. trait 是代码复用机制(函数, 类的继承) * 3. trait 使的类的语法,但不是类,所以不能实例化 * 4. triat 相当于方法集 */ if(!class_exists('Person')){ class Person{ protected $name; public function __construct($name='颜回') { $this->name=$name; } public function study($course='礼教'){ return $this->name.'学习'.$course.'<br>'; } } } trait friend1{ public $friend1='子贡'; public function study($course = '春秋'){ return $this->name . '学习' . $course . '<br>'; } } trait friend2 { public $friend2 = '子路'; public function study($course = '德行') { return $this->name . '学习' . $course . '<br>'; } } //父类Person与trait类之间的关系 //trait位于Person与Student之间 class Student extends Person{ use friend1,friend2{ friend1::study insteadof friend2; friend2::study as MySport; } } $student=new Student(); echo $student->study(); echo $student->MySport();
运行实例 »
点击 "运行实例" 按钮查看在线实例
3、 编程: 类的自动加载函数的写法;
实例
<?php spl_autoload_register( function ($className){ require './class/'.$className.'.php'; }); echo Demo1::COMMON_NAME; echo Demo2::COMMON_NAME;
运行实例 »
点击 "运行实例" 按钮查看在线实例
4、编程: 对象的序列化与反序列化的原理与应用;
实例
<?php class Db{ public $Db=null; public $host; public $user; public $pass; //构造方法 public function __construct($host = '127.0.0.1', $user = 'root', $pass = 'root123') { $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(); } } /** * 对象序列化的特点: * 1. 只保存对象中的属性,不保存方法 * 2. 只保存类名,不保存对象名 */ $obj= new db(); $serObj= serialize($obj); echo $serObj,'<hr>'; var_dump(unserialize($serObj));
运行实例 »
点击 "运行实例" 按钮查看在线实例
5、问答:谈谈你对面向对象编程的基本理解
引自网络:面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息。
面向对象有三大特性,封装、继承和多态。
封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这样做使得代码的复用性更高。
继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类--有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性。
如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。多态的一大作用就是为了解耦--为了解除父子类继承的耦合度。如果说继承中父子类的关系式IS-A的关系,那么接口和实现类之之间的关系式HAS-A。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。
总结一下,如果说封装和继承是面向对象的基础,那么多态则是面向对象最精髓的理论。掌握多态必先了解接口,只有充分理解接口才能更好的应用多态。