--------类与对象---------------------
如果要声明某个属性为常量,可以使用const关键字,并且无需使用美元符号作为变量名前缀,也无需使用访问权限修饰符。

PHP允许我们在类和接口里使用const创建常量,接口里的常量将保持不变,且不能修改。常量必须初始化。

类是属性和方法的集合,对象是类进行实例化后的产物,是一个实体。

面向对象三大特点:①封装性:封装性也称为信息隐藏,就是将一个类的使用和实现分开,只保留有限的接口(方法)与外部联系。②继承性:继承性就是派生类(子类)自动继承一个或多个基类(父类)中的属性与方法,并可以重写或添加新的属性或方法。③多态性:多态性是指同一个类的不同对象,使用同一个方法可以获得不同的结果,这种技术称为多态性。

$this->作用是调用本类中的属性或方法,所以$this只可以在类的内部使用。

类常量可以不需要实例化对象,直接由“类名+常量名”调用即,输出格式为类名::常量名。
静态调用非静态方法即,对象或类::非静态方法()将发出一个E_Strict错误。
类名和常量名之间的两个冒号"::"称为作用域操作符,使用这个操作符可以在不创建对象的情况下调用类中的常量、静态属性和方法。

构造方法是生成对象时自动执行的成员方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。如果类中没有构造方法,那么PHP会自动生成一个。自动生成的构造方法没有任何参数,没有任何操作。

析构方法的作用和构造方法正好相反,是对象被销毁时调用的,作用是释放内存。

子类继承父类的所有非私有成员变量和方法,包括构造函数,当子类被创建时,PHP会先在子类中查找构造方法。如果子类有自己的构造方法,PHP会调用子类中的方法。当子类中没有时,PHP则去调用父类中的构造方法,这就是继承。
多态,就是同一种方法,却产生了不同的形态,这就是多态。多态存在两种形式:覆盖和重载。(1)所谓覆盖就是在子类中重写父类的方法,而在两个子类的对象中虽然调用的是父类中相同的方法,但返回的结果是不同的。(2)重载,是类的多态的另一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。

操作符“::”可以在没有声明任何实例的情况下访问类中的常量、成员方法或静态成员属性。使用“::”操作符的通用格式为: 关键字::静态属性名/常量名/方法名. 这里的关键字分为以下3种情况:1 parent关键字:可以调用父类中的静态属性、成员方法和常量。在静态方法中,只可以用parent::静态方法(),不能用parent::非静态方法()2self关键字:可以调用当前类中的静态属性、常量或方法。在静态方法中,只可以用self::静态方法(),不能用self::非静态方法()。3类名:可以调用本类中的静态属性、常量和 静态方法(类名在类内可以调用父类或本类的非静态方法)。

pubic(公共成员)顾名思义,就是可以公开的、没有必要隐藏的数据信息。可以在程序中的任何位置(类内、类外)被调用。子类可以继承和使用父类中所有的公共和保护成员。

private(私有成员)被private关键字修饰的变量和方法,只能在所属类的内部被调用和修改,不可以在类外被访问。在子类中也不可以。

不是所有的属性(方法)都要通过创建对象来调用。可以通过给属性(方法)加上static关键字来直接调用。调用静态成员的格式为:关键
字::静态成员。关键字可以是: 1self,2 parent,2静态成员所在的类名。

在静态方法中,只能调用静态属性,而不能调用普通属性,而普通方法则可以调用静态属性。

使用静态成员,除了可以不需要实例化对象,另一个作用就是在对象被销毁后,仍然保存被修改的静态数据,以便下次继续使用。

final,中文含义是“最终的”、“最后的”。被final修饰过的类和方法就是“最终的版本”。final类说明该类不可以再被继承,也不能再有子类。final方法说明该方法在子类中不可以进行重写,也不可以被覆盖。

抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类使用abstract关键字来声明。

