PHP面向对象小结

window系统中cmd中打开Php文件方式

路径>PHP -f  文件名

面向过程概述

1  面向过程是一种编程思想,例如:递归思想、冒泡排序、二分法查找等。

2  面向过程是一种以过程(步骤)为中心的编程思想;

3  面向过程是人类的思考问题的一种习惯;

4  面向过程的编程思想,符合我们人类解决问题的基本习惯:面对一个大问题(目标,需求),会将问题分解为若干的连续的小问题,每个小问题按顺序依次去解决,最终就自然获得大问题的结果(答案)。


面向对象概述

1  面向对象也是一种编程思想;

2  面向对象是一种以事物(对象)为中心的编程思想;

3  面向对象是以功能来划分问题,而不是步骤;

4  面向过程,自己造电脑;面向对象,自己组装电脑;

面向过程,就是着重于做什么;面向对象,就是着重于谁去做


类和对象的关系

1 类的概念

1.1  类就是分类类别、模板、概念等,类是无形的、看不见、摸不着,不实际存在的

1.2  类是具有相同属性和行为(动作)的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。例如:所有在学校学习的人,具有相同的属性:学号、姓名、性别等;具有相同的行为:学习。所以,这些人构成一个类,即学生类

2 对象的概念

1  客观世界中任何一个实体都可以看成一个对象,对象看得见、摸得着,实际存在的

2  对象是构成系统的基本单位。任何一个对象都应具有这两个要素:属性(Attribute)和行为(Behavior)。例如:学生“张三”是一个对象,他有属性:学号、姓名、性别等;行为有:学习、吃饭等。

3  对象来自于某个类,对象不能单独存在。一个类可以产生千千万万个对象。

4  对象和类的关系是,对象是类的实例,类是对象的模板。

5  类是抽象的,不占用内存,而对象是具体的,占用存储空间。

 

在现实中,先有对象,后有类。

在电脑中,先有类,后有对象。

 

类定义的语法格式

class为定义类的关键字

类名要求首页字母大写,但不是必须的。类名如果是多个单词的话,应该用“驼峰式”命名。

类的成员属性定义

1 成员属性介绍

1  类的成员属性,就是指某个类具有的公共的特征、特性;

2  类中定义的变量,就是类的成员属性;

3  类的成员属性和普通变量的区别:类的成员属性必须要带权限修饰符,而普通变量不需要。

4  成员属性可以有默认值,也可以没有默认值。

定义成员属性的语法格式

权限修饰符 + 属性名称 = 属性值

2 权限修饰符

1  public(公共权限):在任何地方都可以访问,主要包括:类外、本类中、子类中都可以访问。

2  protected(受保护的权限):只能在本类中和子类中被访问,在类外不能被访问。

3  private(私有权限):只能在本类中被访问,在类外和子类中都无权访问。


类的成员方法定义

1 成员方法介绍

1  类的方法,就是某个类的公共的的行为或动作;

2  类的成员方法,与普通函数一样,都有返回值和参数;

3  成员方法与普通函数区别:成员方法只能存在于类中,成员方法定义前可以添加访问权限修饰符;

4  提示:成员方法可以省略权限修饰符,默认访问权限是public。


创建类的实例对象

1 实例化对象的含义

1  定义类是为了生产对象,如果不生产对象,类就没有意义。

2  一个类可以产生千千万万个对象,对象帮我们干活。

3  对象实例化:从一个类上来生产对象过程。

2 语法格式

1  使用new关键字来创建对象。

2  JS创建对象的方法:var today = new Date()

3  PHP创建对象的方法:$obj = new Student()  //如果不需要参数括号可以省略


对象的属性操作

1. 如何访问对象的属性和方法

1  在JS中,访问对象属性和方法,是通过"."来访问的。例如:window.alert()、arrObj.length

2  在PHP中,访问对象属性和方法,是通过"->"来访问的。例如:$obj->name、$obj->showInfo()

2 对象属性的操作:增、删、改、查

对象方法操作

对象方法的操作:方法定义、方法调用、传递参数、方法返回值。


伪变量$this的使用

1 伪变量$this的含义

1  在JS中,使用this关键字来代替当前对象,例如:this.src = './a.jpg'

2  在PHP中,使用$this变量来代替当前对象,例如:$this->name = '张三'

3  $this代表当前对象,是到当前对象的一个引用;

4  $this更像是一个对象指针,指向当前对象;

5  $this只能用在对象方法定义中,去调用对象的成员属性或成员方法。

只有创建对象后,$this变量才存在。类不会自动运行

