合并_03php面向对象基础(4days)笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并_03php面向对象基础(4days)笔记相关的知识,希望对你有一定的参考价值。
面向对象编程思想
编程思想,面向过程,面向对象!
?
例如完成学生报名系统!
?
- 学生报到。
- 学校登记。
- 学生缴费。
- 学校收费。
- 学生选择班级。
- 班级登录学生信息。
?
一个步骤一个步骤的完善即可!
每个步骤是一个函数,通过逐一调用这些函数完成任务!
?
?
分析以上所实现的步骤:
将一个业务逻辑拆分成各个过程,分别实现各个过程,从而达到整个业务逻辑实现的目的!
称之为面向过程,类似于动词的罗列!是最基本的编程方案!
?
?
?
发现:
程序的最终目的,都是要解决真实的业务逻辑!
而且现实的业务逻辑,都是动作的主体在发出动作,而不是动作独立出现的!
?
现在面临的问题:
面向过程的编程方式,将一个罗拆分各个步骤之间组合,弱化了主体概念,主要强调步骤,和动作的概念!
而现实的业务逻辑都是由各个主体支配发生的,主体不可缺少!
?
导致:使用面向过程所编写的程序与真实的业务逻辑,逻辑关系不完全一致!从而使得面向过程的程序,不能完全的描述出真实的业务逻辑!
?
因此,如果希望使用计算机程序语言,更完善的描述去描述真实业务逻辑,明显,应该是计算机语言世界内,所有的动作多应该有主体发出!
上面的思想,就是面向对象的编程思想:是计算机解决问题的方式,尽量于现实的逻辑一致,现实的一个实体(人,物,事),应该映射成计算机语言内的一个对象!最终是计算机能够处理现实世界所有的业务逻辑!
?
因此,如果需要使用面向对象的思想实现以上的报名流程,应该:
- 分析,有哪些实体,参与了该业务逻辑
学校,学生,班级
- 通过计算机语言,实现以上三个实体
得到三个对象!
?
- 为上面的三个对象增加上相应的能力!
?
- 使用对象,调用相应的能力,从而实现业务逻辑!
?
?
面向对象是解决复杂业务逻辑的唯一出路!
?
面向对象的基本操作
基本概念
对象,object,对应现实逻辑中的一个实体,是一个实体在计算机语言的一个表示。是一个数据,与数据的操作的集合体!
属性,property,对象的数据
方法,method,对象的操作
对象怎么来的?通过实例化类而生成!
类,class,使用计算机语言对一类事物的抽象。类似于图纸!用于规定某类对象的结构,但是本身不是具体对象。
实例化,instance,依据类的抽象定义,形成对象的操作,称之为实例化!
?
//昆虫,一个定义,一类动物的抽象的概念!
基本语法
声明类,class
使用关键字 class 即可!
需要指定,该类下的实体(对象),应该有哪些特征,哪些属性,哪些操作!
例如,我们声明一个学生对象,需要先来学生类:
?
数据,称之为属性,property,属于对象(类)的变量。
操作,称之为方法,method,属于对象(类)的函数。
在声明成员时,不能直接使用变量,需要使用关键字来声明
?
实例化类得到对象,new
使用关键字 new 即可
实例化好后,典型的应该保存在变量内:
?
我只需要设计图纸(定义类),不需要参数实力话的过程。
一个类可以被实例化多次!
?
操作对象
?
使用 ->操作符,利用对象,访问其成员!
访问属性
$object->stu_name;
注意,属性名前没有$。
对当前某个对象的属性的操作,只会影响当前对象:
?
访问方法
对象->方法名();
?
?
如何在方法中,访问对象,$this
$this,这个,这个对象。调用该方法的对象!
?
$this 就是一个方法内的局部变量!特殊在,方法被对象调用执行时,php会自动确定是哪个对象调用的该方法,会使用该对象为方法内的$this赋值
?
?
tip:public,是一个访问控制修饰符,适用于控制成员(属性和方法)的访问问题!protected,private。
?
?
测试:利用面向对象编程的语法,实现学生报名的业务逻辑:
?
?
构造方法,__construct()
在实例化类得到对象时被自动地调用!
主要承担的工作是初始化对象属性!
?
对象的属性初始化
典型的,只要得到了对象,对象的属性就应该被赋予新的值!
?
如果某些属性,在对象出现时,可以被设置为某些特定的值。就可以在声明类时,为声明的属性设置默认值!
?
此处的属性的默认值,类似于参数,只能用已有值或者常量作为默认值。
?
?
还是需要很多属性初始化!
此时应该?
将初始化的工作,声明成一个方法,得到需要被初始化的数据,在方法内,对当前属性进行初始化的工作:
?
此时,在实例化对象后,调用该方法:
此时可以完成初始化!
?
如果可以在new实例化时,自动地调用上的init方法,则手动步骤也可以省略!
?
PHP会在实例化对象时,自动调用一个叫 __construct()的方法!
?
此时,如果该方法需要传递参数,则需要通过实例化时,在new cloass_name()以实参列表的形式,传递!
?
?
如果没有定义__construct()可以不用执行!
但是一旦定义了构造方法,那么构造(实例化)的过程,一定要包括这个调用构造方法的过程(构造方法一定会执行)。
?
TIP:有时也称,实例化对象为构造对象!
?
构造方法可以自动被调用!
?
?
注意
- 构造方法可以是一个别的名字
一个与类名相同的方法,也可能是构造方法!
?
此时会出现,同名与__construct同时出现的问题,__construct()会执行!
典型的兼容性的写法!防止PHP4代码运行在PHP5的服务器上的一个兼容的做法!
?
- 在new class_name时:
new Student
new Student();
取决于是否存在构造函数的必要参数!
?
?
析构方法,__destruct
与构造方法相对,表示在对象被销毁时,自动调用的方法!
对象被销毁,但是对象所占用的资源不一定完全被销毁!
?
在对象被销毁时调用,作用是,用于释放对象所占用的额外资源!而不是对象本身!
?
unset($object)
?
析构:
并不是非要有析构方法,看业务逻辑!
?
?
注意:
1对象在什么时候被销毁?
在用户脚本结束后,所有的资源包括对象都被销毁!
2保存对象的变量被提前unset!
- 保存对象的变量,被赋予了一个新的值!
?
?
预习
静态成员,static
::
类常量
self
?
继承,重写,访问权限控制
?
作业
设计一个数据库的操作类mysqlDB
?
要求:
- 在实例化对象时,就能够连接上数据库
- 在销毁对象时,关闭数据库
- 在实例化时,同样要求,设置连接字符集
- 实例化时,选择默认数据库
注意:类只是一个图纸,内声明的属性,在没有实例化对象时,是没有真实存在的!只有在实例化对象后,才会真实存在于对象内!
?
?
分析:MySQDB,的作用?
一个工具,项目中,凡是需要操作数据库,使用该工具完成!
?
设计:
应该完成那些功能,从而得到需要哪些属性!
需要的数据:主机,端口,用户,密码,字符集,默认数据库
?
需要在构造对象时,将以上的属性,设置好!
增加一个构造方法 __construct,可以接收上面的参数!
如果一个方法或者函数参数过多,或者参数不能确定时:会选择使用数组的形式完成处理:
?
在构造方法内,先完成对属性的初始化!
?
连接数据库
使用当前对象的link属性,保存当前的连接资源!
?
提示:写代码时,应该将一个独立功能封装成独立的部分,在其他地方如果需要,再对该功能进行调用!目的提高代码可重用性!
?
?
设置字符集
增加一个方法用于执行 set names charset ,在构造方法内调用!
?
选择默认数据库
增加一个方法,用于执行 use dbname SQL语句!
在构造方法内调用即可
?
测试:
?
?
升级:对参数选项增加一个默认值的概念,类似于端口,编码,可以在常规情况下实例化时省略!
在构造方法内,对属性初始化时,对默认值做处理:
?
类的静态成员,static
?
场景:
记录学生的数量!
?
当有学生类,每个学生类对象,就是一学生!
?
实例化一次,多出来一个学生。销毁一次少一个学生!
?
定义一个计数器,构造方法中数量+1,析构数量-1~
?
如何定义这个计数器?
不能直接用属于对象的属性,每个对象所独有的!
显然,应该找一个对象所共有的数据?
构造方法静态局部变量,也是不行,原因是析构不能用!
显然,应该找一个能够被对象所共有并且能够在多个方法内使用的变量?
使用全局变量即可,在方法内,是可以通过$GLOBALS访问到全局变量的!
?
此时,站在业务逻辑的角度分析下,是否合理?
全局变量不应该属于任何的对象或者类。$count 与 Student没有丝毫的逻辑上的联系!
?
显然,应该找一个能够被对象所共有并且能够在多个方法内使用的变量,还应该与当前的对象类有逻辑的关系的数据?
可以使用类的静态成员!
?
静态成员,指的是逻辑上被所有的对象所共享,属于类的成员称之为类的静态成员!
分成静态属性和静态方法
保存数据的是静态属性,执行功能的静态方法!
声明
额外增加一个 static 关键字!
属性:
方法:
?
访问
->访问对象成员
?
因此,应该使用类访问,
类 :: 成员!
::,静态访问符,类访问符(范围解析操作符)
在构造方法中,访问到,++!
类似于$this,同样存在一个self关键字(注意没有$),在类中,代表当前类!
$this:这个对象, $this->
self:类自己,self::
?
?
注意
- 访问上,静态成员只能使用::静态访问符号访问!
典型的,::前应该是类,类内可以使用self。
但是,php支持: 对象::静态成员!
尽量不要这么写!
?
- 访问上,静态成员使用类访问,而非静态成员使用对象访问。
?
但是,问题出现在方法上!
测试1,使用类访问,静态与非静态方法:
测试2,适用对象访问:
结论:‘无论是静态方法,还是非静态方法,都可以使用类或者对象来访问。那么静态方法与非静态方法的意义在于哪里?
现象的原因:方法是可执行性代码的集合,针对多个对象都是一致的!
区别在哪?
在于$this的使用上!
只有在使用对象调用非静态方法时,才可以使用$this!
静态静态方法,无论如何也不能对$this做处理
而非静态方法,只有确定了对象,才能确定$this的值!
?
?
在使用类调用对象方法时,应该注意什么问题?
?
?
?
类常量,const
在类内定义,属于类的常量!
?
定义
使用关键字const声明!
而且,没有访问修饰限定符。
?
访问
使用类访问,与访问静态成员类似:
类::常量名.
?
类中保存数据:
类常量,静态属性。
?
?
总结
类中,一共只有5种语法:
属性,方法,静态属性,静态方法,类常量
?
?
继承,extends
?
?
书,与电话都有共同的属性,可以提取!
在书,与电话中不用写:
?
怎么才能在Book类对象中,是哟个Goods类所定义的属性呢?
?
使用继承:
定义
继承:如果一个对象A,使用了另一个对象B的成员,那么我们就称A对象继承了B对象!
?
语法
使用关键字 extends 让一个类继承自另一个类!
?
tip:继承概念体现在对象上,语法体现在类上!
?
此时,特定的称谓:
Goods:父类,基础类!
Book:子类,扩展类!
?
?
语法意义就是,面向对象语法中的,代码的重用!
?
单继承
?
指的是,一个类,只能存在一个父类(基础类),不能同时继承多个类!
?
?
?
instanceof,是否是某类实例
体现:一个对象如果是子类的实例,同时也是父类的实例!(实例,通过该类实例化的对象)
?
?
?
重写,override
是个现象!
如果子类,与父类,出现同名的成员(属性方法),则在实例化子类对象时,只会得到子类中定义的成员,称之为重写!
例如,方法重写:
?
?
parent,父类
一旦重写,父类代码就不会在执行了!
?
但是有些方法是一定会重写的!
典型的构造方法:
?
怎样才能调用父类的构造方法呢?
?
parent,关键字,表示父类的意思!用于在当前类中,强制调用父类成员!
典型的做法,将参数传递到子类的构造方法中,再在子类中,强制使用parent关键字,调用父类的构造方法
?
注意:self,parent,$this的区别:
self::????????当前类本身
parent::????当前类父类
$this->????当前对象。
?
?
?
$this的确定
看上面的parent,或者是父类名:
与:
"只有在使用对象调用非静态方法时,才可以使用$this!
静态静态方法,无论如何也不能对$this做处理
而非静态方法,只有确定了对象,才能确定$this的值!"
?
$this的或的基本原因:
- 哪个对象调用方法,方法内的$this就是那个对象!
- 对象环境,是可以向下传递的!
如果当前方法内,已经确定了对象环境。在该方法内,如果出现了静态调用非静态方法,此时当前的对象环境,会传递到被静态调用的非静态方法中!
?
?
?
问:$this永远代表所在类对象么?
不是!
?
访问修饰限定符,public,protected,private
public,公共的
protected,保护的
private,私有的
?
用于描述,一个成员(属性,方法)在哪里才能被访问的!
?
注意:
PHP是采用类的概念,进行成员的限制访问的!
PHP将访问的代码,分成三大区域:类内,类外,继承链上类内!
?
是根据:
成员在哪里定义与成员在哪里访问来决定类内,类外还是继承链上类内!
以属性 $property为例:
?
?
public
公共的,指的是,成员在本类内,继承链上的类内,与类外,都可以被访问!
?
?
protected
保护的,指的是,成员在本类内,继承链(子类,父类)上的类内可以被访问
?
private
私有的,指的是,只有本类内,可以访问!
?
?
?
如何选择:
一个原则,尽量体现封装性。封装性,指的是,尽量隐藏内部实现,而仅仅开发外部操作接口!
语法上,就是,将不需要外部使用的属性,方法,都私有化(保护化),而仅仅留下一些必要的公共方法!
?
?
注意
- 重写的问题,一定要先明确访问的究竟是哪里所定义的!
- 私有成员的重写问题。
私有成员不能被重写。意味着,在相应的私有属性定义的类中,才能访问到相应的私有属性!
?
注意,在处理私有属性时,一定要确定其定义位置!
?
建议是
如果需要通过继承,你就使用保护的,少用私有的!
在没有继承时,尽量使用私有的!
?
?
- 在重写时,如果重写成员的访问级别不一致。
子类的级别比父类的级别,相等或者弱,可以!
强,不行!
?
?
- 兼容性的问题
早先的 php的面向对象不完善,没有访问控制!
在声明属性时,使用 var 关键字!
声明方法时,什么都不使用!function
?
为了兼容,上面的做法还是可以使用!
?
var,function。访问权限都是 public的!
?
?
冒泡排序
相邻的两个数比较,大数向后走!
模拟
待排序序列:
24 | 11 | 67 | 10 | 9 | 23 | 45 |
11 | 24 | 67 | 10 | 9 | 23 | 45 |
11 | 24 | 67 | 10 | 9 | 23 | 45 |
11 | 24 | 10 | 67 | 9 | 23 | 45 |
11 | 24 | 10 | 9 | 67 | 23 | 45 |
11 | 24 | 10 | 9 | 23 | 67 | 45 |
11 | 24 | 10 | 9 | 23 | 45 | 67 |
11 | 24 | 10 | 9 | 23 | 45 | 67 |
11 | 10 | 24 | 9 | 23 | 45 | 67 |
11 | 10 | 9 | 24 | 23 | 45 | 67 |
11 | 10 | 9 | 23 | 24 | 45 | 67 |
11 | 10 | 9 | 23 | 24 | 45 | 67 |
? | ? | ? | ? | ? | ? | ? |
?
?
明显,需要N-1轮就可以排序出来结果!
每轮内,需要对余下的元素依次做相邻的元素之间的比较!
?
计算关系:
$total = 7;
轮数 | 参与比较次数 | 比较 | ? |
1 | 6 | 0,1|1,2|2,3|…|5,6 | 0-(7-1)-1 |
2 | 5 | 0,1|1,2|…|4,5 | ? |
3 | 4 | 0,1|…|3,4 | ? |
。。。 | 。。。 | ? | ? |
6 | 1 | 0,1 | ? |
?
公式:
比较次数 = 总元素个数-轮数!
?
其次,需要控制那两个元素参与比较?
确定第一个参与比较的元素即可:
从0 到总元素个数-1-当前轮数
?
交换元素位置,找到第三个变量!
?
编程实现?
双层循环,外层比较轮数,内层控制比较元素下标!
?
排序就是消灭逆序的过程!
?
预习
final,抽象,接口
序列化
自动加载
单例模式,工厂模式
作业
- 要求升级mysqldb,尽量体现封装性!
- 升级mysqldb,提取执行SQL的方法,凡是执行SQL,都需要调用该方法实现!
- 要求增加 fetchAll的方法,功能时得到一条查询类的sql语句,返回所有的结果数组!
4,练习,比赛列表其他都是mysqldb来完成!
作业回顾
mysqlDB的封装性
?
都封装起来了,需要对其修改,或者获取去信息,应该怎么办?
?
为,需要在外边访问的成员属性,增加一对接口(公共)方法,便于操作!
?
?
原则
禁用所有,开放特定!
?
?
提取执行sql语句的方法!
?
在执行SQL时,使用该方法:
?
?
fetchAll
?
?
?
类:实例化对象
类:调用其静态成员
类:作为其他类的基础类,被继承!
?
两大功能:
1,实例化对象。2,基础类被继承!
?
存在两种特殊的类,功能单一!
- 只能实例化对象,不能被继承。
- 只能被继承,不能实例化对象。
?
final类,final方法
final类
final,最终,在继承链条上最末的一个类!其下不能再出现子类,意味着不能被继承!
?
例如,认为,Book类的对象就是所有图书对象,不能再出现故事书,小说等等书的子类!
?
final,并没有增加额外的功能!意义是,在语法上限制某个类不能被继承!从而保证数据的完整性!
?
final方法
final关键字还可以限制方法!
可能出现final方法!限制方法是否能被重写!
抽象类,abstract类
抽象类:包含了抽象方法的类称之为抽象类,不能用于实例化对象,只能被继承!
抽象类,不完整的类,由于包含了不完整的方法。
不完整的方法,也叫抽象方法,指的是没有方法体的方法,称之为只有方法的声明,而没有方法的实现的方法称之为抽象方法。也就是不完整的方法!
?
需要使用关键字 abstract来声明这个抽象方法与抽象类!
?
不能实例化对象
?
注意:抽象类是可以包含其他任何正常的成员的,在此基础上,增加了内部的抽象方法!
(并不是抽象类中只能包含抽象方法)
?
只能被继承
但是,继承时,要求,如果子类不是抽象类,那么继承的抽象方法,要被实现(被加上方法体)才可以!
?
使用意义
可见,抽象类,可以规定其非抽象子类,必须要存在的相应成员方法!
可以规定,子类中都必须存在,但是可以不同的方法!
?
?
几个概念:
抽象:abstract,不完整的意思!举目张刚的意思!
实现:implement。将方法完整化!
?
?
接口结构,interface
接口,指的是对象的公共方法。
也有一种接口技术,定义一个接口结构,用于限制一个类(对象)因该具备的公共方法(接口方法)!
?
?
语法:
?
声明
使用关键字 interface声明一个接口结构!
注意,接口内只能包含公共的抽象方法(不完整的方法)!
?
使用
使一个类来实现接口内所定义的所有接口方法(公共方法)
实现,使用关键字:implements来完成
明显,实现该接口结构的类,就包含了接口中定义的抽象方法,两个选择,1,定义成抽象类,2是实现接口方法!
?
?
类似于抽象类,比较与接口的区别:
- 抽象类与普通类之间是继承关系!
普通类继承抽象了,第一可以得到抽象类中的已有的常规成员,第二才需要实现抽象方法(也不一定是public的)
- 接口与普通类之间是实现关系!
普通类实现了接口,只能将其没有实现的公共方法实现!
?
- 接口只用于定义公共的方法!而抽象类,什么都可以有!
?
典型的使用:
?
?
多实现
一个类,可以同时实现多个接口
?
?
?
接口可以定义常量
?
?
辨别?
- 接口是不是类?
接口不是类,接口就是独立的一种结构,适用于限制类的结构!但是可以理解成"接口类似于一个所有的方法都是公共的抽象方法,而且没有其他成员的抽象类",但完全不是一个概念!
class_exists();判断一个类是否存在?
- php是单继承,怎么实现多继承?
"可以通过接口的多实现来模拟"
不能实现多继承!
?
?
类文件的载入-自动加载机制
项目中如何管理大量的类的定义?
典型的,每个类,独立的创建一个文件,用于保存定义该类的源代码!使用时,将该文件载入即可!
此时,类文件的命名为:
类名.class.php
?
此时,面临一个类文件很多,某个功能需要使用其中不分类:
如何合理方便载入?
?
老办法:
将载入类的代码,放在一起:
问题是,会有类的额外加载!
?
现在的载入类文件的方式是?
按需加载
?
在需要某个类时,如果该类没有被加载,则加载定义该类的类文件!
?
判断当前类是否已经加载?
该类在哪个文件中?
什么时机执行上面的操作?PHP本身解决
?
此时可以使用PHP的类文件,自动加载机制完成!
?
自动加载机制
当需要一个类,当时并没有找到该类的定义,此时,PHP核心(Zend Engine),会自动尝试调用一个叫:__autoload()的函数。与此同时,会将当前所需要的类名作为参数,传递到__autoload()这个函数中。
?
默认是没有这个函数的,需要用户自己定义!
?
因此,用户脚本,需要完成定义该函数:
该函数应该有个形参,用于得到当前所需要的类名!
?
此时,我们只要,完成该函数,利用得到的类名,将类名所对应的文件载入即可!
?
分工:
用户脚本:定义函数,接收需要的类名作为参数,函数需要实现通过类名找到类所在的文件,将其载入即可!
PHP核心:判断是否需要类,并且判断该类是否已经载入了,如果需要但是没有载入,则尝试调用用户定义的__autoload()函数,并将需要的类名传递即可!
?
?
分析:
__autoload函数获得是类名
而载入的是类的定义文件
因此,自动加载机制的大前提:必须要能够通过类名,推导出,类定义所在的文件才可以!
因此,要求大家在定义类文件时,要有规律!
?
类文件 = F(类名)
以上是关于合并_03php面向对象基础(4days)笔记的主要内容,如果未能解决你的问题,请参考以下文章