抽象类和普通类相似,包含成员变量、成员方法。两者的区别在于,抽象类至少要包含一个抽象方法。抽象方法没有方法体,其功能和实现只能在子类中完成。抽象方法也是使用abstract关键字来修饰的。

在抽象方法后面要有分号“;”。

抽象类和抽象方法主要应用于复杂的层次关系中,这种层次关系要求每一个子类都包含并重写某些特定的方法。

如果想实现多重继承,就要使用接口。PHP可以现实多个接口。

接口类通过interface关键字来声明,并且类中只能包含未实现的方法。

不要用public以外的关键字来修饰接口中的类方法, 另外不写关键字也可以。这是一个接口类自身的属性决定的。
子类是通过implements关键字来实现接口的,如果要实现多个接口,那么每个接口之间应使用逗号“,”连接。而且所有未现实的方法需要在子类中全部实现,否则PHP将会出现错误。

抽象类和接口实现的功能十分相似。抽象类的优点是可以在抽象类中实现公共的方法,而接口则可以实现多继承。

__clone()方法的作用是:在克隆对象的过程中,调用__clone()方法,可以使克隆出来的对象保持自己的一些行为及属性。

__set()和__get()方法,这两个魔术方法的作用分别为:1当程序试图写入一个不存在或不可见的成员变量时,PHP就会执行__set()方法。__set()方法包含两个参数,分别表示变量名称和变量值,两个参数不可省略。2当程序调用一个未定义或不可见的成员变量时,PHP会执行__get()方法。__get()方法有一个参数,表示要调用的变量名。

__call()方法的作用是:当程序试图调用不存在或不可见的成员方法时,PHP会先调用__call()方法来存储方法名及其参数。__call()方法包含两个参数,即方法名和方法参数。其中,方法参数是以数组形式存在的。

__sleep和__wakeup方法:使用serialize()函数可以实现序列化对象。就是将对象中的变量保存下来,对象中的类则只保存类名。在使用serialize()函数时,如果实例化的对象包含__sleep()方法,则会先执行__sleep()方法。该方法可以清除对象并返回一个该对象中所有应被序列化变量的数组。使用__sleep()方法的目的是关闭对象可能具有的数据库连接等类似的善后工作。

unserialize()函数可以重新还原一个被serialize()函数序列化的对象,__wakeup()方法则是恢复在序列化中可能丢失的数据库连接及相关工作。

魔术方法__toString()的作用是:当使用echo 或print输出对象时,将对象转化为字符串。

如果没有__toString()方法,直接输出对象将会发生致命错误。

将一个独立,完整的类保存到一个PHP页中,并且文件名和类名保持一致是个好习惯。

__autoload()方法可以自动加载需要使用的类。当程序要用到一个类,但该类还没有被定义时,PHP5将使用__autoload()方法,在指定的路径下自动查找和该类名称相同的文件。如果找到,程序则继续执行;否则,报告错误。

封装的原则就是要求对象以外的部分不能随意存取对象的内部数据(成员属性和成员方法)。从而有效地避免了外部错误对它的“交叉感染”,使软件错误能够局部化,大大减少查错和排错的难度。

在子类覆盖父类的方法时一定要注意,在子类中重写的方法的访问权限一定不能低于父类被覆盖的方法的访问权限,即一定要高于或等于父类被覆盖的方法的访问权限。

如果在类的外部访问类中的静态成员,可以使用对象引用和使用类名访问,但通常选择使用类名来访问。如果在类内部的成员方法中访问其它的静态成员,通常使用self的形式去访问,最好不要直接使用类名称。

在使用静态方法时需要注意,在静态方法中只能访问静态成员。因为非静态的成员必须通过对象的引用才能访问,通常是使用$this完成的。而静态的方法在对象不存在的情况下也可以直接使用类名来访问,没有对象也就没有$this引用,没有了$this引用就不能访问类中的非静态成员,但是可以使用类名或self在非静态方法中访问静态成员。
只要在声明类时有一个方法是抽象方法,那么 这个类就是抽象类,抽象类也要使用abstract关键字来修饰。在抽象类中可以有不是抽象的成员方法和成员属性。

