全部博文(2065)
分类:
2010-01-07 10:54:19
php面向对象编程介绍
[整理:hkebao#126.com 整理时间:
编程语言引入面向对象只为了解决两个问题:代码的可扩展性、代码的可维护性。
一、PHP5面向对象基础
类:对一类事物描述,是抽象的、概念上的定义。定义一个类并没有在计算机的内存空间分配内存地址。
对象:也称实例。表示实实在在存在的个体。即初始化一个对象的时候其实就已经创建了一个内存地址。
在PHP5里面我们定义类与初始化对象的方法如下:
class Person {
}
$object = new
Person();
1.1 属性介绍
属性:用来描述对象的数据元素。简单理解就是一个对象的静态的特征。
在PHP5里面其实属性就是在类中声明的变量。在声明变量的时候要使用public private protected作修饰。
即定义好变量的访问权限。
其中:
Public 表示可以自由的在类的内部、外部读取与修改
Private 只能在类内部读取与修改
Protected 能够在这个类和类的子类读取与修改
属性的使用:
对象引用: ->
方法内部:$this ->
示例:定义一个类包含三种类型的变量访问权限即public与 private及protected
class Person {
public $name = 'name';
private $age = 'age';
protected $sex = 'sex';
}
$object = new
Person();
echo
$object->name; //打印 name
echo
$object->sex; //报错
echo
$object->age; //报错
属性赋初值:
在PHP里面共有八种类型的分别为:
数值类型
Boolean
布尔类型
Integer 整型
Float 浮点型
String 字符串
复合类型
Array 数组
Object 对象
特殊类型
Resource 资源
Null
示例:
class Person {
public $name = 'name';
private $age = 'age';
protected $sex = 'sex';
public $a = true;
public $b =
array('a'=>'a','b'=>'b');
}
但是要注意:属性里面不支持以下三种类型
对象类型、资源类型、属性的属性
即如下的方式是不合法的
class A{}
class Person {
public $a = 'a';
public $c = new A(); //用类初始化不合理
public $b = $this->a; //属性的属性
public $d = opendir("."); //资源类型的变量
}
1.2 变量与引用变量
普通类型的变量的传值方法就是值传递。像整数、字符型等
而指向对象的变量,是一个引用变量。即这个变量存储的是内存地址。它在传值的时候传递的是这个对象的指向。而非复制对象。
即 : $p1 = new A();
$p2 = $p1;
表示$p1与$p2 同时都指向同一个对象A
简单的理解:我们把$p1与$p2都想像成遥控器。如果$p1换台了那$p2 是不是也要跟着换过来。因为电视机只有一台!
1.3 PHP里面的方法
方法:对对象的属性进行的操作就叫方法。就是一个对象的动态行为。
一般我们的设计方式是:将数据封装即类的属性声明为私有的。然后通过公开的方法对其属性操作这样就可以有利地隐藏一个类的实现细节。
PHP里面实现与JAVABEAN的代码:
class Person {
private $bean;
public function getBean() {
return $this->bean;
}
public function setBean($bean) {
$this->bean = $bean;
}
}
1.4 对象之间的比较
区别PHP里面的三种等号分别为 =
赋值符号 == 等于符号 ===全等于符号
==表示两个对象有相同的属性和值。属于同一个类且被定义在相同的命名空间中,则两个对象相等。
这种比较只是简单的比较两个对象是否有相同的属性和值。
== 只是简单地比较了两个对象的内容是否一致。
如果使用===时,当且仅当两个对象指向相同类(在某一特定的命名空间中)的同一个对象时才相等。
不光是内容要一样而且要求两边的对象具有同样的内存地址。
即使两个对象的内容完全一样即属性与行为都一样也不能使===成立的!必须要是指向同一个对象。
$p1 = new Person();
$p2 = new Person();
$p1 === $p2 不成立
只有当$p3 = $p1
之后 这个时候的 $p3 === $p1 才会成立!
表示这两个是同一个对象了才能===成立!
1.5 构造函数
完成一些初始化工作用的。之前我们说过有些类型的值不能在属性中被赋值的。所以需要移到构造函数中去实现。
1.6 析构函数与PHP的垃圾回收机制
析构:当某个对象成为垃圾或当对象被显式销毁时执行!
例如:$p = new Person();
//显式将对象销毁掉
$p = null; 表示将对象直接销毁掉。这个时候就会调用GC垃圾回收器
二、进一步了解面向对象
2.1 类的继承
继承的作用就是实现对的类的复用。通过做继承能够使用已经定义的类中的方法与属性,即避免了编写重复的代码工作。
PHP中是单继承,一个类只可以继承一个父类,但一个父类可被多个子类所继承。其中在继承的过程中需要注意权限的控制不能继承父类私有属性与方法。而且类的构造函数也可以被继承。
注意:PHP里面的构造方法是能够被其他方法所调用的。
2.2 重写
如果继承下来的方法不能满足子类的特殊要求,可以对其进行改写处理。这个过程我们就可以叫方法的覆盖。在PHP里面如果要实现覆盖方法只需要保证方法的名称一样就行。没有必要对输入参数类型、数量返回值有过多的要求。只需要保证方法名称一样就行!因为PHP是弱类型语言
2.3 重载
当类中的方法名相同时,称为方法的重载。在PHP5中不支持重载
即我们在一个类中定义两个同名的方法是会报错的!
PHP5中有一个比较搞怪的事情:定义了一个方法有两个参数。我在调用的时候如果写上三个参数也能正常运行。如果只有一个参数也能运行不过会产生出来一个警告信息。
三、高级面向对象篇
3.1 static变量、方法
用来修饰属性、方法。我们可将其称为静态属性与静态方法。静态属性与方法与具体的对象是没有什么关系的只是与类相关,所以也可以被称为是类属性或类方法。既然与单独的对象无关就可以直接用类名::
调用。不过权限必须要允许。
类内部调用静态方法是:self::调用
类外部调用静态方法是:类名::调用
这些静态的属性与方法是在类被创建的时候就被创建了。其他的与实例相关的属性与变量是在对象创建的时候才会被创建的!
区别:self::与$this::
前者表示当前类的静态成员。想要调用静态的属性就可用self::
后者表示当前对象。所以$this 表示当前的对象与实例相关!
与JAVA里面的一样。静态方法不可调用非静态属性
其实想想可以理解:静态的东西是与类有关跟具体的实例没有关系。
切记:不可在static方法中使用$this 关键字。因为这个关键字是表示具体的实例有相的。
不过要注意一点:在静态方法中是能够调用非静态方法的。系统会将其转换成静态方法。利用SELF::
而且非静态方法中也可以调用静态方法的!
3.2 final 类、final方法和常量
Final关键字可以用于类、方法前。如果应用于类前面表示此类不可继承。如果放在方法前面表示方法不可覆盖。
方法:const PI = 3.14; 常量得用大写字母表示。不需要加$ 修饰符。而且定义常量的话一定要直接将值给其赋上。
调用方法与静态变量一样即通过 类名::常量名 而且要注意常量的值不可改变!
3.3 abstract类和abstract方法
我们可以使用abstract来修饰一个类或方法。这个其实与JAVA的概念一样的。被声明为抽象的类不能被初始化对象。定义为抽象的方法不可有实现体。
一般我们是在抽象类中定义抽象方法出来。这样我们定义抽象类才有意义可言!
定义为抽象的方法名称在子类覆盖的时候要注意只 需要保证参数数量一致就行。不要求参数名称一样!
PS:抽象类继承抽象类的时候,子类不可对其父类的抽象方法重写。
四、面向对象之接口与多态
4.1 接口定义与规范
接口:抽象方法与静态常量集合。即只包含了抽象方法的定义与静态常量定义。
接口定义:interface 接口名称
注意:全部的接口中的方法只能是public权限
也不可以用final与abstract 进行修饰。不过可以用static修饰。这就表示静态抽象方法
4.2 实现接口
要实现接口的方法就是用implements 类要实现一个接口就要实现其中的抽象方法。
而且要注意:一个类能够实现多个接口。
4.3 接口的继承
一个接口可以继承自另外的接口。
PHP中的类是单继承,但是接口是可以实现继承自多个接口的。
一个接口继承其它接口的时候,直接继承父接口的静态常量属性和抽象方法。
Interface news extends a,b {} 一个接口能够继承多个父接口
4.4 PHP5中的多态
一个类拥有其父类、和已实现接口的身份。
通过instanceof 运算符就能够判断当前实例是否可以有这样的一个形态。
调用格式为:实例名 instanceof 类名