类常量的定义

1 类常量介绍

1  可以把在类中始终保持不变的值定义为常量;

2  常量的值必须是一个定值,不能修改,也不能删除;

3  类常量就是类的常量,是与类相关的,与对象无关。

4  类常量在内存中只有一份,不管创建多少个对象。

5  类常量可以极大节省服务器内存,可以被所有对象去共享。


2 类常量定义和调用格式

类常量没有权限,只有属性和方法才会有权限。

2  使用const来定义类的常量(局部常量);define()定义常量是全局常量。


静态属性和静态方法

1 概述

1  static关键字修饰的属性,就是静态属性

2  static关键字修饰的方法,就是静态方法

3  静态属性:就是类的属性,与类相关,与对象无关;

4  静态方法:就是类的方法,与类相关,与对象无关;

类的东西(类常量、静态属性、静态方法),通过"类名::"来调用

6  静态属性或静态方法,在内存中只有一份,被所有对象去共享;

7  静态属性或静态方法的好处:就是为了节省内存。例如:创建了100个对象,而静态属性只有一份。

8  静态属性和类常量的区别:类常量在一次HTTP请求过程值永远不变;但是静态属性可以改变。

静态属性和静态方法,都可以加权限控制符,而类常量没有权限。

2 语法格式

静态属性语法格式

权限修饰符 static 属性名 = 属性值

静态方法语法格式

权限修饰符 static function 方法名(){}

3 self关键字使用

1  $this是指向当前对象的指针,而self是指向当前类的指针;

2  $this关键字用来调用对象的属性和方法;

3  self用来调用类常量、静态属性、静态方法;

4  $this关键字只能在成员方法中使用;

5  self关键字可以在成员方法和静态方法中使用;


4 构造方法

1 定义

1  当使用new关键字创建对象完成时,第1个自动调用的方法,就是构造方法;

2  构造方法的名称是固定的:void __construct ([ mixed $args [, $... ]] )

3  构造方法可以带参数,也可以不带参数;构造方法不是必须的,是可选的;

4  构造方法的作用:对象初始化。例如:给对象属性赋值、数据库对象初始化(连接、选择数据库)

5  构造方法一定是成员方法。构造方法的权限可以自己指定。

6  构造方法一般不需要主动调用,都是自动调用的。


5 析构方法

1 定义

1  对象销毁前自动调用的方法,就是析构方法;

2  析构方法的名称是固定的:void __destruct ( void )

3  析构方法不带任何参数;

4  析构方法的作用:垃圾回收工作,例如:断开到MySQL的连接

2 对象何时销毁

网页执行完毕时,对象会自动销毁;

也可以手动销毁unset()或者是手动给对象赋个空值(像null)

oop中的内存分配情况

为什么使用var_dump打印对象时,只能看到成员属性呢?

打印对象时,打印的时堆内存中的数据


值传递

1  所谓“值传递”,就是将一个变量的“数据”或“值”,复制一份,传递给另一个变量;

2  这两个变量之间没有任何关系,修改其中一个变量的值,另一个变量的值不受影响;

3  默认情况下,PHP值传递的数据类型有:字符串型、整型、浮点型、布尔型、数组型、NULL。


引用传递

1  所谓“引用传递”,就是将一个变量的“数据地址”,复制一份,传递给另一个变量;

2  这两个变量指向“同一个地址”,修改其中一个变量的值,另一个变量的值也会受影响;

3  默认情况下,PHP引用传递的数据类型有:对象和资源


对于海量数据的变量来说,值传递和引用传递,引用传递更快。


 其它类型变量使用引用传递

如果其它类型变量使用引用传递,只需要在引用的变量前加“&”符号即可。


类的封装性

1 定义

1  类的三大特性:封装性、继承性、多态性;

2  封装性:将敏感的数据保护起来,不被外界访问;还可以理解为,将一个功能的方方面面,封装成一个整体,即类;

类的封装性,是通过访问权限修饰符来实现的

提示:在项目中,属性基本都是私有的。通过公有的方法,对私有的属性进行赋值和取值


类的继承性

1 定义

1  CSS样式继承:父标签定义的样式,可以在子标签中直接使用。相同的样式只写一遍,减少代码量。

2  如果一个B类拥有了A类的所有特征信息,我们就说B类继承了A类。

3  A类可以称为:基础类(最顶层的类)、父类、上层类。

4  B类可以称为:最终类(最终的类)、子类、下层类。

