¨对象和类的关系
PHP5已经完全支持面向对象
属性
¨在类定义中声明变量,即创建了类的属性
方法
¨在类定义中声明函数,即创建了方法
PHP中属性与方法的引用操作符是“ - > ”
$this
¨对象内部代表这个对象的引用
构造函数
¨function __construct ( [参数] ) { ... ... }
¨当创建一个对象时,它将自动调用构造函数
构造函数兼容
¨PHP4中,构造函数的名称必须与类名相同。
为了向下兼容,如果一个类中没有名为
__construct( )的方法,PHP将搜索一个与类名
相同的方法
析构函数
¨function __destruct ( ) { ... ... } ¨析构函数是 PHP5新添加的内容,在 PHP4中没
有析构函数
¨析构函数允许在销毁一个类之前执行的一些操
作或完成一些功能
¨析构函数不能带有任何参数
访问类型
¨这是PHP5的新特性,但却是OOP语言的一个
重要特性,而且大多数OOP语言都已支持。
PHP5支持如下 3种访问修饰符:
• public (公有的默认的)
• private (私有的)
• protected (受保护的)
• public
¨类的成员将没有访问限制,所有的外部成员都
可以访问(读和写)这个类成员
¨在PHP5之前的所有版本中,类的成员都是 public的
• private
¨对于该类的外部代码是不允许改变甚至读操作
¨对于该类的直接子类有访问权限
OOP三个基本特征
¨封装
¨继承
¨多态
封装
¨封装性就是把对象的属性和行为结合成一个独
立的相同单位,并尽可能隐蔽对象的内部细节。
¨将类的成员变量声明为 private,再通过public 的
方法来对这个变量进行访问
私有属性的访问
¨set/get方法
¨在PHP5中,预定义了两个函数__get()和
__set()来获取和赋值其属性,检查属性的
__isset()和删除属性的方法__unset()
__get()
n __set()
function __get($property_name) {
if(isset($this->$property_name)) {
return($this->$property_name);
} else {
return null;
}
}
function __set($property_name, $value) {
$this->$property_name = $value;
}
__isset()
n __unset()
function __isset($name) {
return isset($this->$name);
}
function __unset($name) {
unset($this->$name);
}
继承(is a) ¨在PHP中只有单继承,但一个类可以被多个类
继承
¨可以有多层继承,即一个类可以继承某一个类
的子类
¨子类继承父类的所有内容,但父类中的private部分不能直接访问
¨子类中新增加的属性和方法是对父类的扩展
覆盖
¨子类中定义的与父类同名的属性是对父类属性
的覆盖,同名的方法也是对父类方法的覆盖
¨子类中的访问权限>=父类权限
¨调用父类被覆盖的方法:类名::或parent::
parent::__construct();
parent::$name;
parent::fun();
多态
¨对象的多态性是指在父类中定义的属性或行为
被子类继承之后,可以具有不同的数据类型或
表现出不同的行为
¨在PHP中,多态的特性并不明显
包含(has a)
¨一个类中包含另一个类对象
final
¨使用final关键字标记的类不能被继承
¨使用final关键字标记的方法不能被子类覆盖
static
¨在类内部,不能用$this来引用静态变量或方
法,而需要用self来引用
self::$静态属性、self::静态方法
¨在类外部可以使用
类::$静态属性、类::静态方法
const
¨在类里面定义常量使用的是”const”
¨self::CONSTANT; // 类内部访问
¨类名::CONSTANT; // 类外部访问
__toString()
¨直接输出对象引用时自动调用
对象的比较
¨==是比较两个对象的内容
¨===是比较对象的句柄,即引用地址
n 对象类型检测
¨instanceof操作符用于检测当前对象实例是否
属于某一个类的类型
克隆对象
¨在PHP5中要创建一个对象的副本,使用关键
字clone来实现
¨$obj2 = clone $obj;
n __clone()
¨在对象克隆时自动调用
¨__clone()可以没有参数,它自动包含$this和
$that两个指针,$this指向复本,而$that指向
原本
__call()
¨调用不存在的方法时自动调用
n __autoload()
¨自动加载类
function __autoload($class_name) {
include("$class_name"."_class.php");
}
序列化
¨serialize()
¨unserialize()
抽象方法和抽象类
¨abstract function 方法名( );
¨abstract class 类名{ }
¨抽象类不能被实例化,一个抽象类中必须有一
个抽象方法
接口
¨如果在一个抽象类中包含的只有抽象方法,可
以将其定义为interface(接口)
¨class 类名implements 接口名{ }
¨接口中只能声明常量属性,接口中的方法必须
定义为公有、抽象
¨接口中的方法也可以声明为static