您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页对象

对象

来源:五一七教育网
红色字体属于个人见解 PHP5正式版本的发布,标志着一个全新的PHP时代的到来。PHP5的最大特地那是引入了面向对象的全部机制,并且保留了向下的兼容性。程序员不必再编写缺乏功能性的类,冰鞋能够以多种方法实现类中的保护。

数组和对象在PHP中都输入符合数据类型中的一种,在PHP中数组的功能已经非常强大了,但对象类型不仅可以向数组一样存储任意多个类型的数据,形成一个单位进行处理,而且可以在对象中存储函数。

对象还可以通过封装保护对象中的成员,通过继承对类进行扩展,还可以使用多态机制编写“一个借口,多种实现”的方式、免息那个对象的应用、类和对象的声明与创建、封装、继承、多态、抽象类与接口。

计算机程序是单个能够起到子程序作用的单元或对象组合而成的,为了实现整体运算,每个对象都能够接受信息、处理数据和向其他对象发送发送信息。

三个目标:重用性、灵活性和扩展性,使编程的代码更简洁、更易于维护。并且更具有更强的可重用性。

但PHP并不是一个真正的面向对象的语言,而是一个混合型语言,可以使用面向对象去设计程序,也可以使用传统过程化进行编程、 面向对象技术的语法 面向对象的编程思想

类与对象的关系就如模具和铸件的关系,类实例化结果就是对象,对象的抽象就是类。类描述了一组具有相同属性和相同行为的对象。在开发时,要先抽象类再用该类去创建对象,而在我们程序中直接使用的是对象而不是类 类是一个的程序单位,是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,内部主要包括成员属性和服务的方法两个主要部分。 所有的事物都是由对象和对象之间的联系组成的。对象是系统中用来描述客观事物的一个实体,他是构成系统的一个基本单位,一个对象由一组属性和有权对这些属性进行操作的一组服务的封装体。

面向过程:做小单位:函数 面向对象:最小单位:对象 过程化

10.2.1:类的声明

关键字class后面加上类的名称,并加上一对花括号就可以了。Class 类名{}; 类的前面也可以加一些修饰类的关键字。例如final或abstract 类名一般由多个字母组成且首字母要大写。类名的定义也要具有一定的意义,不要随便有几个字母组成

一个文件只保存一个类(文件名:A.class.php类名:A)

10.2.2成员属性

声明变量时不需要加任何关键字修饰;而声明类的成员属性时,则要在成员属性前使用关键字来修饰。例如:public、private、static、

通常情况下,如果成员属性不需要特定意义的修饰,就使用var来修饰。如果用其他关键字修饰就需要去掉var 10.2.3成员方法

声明的成员方法必须和对象相关,不能是没有意义的操作

10.3实例化对象

$变量名=new类名

10.3.2对象类型在空间中的分配

1.栈空间段:空间小;cpu访问速度快。存放实例化后的对象名等 2.堆空间段:大小不固定;可扩张。存放类中的数据 3.数据段:存放程序静态分配的变量 4.代码段:存放可执行文件的操作指令 10.3.3对象中成员的访问 $引用名=$类名称([参数列表]); $引用名->成员属性=值; Echo $引用名->成员属性; $引用名->成员方法;

10.3.4特殊的对象引用“$this”

访问哪个对象中的成员属性或成员方法;$this就代表哪个对象

10.3.5构造方法与析构方法

构造方法:对象创建完成后第一个被调用的方法。

析构方法:对象销毁之前最后一个被对象自动调用的方法。

一般使用构造方法完成对对象的初始化;使用析构方法完成对象销毁前的清理工作

每个声明的类都有一个构造方法,构造方法在类中默认没有参数列表并且内容为空。每次使用关键字new实例化对象时,构造方法就会自动被调用一次,构造方法不能主动通过对象的引用

Function __construct([参数列表]){

方法体 }

析构方法允许在销毁一个对象之前执行一些特定的操作

析构方法就是为了清空堆内存段中失去访问的对象,释放垃圾对象在堆中占用的内存空间 Function __destruct(){

方法体 }

栈的先进后出特点,最后被创建的对象最先被释放,

10.4封装性 1.设置私有成员 2.私有成员的访问

3.__set(),__get(),__isset(),__unset()

封装性是面向对象编程中的三大特性之一,封装就是把对象的成员属性和成员方法结合成一个的相同单位,兵尽可能的隐蔽对象的内部细节

把对象的全部成员属性和成员方法结合在一起,形成一个不可分割的单位(即对象)。 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系

对象中的成员属性和成员方法如果没有被封装,就可以在对象的外部随意调用。这样做非常危险。

封装的原则是 要求对象以外的部分不能随意存取对象的内部数据,从而避免外部错误对它

的交叉感染,是软件错误能够局部化,减小查错和排错的难度 1. 设置私用成员

使用private关键字就实现了对成员的封装private 属性名称; 私有成员和方法只能在自己对象的内部使用,其他对象不能访问 2. 私用成员的访问