5  提示:如果多个子类拥有相同的属性和方法,可以将相同的属性和方法提取出来,放到“父类”中,然后,再创建子类并继承父类;这样一样,重复的代码只写一遍,减少代码量,提高工作效率。

6  为什么要使用类的继承?是为了实现功能的升级和扩展。

7  功能的升级:原来有的功能,在子类进行完善。

功能的扩展:原来没有的功能,在子类增加新功能


2 继承语法格式

class 子类名 extends 父类名{}

3 单继承和多继承

1  单继承:只能从一个父类来继承功能。如:Java、PHP、C#等。

2  多继承:同时从多个父类来继承功能。如:C++

4 parent关键字

1  self代表当前类,parent代表父类。

2  self和parent可以存在于所有方法(成员方法和静态方法)中。

3  self用来调用本类的内容,包括:类常量、静态属性、静态方法、成员方法;

4  parent用来调用父类的内容,包括:类常量、静态属性、静态方法、成员方法;

5  self和parent都使用范围解析符"::"来调用其它内容。

6  语法:parent::类常量 | 静态属性 | 静态方法 | 成员方法


类的多态

1 定义

1  类的多态,就是类的多种形态。

2  类的多态主要指方法重载或方法重写。

3  方法重载:在同一个类中定义两个同名方法,PHP不支持。

4  方法重写:在子类中定义一个与父类同名的方法,就是“方法重写”。

5  为什么要重写方法?主要是实现功能的升级。父类中有的方法,子类中再用同样的名字再定义一次,一般来说,子类中方法的功能比父类更完善、更详尽。

2 方法重写要求

1  子类中重写的方法,要与父类中的方法同名;

2  子类中重写的方法形参个数,要与父类中的同名方法形参个数一致;

3  子类中重写的方法类型,要与父类中同名方法类型一致;

4  子类中重写的方法的访问权限,不能低于父类中同名方法的访问权限;

    4.1  父类方法权限为public,子类同名方法权限只能是public;

    4.2  父类方法权限为protected,子类同名方法权限可以是protected和public;

    4.3  父类方法权限为private,子类无法继承,也无法重写。

5  注意:对于重写构造方法,就比较特殊,就没有形参个数的要求。


最终类和最终方法

1 定义

1  Final关键字修饰的类,就是最终类

2  Final关键字修饰的方法,就是最终方法

3  最终类:该类只能实例化,不能被继承。该类十分完善了,不需要升级和扩展。

4  最终方法:该方法可以被继承,但不能重写。该方法十分完善了,不需要重写了。


抽象类和抽象方法

1定义

1  abstract关键字修饰的类,就是抽象类;

2  abstract关键字修饰的方法,就是抽象方法;

3  抽象类:该类不能直接实例化,必须先继承后再实例化。常用在基础类

4  抽象方法:方法必须先继承后重写。

5  抽象方法就是方法的命名规范、命名规则,也可以理解为一种监督机制。

6  所有的抽象方法都必须重写,少一个都不行。

7  抽象方法没有方法体,必须在子类重写后,再定义方法体。

8  如果一类中有一个抽象方法,该类必须是抽象类。

9  抽象方法权限不能是private,因为要先继承再重写。

10  抽象方法只能是成员方法,而不能是静态方法。

11  抽象类中,可以包含其它成员:常量、成员属性、成员方法、静态属性、静态方法。

12  抽象类,可以理解为类的领导者,或者类中方法的目录大纲



区分易混淆点

1  如果在没有对象的前提下,如何调用静态方法、成员方法?使用self关键字可以调用。

2  提示:并不是每个类都必须要创建对象。

3  self可以调用本类的,除了成员属性外,都可以调用;

4  parent可以调用父类的,除了成员属性外,都可以调用;

5  但是,一般情况下,成员属性和成员方法,还是用对象去调用,如果没有对象了,可以使用self;

6  self主要用类的东西,成员方法一般不建议调用;


接口技术

1 接口概念

1  PHP 类是单继承,也就是不支持多继承。

2  当一个类需要多个类的功能时,单继承就无能为力了,为此 PHP 引入了类的接口技术。

3  多人合作开发项目时,需要规范各个功能的名称,就需要用到接口技术。

4  接口就是一种标准,一种规范。类的功能实现,按照标准接口实现即可;

5  接口就是特殊的抽象类。接口可以理解为类的领导者,或者类中方法的目录大纲。


2 接口定义和实现要点

1  interface关键字定义接口;

2  implements关键字用来实现接口;

3  类可以继承类,接口可以继承接口,但是类只能实现(implements)接口。

4  接口中方法权限必须是public;

