回顾面向过程
执行顺序:代码从上往下执行
特点:1.简单 2.性能高一些,执行速度快 3.代码多繁琐
面向对象 OOP
OOP: Object Oriented Programming 面向对象编程
OOA: Object Oriented Analysis 面向对象分析方法
OOD: Object Oriented Design 面向对象设计
面向对象包括(类和对象)
类: 对一组对象的定义,例如:人类,动物类。
对象: 所有具体的事物都是一个对象,包括自然界真实存在的一个具体的东西,也包括不存在的,例如:我的笔记本(单纯的笔记本还算是一个类,需要具体到是哪一个笔记本)、我的电脑。
面向对象:面向具体的事物就是面向对象。
面向对象特点/优势
1.执行效率低,相比较面向过程的代码而言
2.能更好的管理组织我们的代码(代码多,但不乱),可读性高。
3.代码能够更好的复用
4.结构很清晰
5.使用起来非常简单,写的时候很痛苦。
类的定义
1.通过class关键词声明一个类
2.命名规范:
①字母/数字/下划线;
②首字母大写;
③数字不能开头;
④不区分大小写但要严格注意大小写。
3.类名后面不加括号(),这不是函数。
<?php
class Person{
#code
}
【注意】
1.类定义完成之后,如果不实例化,是没有意义的,没有任何作用。
2.函数也是这样,只定义不使用没有意义。
【命名驼峰原则】
大驼峰:所有单词首字母大写,例如:WuYaLun
小驼峰:首字母小写,其他的单词首字母都大写,例如 wuYaLun
成员属性
【注】类的成员属性是静态的,例如人类的 姓名/身高/体重。
1.可以使用public来定义,可以不加,默认是public。
2.跟变量是一样的,用$来定义,可以有默认值,遵循小驼峰命名法。
成员方法
【注】类的成员方法是动态的,例如人类的说话/跑步/吃饭。
1.可以使用public来定义,可以不加,默认是public。
2.跟函数差不多,以小驼峰命名法来命名,不能以数字开头/支持下划线,严格区分大小写。
3.可以有形参,形参可以有默认值。
4.可以有返回值。
5.跟普通函数不一样的,不能直接使用,必须存在于类中,是属于类的成员方法。
<?php
/**
* Person 类
*/
class Person
{
//成员属性
public $mouth;
public $nose = 'big';
public $hair = 'long';
public $height = 180;
//成员方法
public function treeNewBee ()
{
echo '我年薪20W';
}
public function cheDan($str = '没什么好扯的')
{
echo $str;
}
public function makeChild($who = '爱谁谁')
{
echo '和'.$who.'生孩子<br />';
}
}
//类的实例化(使用一个新的对象)
$wyl = new Person();
//调用对象的一个成员属性nose
echo $wyl->nose;
//调用对象的一个成员属性hair
echo $wyl->hair;
//调用对象的一个成员方法
echo $wyl->makeChild();
【注意事项】
即使是在同一个类中实例化一个类,但对象仍然是唯一的。相等== 但不全等===
// 注意每实例化一个类/创建一个对象,对象都是唯一的。
$a = new Person();
$b = new Person();
// $a 和 $b 相等== 但不全等===
类的使用及成员方法/成员属性的调用
1.类的使用(实例化一个类/创建一个对象):new关键词
2.调用成员属性:$var->成员属性名
3.调用成员方法:$var->成员方法名()
<?php
// 定义了一个类
class Person{
public $name='wyl';
public function say()
{
echo 'I can say';
}
}
// 使用这个类:实例化一个对象
$wyl = new Person();
// 调用成员属性,并用echo打印出来
echo $wyl->$name;
// 调用成员方法
$wyl->say();
$this关键词
在类的内部通过成员方法来调用类的成员属性时,需要用$this关键词,this是指当前对象。
构造方法__construct()
个数:0~+∞个
参数:0~+∞个
//当实例化一个类的时候,率先执行构造方法__construct
class Person{
public function __construct()
{
#code
}
}
1.构造方法是php类里面魔术方法的一种
2.他是一个php关键词
3.他在new一个对象的时候会被自动调用,即new之后率先执行构造方法
4.利用该特点,完成对象成员属性的值的初始化,来满足不同的对象在被new出来之后就有不同的值。
【测试1】当实例化对象的时候,率先执行构造方法__construct
<?php
class Person
{
//成员属性
public $name = 'wyl';
// 构造方法
public function __construct()
{
$this->name = 'alen';
}
// Person类中的say方法
public function say()
{
echo $this->name;
}
}
// 实例化一个类/创建一个对象
$wyl = new Person();
// 调用Person中的say方法
$wyl->say();
【输出结果】
alen
【结果分析】
构造方法__construct()是修改了成员属性name的值;say方法是输出了成员属性name的值。
由输出结果可知,先执行了__construct()构造方法将name的值变为了'alen',然后say方法输出。
若先执行say方法,则输出应为'wyl'
析构方法__destruct()
个数:0~1个
参数:0个
当一个对象被销/程序执行结束的时候,对象会被自动回收,最鲜明的表现是:如果类里面设置了析构方法,那么会在销毁的时候执行。
class Person{
public function __destruct()
{
#code
}
}
【原理】当整个程序快结束之前,迅速销毁内存,内存被销毁了之后就开始执行构造方法。
【应用场景】数据库关闭/关闭Word时提示保存的对话框/GD库的关闭
【注】先构造的后析构。【像入栈堆栈一样】
【测试1】验证:先构造的后析构。
<?php
class Person
{
//成员属性
public $name;
// 构造方法
public function __construct($name)
{
echo '我的名字叫'.($this->name = $name).'<br />';
}
// 析构方法
public function __destruct()
{
echo '再见'.($this->name).'<br />';
}
}
// 实例化第一个对象
$wyl = new Person('1');
// 实例化第二个对象
$pig = new Person('2');
【输出结果】
我的名字叫1
我的名字叫2
再见2
再见1
【结果分析】
实例化第一个对象$wyl时,自动触发__construct,对name赋值为1;实例化第二个对象$pig时,自动触发__construct,对name赋值为2;当实例化都完成了,程序要结束运行之前,触发__destruct。此时,后构造的对象$pig率先触发__destruct,输出'再见2',然后先构造的对象$wyl再触发__destruct,输出'再见1'。
【测试2】验证:有多个类时,是否依然遵循“先构造的后析构”。
<?php
class Person
{
//成员属性
public $name;
// 构造方法
public function __construct($name)
{
echo '我的名字叫'.($this->name = $name).'<br />';
}
// 析构方法
public function __destruct()
{
echo '再见'.($this->name).'<br />';
}
}
// 实例化第一个对象
$wyl = new Person('1');
// 实例化第二个对象
$pig = new Person('2');
class Animal
{
//成员属性
public $name;
// 构造方法
public function __construct($name)
{
echo '我的名字叫'.($this->name = $name).'<br />';
}
// 析构方法
public function __destruct()
{
echo '再见'.($this->name).'<br />';
}
}
// 实例化第一个对象
$wyl1 = new Animal('3');
// 实例化第二个对象
$pig1 = new Animal('4');
【输出结果】
我的名字叫1
我的名字叫2
我的名字叫3
我的名字叫4
再见4
再见3
再见2
再见1
【结果分析】
构造顺序:第1个类的第1个实例化==》第1个类的第2个实例化==》第2个类的第1个实例化==》第2个类的第2个实例化
析构顺序:第2个类的第2个实例化==》第2个类的第1个实例化==》第1个类的第2个实例化==》第1个类的第1个实例化
面向对象的三大目标
1.封装:把一些功能通过类给组织起来,然后方便的进行调用
2.继承:跟继承遗产一样。
3.多态:PHP里面没有很明确的多态的表现(例如C+ 成员方法可以重名,通过参数不同来判断不同的成员方法)。