自PHP 5起完全重写了对象模型。PHP 5中的新特性包括访问控制、抽象类和final类方法,附加的魔术方法,接口,对象复制和类型约束。
基本概念
class
每个类的定义都以关键字class开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
一个类可以包含有属于自己的常量、变量(“属性”)以及函数(“方法”)。
例:
class SimpleClass
{
// property declaration
public $var = 'a default value' ;
// method declaration
public function displayVar () {
echo $this -> var ;
}
}
当一个方法在类定义的内部被调用时,有一个可用的伪变量
this。
this是一个到主叫对象的引用。
new
要创建一个类的实例,必须使用new关键字。
在类内部可以用new self 和 new parent创建新对象。
extends
一个类可以在声明中用extends关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。被继承的方法和属性可以通过同样的名字重新声明被覆盖。但是如果父类定义方法时使用了final,则该方法不可被覆盖。可以通过parent::来访问被覆盖的方法或属性。当覆盖方法时,参数必须保持一致否则会发出错误。构造函数除外,构造函数可在被覆盖时使用不同的参数。
::class
关键词class也可用于类名的解析。
属性
属性声明是由关键字public、protected、private开头。
在类的成员方法里面,可以用->(对象运算符)的方式来访为非静态属性;静态属性则是用::(双冒号)来访问。
类常量
自动加载类
定义_autoload()函数,它在试图使用尚未定义的类时自动调用。
function __autoload ( $class_name ) {
require_once $class_name . '.php' ;
}
$obj = new MyClass1 ();
$obj2 = new MyClass2 ();
构造函数和析构函数
构造函数
void __construct([mixed
args[,
…]])
具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在适用对象之前做一些初始化工作。
Note:如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类中调用parent::__construct()。如果子类没有定义构造函数则会从父类中继承。
析构函数
void __destruct(void)
析构函数会在某个对象的所有引用都被删除或者对象被显式销毁时执行。
访问控制(可见性)
public,被定义为公有的类成员可以在任何地方被访问。
protected,被定义为受保护的类成员可以被其自身以及其子类和父类访问。
private,被定义为私有的类成员则只能被其定义所在的类访问。
对象继承
范围解析操作符(::)
范围解析操作符用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。当在类之外引用这些项目时,要使用类名。
self、parent、static这三个特殊的关键字是用于在类的定义的内部对其属性或方法进行访问的。
Static(静态)关键字
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。伪变量$this在静态方法中不可用。
静态属性不可以由对象通过->操作符来访问。
抽象类
对象接口
接口是通过interface关键字来定义的,就像定义一个标准的类一样,但其中所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。
实现(implements)
Traits
Traits是一种为类似PHP的单继承语言而准备的代码复用机制。
笔者也不是很理解,后续给出详细解释。
重载
重载(overloading)是指动态地“创建”类属性和方法。所有的重载方法都必须被声明为public。
属性重载
方法重载
遍历对象
foreach
Iterator接口
IteratorAggregate接口
魔术方法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state() 和 __clone() 等方法在 PHP 中被称为”魔术方法”(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
Final关键字
对象复制
对象复制可以通过clone关键字来完成。
对象比较
当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。
而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。
类型约束
后期静态绑定
对象和引用
对象序列化
所有php里面的值都可以使用函数 serialize() 来返回一个包含字节流的字符串来表示。 unserialize() 函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
<?php
// classa.inc:
class A {
public $one = 1 ;
public function show_one () {
echo $this -> one ;
}
}
// page1.php:
include( "classa.inc" );
$a = new A ;
$s = serialize ( $a );
// 把变量$s保存起来以便文件page2.php能够读到
file_put_contents ( 'store' , $s );
// page2.php:
// 要正确了解序列化,必须包含下面一个文件
include( "classa.inc" );
$s = file_get_contents ( 'store' );
$a = unserialize ( $s );
// 现在可以使用对象$a里面的函数 show_one()
$a -> show_one ();
?>