5  接口中方法默认是抽象的,所以不需要在方法名前面加 abstract ;

6  接口中方法可以是成员方法,也可以是静态方法;

7  接口中也可以定义常量,但常量不能重写;

8  类可以实现(implements)多个接口(相当于把多个功能集于一身,如手机实现了小灵通、MP3、MP4的功能);


类的自动加载

1 为什么需要类的自动加载

很多开发者写面向对象的应用程序时,对每个类的定义,都建立一个独立的 PHP 源文件,方便类文件的统一管理,这无可厚非。但一个很大的烦恼是,不得不在每个脚本开头,写一个长长的包含文件列表(每个类一个文件)。这样一来,就增加了很多负担、占用了很多的内存,对于后期维护也不方便。

解决方案:按需要加载类文件,而不是把所有类全部包含进来


2 类的常规加载:__autoload()

1 类自动加载的应用场景

1  在 PHP 5 中,定义一个 __autoload()系统函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

2  提示:由于__autoload()不太灵活,在以后的版本中它可能被弃用。


2 __autoload()函数详解

1  __autoload()函数,需要自已定义该函数的内容;

2  __autoload()函数,名称是固定的

3  __autoload()函数,会在创建类对象时自动调用,并自动传递类名称作参数;

4  __autoload()函数,需要用户自定义加载指定类文件的代码。

5  __autoload()函数,参数一般是加载的类名称;


3 __autoload()函数何时调用?

当试图使用未定义的类时自动调用,使用一个类的几种情况

1  使用new关键字创建不存在类的对象时,__autoload()自动调用;例如:$obj = new Student()

2  当使用静态化方式访问一个不存在的类时,__autoload()自动调用,例如:Student::show();

3  当继承一个不存在的类时,__autoload()自动调用,例如:class Stu extends Parent{}

4  当实现一个不存在的接口时,__autoload()自动调用,例如:class Stu implements Inter


4 类文件的命名规范

1  一个类要单独定义成一个独立的类文件;

2  类文件扩展名,要以".class.php"结尾,是一种约定,不是必须的;

3  类文件主名,要与类名一致;

4  例如:Db.class.php、UserController.class.php、UserModel.class.php


类的自定义加载:spl_autoload_register()


1 为什么要使用spl_autoload_register()加载类文件?

1  如果加载的类文件,位于不同的目录中,命名方式也不尽相同,__autoload()就显得不灵活了。

2  spl_autoload_register()提供了一种更加灵活的方式来实现类的自动加载

3  注意:在PHP7中,__autoload()已经被屏弃了。


对象克隆

1 什么是对象克隆

1  如果已存在了一个对象,而还想再创建一个新对象,并且,两个对象的属性值不一样,或者属性比原来多,怎么实现呢? $obj2 = $obj1 无法实现!

2  $obj2 = $obj1,这不是复制对象,而是将$obj1和$obj2指向了同一个对象地址。

3  创建新对象有两种方式:a. 使用new关键字; b. 使用 clone 关键字

2 魔术方法__clone()在克隆对象中的使用

1  描述:当复制完成时,如果定义了 __clone()方法,则新创建的对象(复制生成的对象)中的 __clone()方法会被调用,可用于修改属性的值(如果有必要的话)。

2  语法:void __clone ( void )

3 对象遍历

foreach既可以遍历数组元素,也可以遍历对象属性。


常用魔术方法

1  __toString()

1  描述:将对象转成字符串时,__toString()会自动调用。

2  语法:publicstring __toString ( void )

魔术方法一般用与屏蔽错误

注意:PHP不支持对象转字符串,因此,不能使用echo输出一个对象。


2 __invoke()

1 描述:当把一个对象当成函数调用时,__invoke()会自动调用。

2 语法:mixed__invoke ([ $... ] )



面向对象的设计模式

1 对象设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。


2 常用的设计模式有哪些

单例设计模式:一个类只能创建一个实例对象,不管用什么办法都无法创建第2个对象;

工厂设计模式:生产不同类对象的工厂;

3  策略设计模式:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

4  观察者设计模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

5  提示:OOP中设计模式大约有几十种,有兴趣的同学,可以上网查询。


3 单例设计模式的要求(三私一公)

1  一私:私有的静态的保存对象的属性。

2  一私:私有的构造方法,阻止类外new对象。

3  一私:私有的克隆方法,阻止类外clone对象。

4  一公:公共的静态的创建对象的方法。



工厂设计模式

1 什么是工厂设计模式

1  根据传递不同的类名参数,返回不同类的对象;

2  工厂模式,就是生产各种的不同类的对象;