私用成员的外部赋值需要在对象的内部声明一些操作私有属性的公有方法,通过公有方法来实现对内部私有成员的赋值。

私有成员的访问需要通过对象内部的公有方法,公有方法调用私有属性和私有方法,然后在对象外部调用公有方法即可。这个共有方法也就是访问的接口,间接的访问对象内部的私有成员

3.__set(),__get(),__isset(),__unset() 1.__set():控制在对象外部只能为私有的成员属性赋值,不能获取私有属性的值。需要在声明类时自己将它加到类中才可以使用 2.__get():直接在对象的外部获取私有属性的值时,会自动调用此方法,返回私有属性的值。可以再__get()方法中根据不同的属性,设置一些条件来对私有属性的非法取值操作。__get()须在声明类时自己将它加到类中才可以使用,在类中声明的格式如下 修饰关键字 __get(string name)

4.__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法

__isset()测定变量是否存在的函数返回true或者false 例:Bool __isset(string name)

__unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法 Unset()函数的作用是删除指定的变量,参数为要删除的变量名称,也可以使用这个函数在对象外部删除对象内的成员属性但成员属性必须是共有的才行

与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)

10.5继承性

建立一个新的派生类,从一个先前定义的类中继承数据和函数,而且可以重新定义或加进新数据和函数,从而建立了累的层次和登记关系。 集成机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,同时还拥有就的成员。已存在的用来派生新类的类为基类。又称父类或超类。已存在的类派生出的新类成为派生类或是子类。继承性就是通过子类对已存在的父类进行功能扩展。PHP中只能使用单继承。

Extends关键字 calss 子类名 extends 父类名{}

访问类型控制:共有的访问修饰符 public; 私有的访问修饰符 private; 保护的访问修饰符 protected

子类中可以重写父类中的方法parent::父类中的方法名称;

10.6常见的关键字和魔术方法

使用final标识的类,不能被继承final class a{}

在类中使用final标识的成员方法,在子类中不能被覆盖(个人见解:也就是说子类不能使用该类型的方法,和重载该该方法) 不能使用final表示成员属性

10.7Static关键字的使用

Static可以修饰类中属性、成员方法例如:

Class a{

Public $name; }

$p1=new a(); $p2=new a(); $p3=new a();

这样的话3个对象中都会拷贝一份$name和其值;

如果改为static $name;这个属性就是唯一的,类里面和外面调用时为:a::$name; 静态属性、静态方法的类里面和类外面访问方式一样为:类名::属性名,类名::方法名

对象不能访问静态属性、静态方法。

10.8单类设计模式

作用:保证在面向对象编程设计中,一个类只能有一个实例对象存在,(比如建立目录、数据库连接都有可能会用到这种技术)尤为重要。

要编写单态设计模式,就必须让一个类只能实例化一个对象,而要让一个类只能实例化一个对象,就要它不能通过外部直接实例化。

例子:class a{ private static $b;

Private function __construct(){ }

Static function getinstance(){

return Self::$b=new self()

(new self()代表实例化本身类在这里也就是class a()这个类 ) }

Function query($sql){ } }

//调用

$t=a::getinstance()//通过调用类中的方法对类进行本身实例化 $t->query(形参数);

10.9 const关键字

要将类中属性定义为常量,只能使用const关键字定义,其访问方式和静态访问方式一样,(类内部self::常量名;类外部:类名::常量名)常量的属性是只读的,不能重新赋值,如果在程序中试图改变它的值,则会出现错误,所以在声明常量时一定要给它一个初始值,没有其他方式可以后期为其赋值,声明格式为(const a=“123”)。

10.10 instantceof关键字

作用:确定一个对象是类的实例、类的子类、还是实现了某个特定接口

格式:对象名称 instanceof 类名称

类如,你可能要重复的调用某个函数,但希望根据对象类型调整函数的行为(你想到面向过程中的什么地方会用到?条件判断:在类中可能在子类中)

10.11 克隆对象 __clone()

对象模型是通过引用来调用对象的,但有时需要建立一个对象的副本,改变原来的对像时不希望,影响到副本,如果在新建一个对象,比较繁琐而且容易出错,使用克隆后两个副本完全互补干扰。

格式:对象2 clone 实例化的对象名称

(这时候会调用类里面的__clone(){}可以在方法里面修改属性和方法根据需要;对象2不是实例化的)

10.12 __tostring()

作用:快速获取对象的字符串表示的最快捷的方式,他是在直接输出对象是自动调用的魔术方法。(也就是直接输出对象名称时候,会自动调用该魔术方法,方法体根据需要添加在这不过多说明)

10.13 __call()

当用对象调用类中不存在的方法时候,如果有该魔术方法会自动调用,否则出现系统错误,并推出程序不能继续执行。

格式:__call(参数1,参数2)(参数1是类中不存在的方法名称,参数2是调用的不存在的方法的参数,将其全部转为字符串存储到参数2中。strtolower()是将大写转为小写,array_key_exists(参数1,参数2(array))验证参数1是否与数组中的键有相同的)

还是那句话根据具体需要改变函数体 10.14自动加载类文件及其中的类

通常为每个类的定义都单独建立一个php源文件(类文件),当你尝试使用一个未定义的类时,php会报错,可以用include包含一个类所在的类文件,毕竟你知道会用到那个类,如果一个页面需要使用多个类,就不得不引用多个类文件,挺繁琐的。

假设当前目录下每个文件对应一个类,当脚本尝试来创建一个类user的实例时,php会自动执行,__autoload()函数,名字一般采用classname.class.php来命名类文件名,类名一般和classname一样,但引用后参数都需要变小写,这就需要在php通过strtolower()等函数来实现,统一格式。

10.15 对象串行化

作用: 对象也是一种在内存中存储的数据类型,他的寿命通常伴随着生成该对象的程序的终止而终止,有时候,可能需要将对象的状态保存下来,需要时在回复过来。

概念:对象通过写出描述自己状态的数值来记录自己,这个过程成为对象的串行化。就是把整个对象转化为二进制字符串。

使用时候:对象需要在网络中传输时,将对象串行化为二进制的字符串。

对象需要持久保存时,将对象串行化后写入文件或是数据库中。

格式:变量名1=serialize(对象名称);

在串行化时候可能有些不需要保存,就需要它。在串行化时会自动调用function __sleep(){

$arr=array(“name”,”age”);

Return $arr;//name和age将被串行化其他不考虑 }

(看看file_put_contents() 和file_get_contents()什么意思,这里不过多介绍) 反串行化:

格式:变量名称=unserialize(变量名1) 在反串行化时会自动调用魔术方法__wakup(){

//内容可以修改值,等根据需要 }

10.16 抽象类

Php中普通类和抽象类只能单继承,接口可以多继承也就是1对多

关系:抽象类和接口相似,都是一种比较特殊的类,抽象类是一种特殊的类,而接口也是一种特殊的抽象类。他们通常配合面向对象的多态性一起使用。 一个类可以有一个或多个子类,而每个子类都有至少一个公有方法作为外部代码访问它的接口。

抽象方法就是为了方便继承而引入的。 抽象方法:没有方法体的方法。(或者理解为没有函数体也行)而是在声明方法时直接在方法名后加上分号结束。

抽象类中可以有的数量不,但不能有private这个权限: abstract class a{

Public 属性名称

Public function 方法名称(){ }

Public function 方法名称(); Protected function 方法名(){}

}

下面举个例子: Abstract class person{

Protected $name; Protected $country;

Function __construct(){ }

Abstract function say(); Abstract function eat(); Function run(){

Echo “”;

} }

在上类中定义了两个成员属性,一个构造方法和两个抽象方法,一个非抽象的方法,抽象类其实就像一个“半成品”的类,在类中有没有被实现的方法,所以抽象类不能被实例化,但抽象类包含继承关系,可以为它的子类定义公共接口,对抽象类进行操作,(可以是部分也可能是全部)交给子类去实现,就是将抽象类作为子类重载的模板使用,定义抽象类就相当定义了一种规范,这种规范是子类去遵循的。当子类继承抽象类后,就必须把抽象类中的抽象方法按照子类自己的需要去实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法还是不能实例化。还是抽象类。 10.17 接口技术

Php之支持单继承,也就是说每个类只能继承一个父类。当声明的新类继承抽象类实现模板以后,他就不能再有其他父类了,为了解决这个问题,php引入了接口,接口是一种特殊的抽象类,而抽象类又是一种特殊的类。 格式:interface 接口名称{

//常量成员(变量不允许)

//定义成员方法(只有抽象方法的声明) }

接口中有几种使用情况: Interface one{

Function fun1(); Function fun2() }

1. Interface two extends one{

//接口two对接口one进行扩展 Function fun3(); Function fun4(); }

2. abstract class three implements one{

//去实现接口one中的部分方法,也可以全部实现。 }

3. Class four implements one { //实现全部方法 }

4. Class 类名称 implements 接口1、接口2、接口3、接口4.。。。。。。。。{实现方法}

5. Class 类名称 extends 父类名称 implements 接口1,接口2,接口3,接口4。。。。。。。。{ //继承一个类的同时实现多个接口 //实现所有接口中的抽象方法 }

10.18 多态性

多态的功能可让软件在开发和维护时,达到充分的延伸性,多态最直接的定义就是让具有继承关系的不同类对象,可以对相同名称的成员函数调用,产生不同的反应效果,所谓多态性是指一段程序能够处理多种类型对象的能力,(可以理解为同一种方法在不同类中的函数体不一样从而达到的效果也不一样)。接口可以实现(一对implements多、多对implements1)抽象类只能单继承(1对extends1) 可以两者都有 class a extends b implements one ,two, three

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务