<?php /** * 匿名类 * 1.PHP7.0+ 才支持 * 2.没有类名,类似匿名函数 * 3.匿名类适用于一次性创建与引用的环境 * 4.匿名类总是于 new配套使用,因为没有名称,创建就需要实例化 * */ class Eat_Fruit{ private $name = '小皮'; public function like($name) { return $this->name.'喜欢吃'.$name; } } //1.普通对象想访问 $fruit = new Eat_Fruit(); echo $fruit->like('苹果'),'<br>'; //2.匿名对象 echo (new Eat_Fruit())->like('香蕉').'<br>'; //3.匿名类 echo (new class(){private $name = '小皮'; public function like($name) { return $this->name.'喜欢吃'.$name; }})->like('桃子'),'<hr>'; // 匿名类的三种应用场景 //1. 匿名类中可以使用构造方法 echo (new class('小天'){ private $name = '小皮'; public function __construct($name) { $this->name = $name; } public function like($name) { return $this->name.'喜欢吃'.$name; } })->like('西瓜'); //2.在匿名类中可以继承其他类中的成员 class Vegetables{ private $name;//蔬菜名 public function __construct($name) { $this->name = $name; } public function show() { return $this->name ? :'土豆'; } } echo '<hr>'; echo (new class('小红','番茄') extends Vegetables{ private $like; private $name; public function __construct($like,$name='') { parent::__construct($name); $this->like = $like; } public function show() { return $this->like.'喜欢吃'.parent::show(); } })->show(); echo '<hr>'; //3.可以在类声明中嵌套一个匿名类 class Car { public $name='BMW'; protected $color = 'white'; private $price=500000; public function info(){ return $this->color.'的'.$this->name.'价格是'.$this->price; } public function demo1(){ return (new class($this->price) extends Car{ private $price; public function demo2(){ return __METHOD__; } //2. 创建一个构造方法 获取宿主类的私有属性$price public function __construct($price) { $this->price = $price; } public function show(){ return $this->color.'的'.$this->name.'价格是:'.$this->price; } }); } } echo(new Car())->demo1()->demo2().'<br>'; echo(new Car())->demo1()->show();
点击 "运行实例" 按钮查看在线实例
<?php /** * Trait 是什么 * 1. trait打破了PHP 只能实现单继承的问题 * 2.trait 是代码复用机制(函数,类的继承) * 3.trait 使用类的语法,但不是类,所以不能实例化,只能引用 用use来导入trait类 * 4.trait 相当于方法集 */ if(!class_exists('People')){ class People { protected $name; public function __construct($name='小飞') { $this->name = $name; } public function like($fruit='apple') { return $this->name .'喜欢吃'.$fruit; } } } //创建一个trait 类 trait Course { public $friend_name = '小海'; public function study($name='弹吉他') { return $this->name.'在学习'.$name; } } trait Recreation { public $friend = '小天'; public function study($name='下棋') { return $this->name.'和'.$this->friend.$name; } } class Show extends People { use Course, Recreation { Course::study insteadof Recreation; Recreation::study AS MyStudy; } // use Course; // use Recreation; } echo (new Show())->like(),'<hr>'; echo (new Show())->study(),'<hr>'; echo (new Show())->MyStudy(),'<hr>'; //echo (new Show())->MyStudy(),'<hr>';
点击 "运行实例" 按钮查看在线实例
<?php /** * 类的自动加载 */ spl_autoload_register(function($className){ // require_once './class/'.类的文件名.'.php'; require_once './class/'.$className.'.php'; //在命名空间中自动加载 // $className = str_replace("\\","/", $className); // require './class/'.$className.'.php'; }); //echo \Demo1\Demo1::CLASS_NAME,'<br>'; //echo \Demo2\Demo2::CLASS_NAME.'<hr>'; echo Demo1::CLASS_NAME,'<br>'; echo Demo2::CLASS_NAME;
点击 "运行实例" 按钮查看在线实例
<?php /** * 对象序列化 * 1.序列化方法 serialize * 2.反序列化 unserialize */ $num = 500; echo serialize($num),'<br>'; $name = 'xiaoxiao'; echo serialize($name),'<hr>'; $course = ['html','php','javascript']; echo serialize($course); class Db { //连接数据库 public $db = null; public $host; public $user; public $pass; public function __construct($host='127.0.0.1',$user='root',$pass='admin') { $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(); } } echo '<hr>'; $obj = new Db(); /** * 对象序列化的特点 * 1.只保存属性,不保存方法 * 2.只保存类名,不只在对象名 * */ echo serialize($obj),'<hr>'; // $tmp = serialize($obj); var_dump(unserialize($tmp)); echo '<hr>'; class fobnn { public $hack_id; private $hack_name; public function __construct($name,$id) { $this->hack_name = $name; $this->hack_id = $id; } public function print() { echo $this->hack_name.PHP_EOL; } public function __sleep() { return ['hack_id','hack_name']; } public function __wakeup() { return $this->hack_name='xxx'; } } $obj = new fobnn('fobnn',1); $obj->print(); $serializedstr = serialize($obj); //通过serialize序列化 echo $serializedstr.'<hr>'; $toobj = unserialize($serializedstr);//通过unserialize反序列化 $toobj->print();
点击 "运行实例" 按钮查看在线实例
5.对面向对象编程的基本理解
面向对象编程可以更充分的让代码实现复用,首先类是一系列相同属性和行为对象的集合,它可以建立很多类模版,我们通过把类实例化成一个个对象进行功能实现。
现实生活中我们所有接触到的东西都是对象,他们都是由类实例化所来,比如苹果\西瓜是水果类,黄瓜\土豆是蔬菜类,而这些对象都有相同的属性和方法。但属性的值和方法参数又不相同,比如热量不同,食用方法不同。比如要实现种果园和蔬菜大棚,把每个对象相同的属性和方法封装成一个模版类进行流水线的工作会快速很多。而我们普通的家用种一棵树长苹果或自己种蔬菜吃就不需要单独去建立类模版,只需要从蔬菜和果园的大类中继承过自己需要的属性和方法就可以实现。
1、什么是类?
具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念。
2、什么是对象?
从类中,拿到的具有具体属性值的个体,称为对象。对象是一个具体的个体。
eg:人类;张三
3、类和对象的关系?
类是对象的抽象化!对象是类的具体化!
类仅仅表明这类对象有哪些属性,但是不能有具体的值,所以类是抽象的。
对象是将类的所有属性赋值后,产生具体的个体,所有对象是具体的。
网络转载参考学习
定义
面向对象的设计是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成“现实世界”的对象。 —— 百度百科
理解
简而言之, 我理解的面向对象就是把具体的问题分割成一个一个的对象实体,各个对象实体分开构建,彼此互不影响(最理想的情况),只需要实现各自的功能并对外界提供接口。
举个栗子,比如司机开车这个场景:
传统的思考方式(面向过程)会以每个动作为粒度,并且一般限定动作的先后顺序,例如: 司机先上车,然后关门,点火,挂挡,踩油门,放离合,最后开走汽车;
而使用面向对象的方法来考虑司机开车,我们会先考虑在这个场景中有哪几个对象实体,然后考虑每个实体需要实现什么功能,例如: 在司机开车场景中,有 汽车、司机 两个对象,汽车对象需要由车门,车轮,发动机,变速箱等构成,并且向外界提供驾驶它的接口(Race方法);司机 也需要有一些必须的特征,比如有驾照、身体健康之类的。然后司机对象调用汽车对象的Race方法来驾驶汽车,在这里,司机和汽车之间是依赖的关系(松耦合),这通常是通过参数传递来实现。
最后总结:
本节课内容比较多,学习了匿名类,Trait类,类的自动加载以及对象的序列化与反序列化,匿名类当作匿名函数来解理,只是用于一次性的调用,Trait类是解决了类只能单个继承问题,类的自动加载可以一次导入N个类,不知道写那么多include或require,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。