对象还可以通过封装保护对象中的成员,通过继承对类进行扩展,还可以使用多态机制编写“一个接口,多种实现”的方式。

类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对象的抽象就是类。

类描述了一组有相同特性(属性)和相同行为(方法)的对象。在开发时,要先抽象类再用该类去创建对象,而在我们的程序中直接使用的是对象而不是类。

在面向对象的编程语言中,类是一个独立的程序单位,具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括成员属性和服务的方法两个主要部分。

在客观世界里,所有的事物都是由对象和对象之间的联系组成的。对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,一个对象是一组属性和有权对这些属性进行操作的一组服务的封装体。

*上面介绍的就是类和对象的定义,也许你是刚接触面向对象的读者,不要被概念的东西搞晕了,我们通过举例来理解一些这些概念吧。一个类最为突出的特性,或区别于其他类的是你能向它提出什么样的请求,它能为你完成哪些操作。例如,你去中关村电子城想买几台组装的PC机,你首先要做的事是什么?是装机的工程师和你坐在一起,按你的需求和你一起完成一个装机的配置单。可以把这个配置单看做是一个类,也可以说是自定义的一个类型,它记录了你要买的PC机的类型,如果按这个配置单组装10台PC出来,这10台机子就可以说是同一个类型的,也可以说是一类的。
那么 什么是对象呢?类的实例化结果就是对象,按PC的配置单组装出来(实例化出来)的PC机就是对象,是我们可以操作的实体。组装10台PC机,就创建了10个对象,每台PC机都是独立的,只能说明他们是按同一类型配置的,对其中一个PC机做任何动作都不会影响其它9台机器。但是如果对类进行修改,也就是在这个PC的配置单上加一个或少一个配件,那么组装出来的10个机子都被改变。
通过上面的介绍也许你理解了类和对象之间的关系。类其实就像我们现实世界将事物分类一样,有车类,所有的车都归属于这个类,例如,奔驰车、宝马车都属于车类中的一种;有人类,所有的人都归属这个类,例如中国人、美国人、工人、学生等都属于人类中的一种;有球类,所有的球都归属这个类,例如蓝球、足球、排球等。在程序设计中也需要将一些相关的变量和函数的声明归类,形成一个自定义的类型。通过这个类型可以创建多个实体,一个实体就是一个对象,每个对象都具有该类中定义的内容特性。*

*面向对象的程序设计:
在PHP中,可以采用面向过程方式的模块化编程,也可以采用面向对象的程序设计模式,还可以是面向对象和面向过程混合编程。在PHP4中的面向对象功能很不完善,所以程序设计人员几乎采用的都是过程化的模块编程,程序的基本单位就是由函数组成的。而PHP5版本的发布,标志着一个全新的PHP时代的到来,它的最大特点就是引入了面向对象的全部机制,并且保留了向下的兼容性。开发人员不必再编写缺乏功能性的类,并且能够以多种方式实现类的保护。程序设计人员在设计程序时,就可用以对象为程序的基本单位。
在面向对象的程序设计中,初学者比较难理解的并不是面向对象程序设计中用到的基本语法,而是如何使用面向对象的模式思想去设计程序。例如,一个项目要用到多个个类?定义什么样的类?每个类在什么时候去创建对象?哪里能用到对象?对象和对象之间的关系,以及对象之间如果传递信息等。
假设有这样一个项目,某大学需要建立5个多媒体教室,每个教室可以供50名学生使用。如果把这个项目交给你来完成,你该怎么做?是不是首先需要5个房间,每个房间里面摆放50张电脑桌和50把椅子,然后需要购买50台电脑、一个白板和一个投影机等。这些是什么?能看到的这些实体就是对象,也可以说是这些多媒体教室的组成单位。多媒体教室需要的东西都知道了,怎么去准备呢?就要对所有需要的东西进行分类,可以分成房间类、桌子类、椅子类、电脑类、白板类和投影机类等。然后定义每个类别的详细信息,例如,房间类里面需要定义它的面积、桌子数量、电脑数量、和椅子数量等,按这个房间类的设计就可以建立5个房间对象作为教室。桌子类需要定义它的长、宽、高以及颜色,那么通过桌子类生产的所有桌子都是一样的类型。做一个电脑类,列出需要的电脑详细配置,这样购买的电脑就都属于这个类型的了。以此类推,每个对象都可以这样准备。再把这些创建完成的对象都放到各自的教室中,再由学生对象的使用就可以将多个对象关联到一起了。
开发一个面向对象的系统程序和创建一个多媒体教室类似,都是把每个独立的功能模块抽象成类并实例化成对象,再由多个对象组成这个系统。这些对象之间都能够接收信息、处理数据和向其他对象发送信息等相互作用,就构成了面向对象的程序。*

