面向对象的概念(OOP)
OOP(Object-Programming, 面向对象的编程) 技术为编
程人员敞开了一扇大门,使其编程的代码更简洁、更易于 维护,并且具有更强的可重用性。
OOP达到了软件工程的三个目标: 重用性、灵活性、扩展性
OOP面向对象编程的特点: 封装、继承、多态
建议学习PHP面向对象的两个方向: 面向对象技术的语 面向对象的编程思想
什么是面向对象
面向对象 对象的概念是面向对象技术的核心。
在现实世界里,我们面 对的所有事物都是对象,如计算机、电视机、自行车等在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
面向对象的三个主要特性:
对象的行为:可以对对象施加哪些操作;如电视机的开、关、转换频道等。
对象的状态:当施加那些方法时,对象如何响应;如电视机的外形、尺寸、颜色等;
对象的标识:如何区分具有相同行为与状态的不同对象。
类和对象之间的关系
类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对对象的抽象就是类.类描述了一组有相同特性 (属性)和相同行为(方法)的对象。
什么是类:
具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也以说类的实例是对象,类实际上就是一种数据类型。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。 什么是对象: 在客观世界里,所有的事务都是由对象和对象之间的联系组成的。对象是系统中用来描述客观事物的一个实体,他是构成系统的一个基本单位。
类的声明
简单格式:
[修饰符] class 类名 //使用class关键字加空格后加上类名
{ [成员属性] //也叫成员变量
[成员方法] //也叫成员函数
}
完整格式:
[修饰符] class 类名 [extends 父类] [implements 接口1[,接口 2…]]
{ [成员属性] //也叫成员变量
[成员方法] //也叫成员函数
}
成员属性
格式: 修饰符 $变量名[=默认值]; //如:public $name=”zhangsan”; 注意:成员属性不可以是带运算符的表达式、变量、方法或函数调用
常用属性修饰符:public、protected、private、static、var(过时)
public $var6 = 100; //普通数值(4个标量:整数、浮点数、布尔、字串)
public $var6 = myConstant; //常量
public $var7 = self::classConstant; //静态属性
public $var8 = array(true, false); //数组
通过类实例化对象
实例化对象
对象类型在内存中的分配
对象中成员的访问
特殊的对象引用”$this”
构造方法与析构方法
实例化对象
当定义好类后,我们使用new关键字来生成一个对象。
$对象名称 = new 类名称();
$对象名称 = new 类名称([参数列表]);
由于对象资料封装的特性,对象属性(类中定义的变量)是无法由主程序区块直接来访问的,必须通过对象来调用类中所定义的属性和行为函数,间接地达成存取控制类中资料的目的。
对象类型在内存中的分配
对象是实际存在的,占有动态资源。
类是对象的蓝图,可能占有静态资源。
对象属性占有动态资源 类(静态)属性实际上是有类名字空间上的“全局变量” 性能考虑:
每个对象要单独占用数据空间
增加的调用层次可能消耗执行时间
对象中成员的访问
类中包含成员属性与成员方法两个部分,我们可以使用“new”关键字来创建一个对象,即:$引用名 = new 类名(构造参数);那么我们可以使用特殊运算符“->”来访问对象中的成员属性或成员方法。如:
$引用名 = new 类名(构造参数);
$引用名->成员属性=赋值; //对象属性赋值
echo $引用名->成员属性; //输出对象的属性
$引用名->成员方法(参数);//调用对象的方法
如果对象中的成员不是静态的,那么这是唯一的访问方式。
特殊的对象引用”$this”
特殊对象的引用$this就是在对象内部的成员方法中,代表本对象的一个引用,但只能在对象的成员方法中使用,不管是在对象内部使用$this访问自己对象内部成员。还是在对象外部通过对象的引用名称访问对象中的成员,都需要使用特殊的运算符“->”来完成访问。**
构造方法与析构方法
构造函数:
大多数类都有一种称为构造函数的特殊方法。当创建一个对象 时,它将自动调用构造函数,通常用它执行一些有用的初始化任务。
构造函数的声明与其它操作的声明一样,只是其名称必须是两 个下划线construct( )。这是PHP5中的变化;PHP4的版本中, 构造函数的名称必须与类名相同。为了向下兼容,如果一个类 中没有名为construct( )的方法,PHP将搜索一个与类名相 同的方法。
格式: [修饰符] function __construct ( [参数] )
{ … …
}
析构函数**:
与构造函数相对的就是析构函数。析构函数是PHP5新添加的内容,在PHP4中没有析构函数。析构函数是在对象被销毁之前自动调用的方法,主要执行一些特定的操作,例如关闭文件,释放结果集等。 与构造函数的名称类似,一个类的析构函数名称必须是两个下划线 _ _destruct( )。析构函数不能带有任何参数。 例如:
封装性
设置私用成员
私有成员的访问
set()、get()、isset()和unset()四个方法
封装性是面向对象编程中的三大特性之一,封装就是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节,以达到对成员的访问控制(切记不是拒绝访问)。 这是PHP5的新特性,但却是OOP语言的一个好的特性。而且大多数OOP语言都已支持此特性。
PHP5支持如下3种访问修饰符:
public (公有的 默认的)
private (私有的)
protected (受保护的)
**
set()get()isset()和unset()
魔术方法:
__set(): 用于替代通用的set赋值方法
__get(): 用于替代通用的get取值方法
__isset(): 检测对象中成员属性是否存在
__unset(): 销毁对象中成员属性方法
**
__set( )方法:
格式
[修饰符] function __set(string $name,mixed $value){
… }
当我们直接为一个对象中非公有属性赋值时会自动调用此方法,并将属性名以第一个参数(string),值作为第二参数(mixed)传进此方法中。
__get( )方法:
格式:
[修饰符] function __get(string $name){
… }
当我们直接输出一个对象中非公有属性时会自动调用此方法,并将属性名以第一个参数传进去。
__isset( )方法:
格式:
[修饰符] function __isset(string $name){
… }
当使用isset()或empty()判断一个对象的私有或受保护的属性是否存在时,会自动调用此方法。参数name表示被判断的属性名。
__unset( )方法:
格式:
[修饰符] function __unset(string $name){
… }
当使用unset( )销毁一个对象的私有或受保护的属性时,自动调用此方法,并将属性名以第一个参数传进去。
异常处理
异常(Exception)处理用于在指定的错误发生时改变脚本的正常流程。是PHP5中的一个新的重要特性。异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。
异常处理格式:
try{ 使用try去包含可能会发生异常的代码. 一旦出现异常try进行捕获异常,交给catch处理。 抛出异常语句:throw 异常对象。 }
catch(异常对象参数){ 在这里做异常处理。
}[catch(。,,){ .. .. .. }]
PHP中类与对象的相关函数**
- class_exists — 检查类是否已定义
格式: bool class_exists ( string $class_name [, bool $autoload ] )
—如果由 class_name 所指的类已经定义,此函数返回 TRUE,否则返回 FALSE。
默认将会尝试调用 autoload,如果不想让 class_exists() 调用 autoload,可以将 autoload 参数设为 FALSE。 - get_class_methods — 返回由类的方法名组成的数组
格式:array get_class_methods ( mixed $class_name )
返回由 class_name 指定的类中定义的方法名所组成的数组。如果出错,则返回 NULL。
从 PHP 4.0.6 开始,可以指定对象本身来代替 class_name - get_class — 返回对象的类名
格式: string get_class ([ object $obj ] )
返回对象实例 obj 所属类的名字。如果 obj 不是一个对象则返回 FALSE。
4. get_object_vars — 返回由对象属性组成的关联数组
格式:array get_object_vars ( object $obj )
返回由 obj 指定的对象中定义的属性组成的关联数组。
5. get_parent_class — 返回对象或类的父类名
格式:string get_parent_class ([ mixed $obj ] )
如果 obj 是对象,则返回对象实例 obj 所属类的父类名。
6. is_a — 如果对象属于该类或该类是此对象的父类则返回 TRUE
格式:bool is_a ( object $object , string $class_name )
我们可以使用运算符: instanceof代替上面的is_a操作
- method_exists — 检查类的方法是否存在
格式:bool method_exists ( object $object , string $method_name )
如果 method_name 所指的方法在 object 所指的对象类中已定义,则返回 TRUE,否则返回 FALSE。 - property_exists — 检查对象或类是否具有该属性
格式:bool property_exists ( mixed $class , string $property )
本函数检查给出的 property 是否存在于指定的类中(以及是否能在当前范围内访问)。