3  工厂模式,改变了在类外使用new关键字创建对象的方式,改成了在工厂类中创建类的对象。

4  在类的外部我们无法控制类的行为,但在类内部自己可以控制类的行为


2 工厂设计模式的要求

1  工厂类中的方法,应该是公共的静态的方法;

2  工厂类中有一个私有的静态的保存对象的属性(单例工厂模式);

3  该方法功能:就是根据传递的不同参数,去创建不同的类实例;

4  提示:工厂设计模式,一般会与单例设计模式搭配使用。



重载

1 什么是重载

1  PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法,我们是通过魔术方法来实现的。

2  当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。屏蔽错误。

3  所有的重载方法都必须被声明为 public。

4  属性重载只能在对象中进行。在静态方式中,这些魔术方法将不会被调用。所以这些方法都不能被声明为 static。

5  这些魔术方法的参数都不能通过引用传递。


2 属性重载

1__get()魔术方法

描述:读取不可访问属性的值时,__get() 会被调用。

语法:public mixed __get ( string $name )


2__set()魔术方法

描述:在给不可访问属性赋值时,__set() 会被调用。

语法:public void __set ( string $name , mixed $value )


3__isset()魔术方法

描述:当对不可访问属性调用 isset() 或 empty() 时,__isset()会被调用。

语法:public bool __isset ( string $name )


4__unset()魔术方法

描述:当对不可访问属性调用 unset() 时,__unset()会被调用。

语法:public void __unset ( string $name )


3 方法重载

1 __call()魔术方法

描述:在对象中调用一个不可访问方法时,__call()会被调用。

语法:public mixed __call ( string $name , array$arguments )


2 __callStatic()魔术方法

描述:用静态方式中调用一个不可访问方法时,__callStatic()会被调用。

语法:public static mixed __callStatic ( string $name , array$arguments )



静态延时绑定

1  什么是静态延时绑定

1  自PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。

2  "后期绑定"的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为"静态绑定",因为它可以用于(但不限于)静态方法的调用。

3  我们需要一个在调用执行时才确定当前类的一个特征,就是说将static关键字对某个类的绑定推迟到调用执行时,就叫静态延迟绑定!

4  语法:static::静态属性,静态方法,成员方法,类常量

如果在继承范围,self永远代表当前类,static代表最终执行的类


变量序列化

1 什么是变量序列化

1  序列化是将变量转换为可保存或传输的字符串的过程;

2  反序列化就是在适当的时候把这个字符串再转化成原来的变量使用;

3  这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性;

4  序列化有利于存储或传递 PHP 的值,同时不丢失其类型和结构。


2 序列化函数serialize()

1  描述:产生一个可存储的值的表示;

2  语法:stringserialize ( mixed $value )

3  参数:$value可以是任何类型,除了资源外

4  返回:返回序列化之后的字符串,可以存储于任何地方。



3 反序列化函数unserialize()

1  描述:从已存储的表示中创建 PHP 的值

2  语法:mixedunserialize ( string $str )

3  说明:对单一的已序列化的变量进行操作,将其转换回 PHP 的值。

4  参数:$str为序列化后的字符串;

5  返回:返回的是转换之后的值,可为 integer、float、string、array或 object。 如果传递的字符串不可序列化,则返回 FALSE,并产生一个 E_NOTICE。


4 对象序列化

1  对象的序列化过程,与其它变量数据一样;

2  对象序列化的内容只能包含成员属性;

3  当序列化对象时,serialize()函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。


5 对象反序列化

1  对象的反序列化过程,与其它变量数据一样;

2  当对象反序列化时,unserialize()函数会检查类中是否存在一个__wakeup()方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。 __wakeup() 经常用在反序列化操作中,进行一些初始化操作,例如重新建立数据库连接,或执行其它初始化操作


常用的魔术常量

1  __LINE__:当前行号

2  __FILE__:当前文件

3  __DIR__:当前目录

4  __FUNCTION__:当前函数

5  __CLASS__:当前类

6 __METHOD__:当前方法

7  __NAMESPACE__:当前命名空间


常用类和对象的函数

1 判断类、接口、属性、方法是否存在

1  class_exists() 检查类是否已定义

2  method_exists() 检查类的方法是否存在

3  property_exists() 检查对象或类是否具有该属性

4  interface_exists() 检查接口是否已被定义


2 返回类名或父类名称

1  get_class() 返回对象的类名

2  get_parent_class() 返回对象或类的父类名

文章来源: PHP面向对象小结

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:PHP面向对象小结