要想声明出一个人类出来,从定义的角度分为两部分:一是静态描述,二是动态描述。静态描述就是我们所说的属性,在程序中可以用变量实现,例如,人的姓名、性别、年龄、身高、体重、电话、家庭住址等。动态描述也就是对象的功能,例如,人可以开车,会说英语,可以使用电脑等。抽象成程序时,我们把动态描述写成函数。在对象中声明的函数叫做方法。所有类都是从属性和方法这两方面去声明,在为对象声明类时都是类似的。属性和方法都是类中的成员,属性又叫做对象的成员属性,方法叫做对象的成员方法。

在类中直接声明变量就称为成员属性,可以在类中声明多个变量,即对象中有多个成员属性,每个变量都存储对象不同的属性信息。成员属性可以使用PHP中的标量类型和复合类型,所以也可以是其他类实例化的对象,但在类中使用资源和空类型没有意义。

对象实例化格式:$变量名 =new 类名称([参数列表]);.

对成员属性的访问包括赋值操作和获取成员属性值的操作。

只要是对象中非静态成员都要使用“对象引用名->属性(无$符号)”或“对象引用名->方法()”形式访问。如果对象中的成员不是静态的,这是唯一的访问形式 。

对象一旦被创建,在对象中的每个成员方法里面都会存在一个特殊的对象引用“$this”。成员方法属于哪个对象,$this引用就代表哪个对象,专门用来完成对象内部成员之间的访问。

特殊的对象引用$this就是在对象内部的成员方法中,代表本对象的一个引用,但只能在对象的成员方法中使用。

构造方法是对象创建完成后第一个被对象自动调用的方法,这是我们在对象中使用构造方法的原因。而析构方法是对象在销毁之前最后一个被对象自动调用的方法,这也是我们在对象中使用析构方法的原因。所以通常使用构造方法完成一些对象的初始化工作,使用析构方法完成一些对象在销毁前的清理工作。

在每个声明的类中都有一个称为构造方法的特殊成员方法,如果没有显示地声明它,类中都会默认存在一个没有参数列表并且内容为空的构造方法。

在创建一个对象时,构造方法就会被自动调用一次,即每次使用关键字new来实例化对象时都会自动调用构造方法。所以通常使用构造方法执行一些有用的初始化任务,比如对成员属性在创建对象的时候赋初值等。

在PHP5以前的版本中,构造方法的方法名称必须与类名相同,这种方式在PHP5中仍然可以用。为了向下兼容,在创建对象时,如果一个类中没有名为__construct()的构造方法,PHP将搜索与类名相同名的构造方法执行。

可以在声明构造方法时使用默认参数,实现其它面向对象的编程语言中构造方法重载的功能。

剩余内容需要付费后查看,请点击支付

原创文章,来自 http://blog.p2hp.com/archives/353

最后更新于 2019年1月8日

php类与对象笔记
标签: