尽管面向对象技术经过了多年的洗礼和成长,而异常这个机制却是最近才加入到PHP中的。异常提供了一个错误控制机制,它相对与传统的PHP的错误句柄来说提供了更高等级的控制。
以下例举了一些与“常规”PHP错误与异常的不同:
另一种在PHP 5中加入的信特性就是接口与抽象类。它们的作用是用来创建强制性基于一些设计的类。一个抽象类本质上来说就是定义一个特殊类型整体的骨架——举例来说,可以使用一个抽象类定义一个基本的“车”的概念,拥有两扇车门,一个锁和可以解锁与闭锁的方法。抽象类不能实例化,但是可以被继承,因此继承下来的抽象方法将在子类中进行具体化。例如:
abstract class DataStore_Adapter
{
private $id;
abstract function insert();
abstract function update();
public function save()
{
if (!is_null($this->id)) {
$this->update();
} else {
$this->insert();
}
}
}
class PDO_DataStore_Adapter extends DataStore_Adapter
{
public __construct($dsn) {
//...
}
public insert() {
//...
}
public update() {
//...
}
}
作者提示:类中只要出现抽象方法,则此类必须要声明为abstruct。
如上代码所示,定义了一个Data_Adapter的类,同时定义了两个抽象方法insert()和update()。需要提醒的是,这两个方法都没有身体(Siemen注:也就是没有实现)——这是抽象类的必备条件之一—也就是为什么类本身会被修饰成abstract,其原因就是需要满足解释器语法需要。用PDO_DataStore_Adapter类继承DataStore_Adapter,而其PDO_DataStore_Adapter类实现了insert()与update()也就不再是抽象类了。
根据PPP,PHP5也实现了静态方法与属性。与普通的方法与属性不同,是以静态的方式存,作为类本身的一部分访问,与只存在于实例中相反。这样允许类当成是一个容器与函数与数据进行交互——从另一方面看这是对付函数命名冲突的非常有效的方法。
在PHP4中允许使用::操作符来把类中的任何方法作为静态方法调用(官方的Paamayim Nekudotayim——希伯来语,意思是“双冒号”),PHP5中把这个区分开来了,只有被static修饰的属性和方法才可以这样访问和使用。
PHP对于静态属性非常严格;如果使用->来访问静态变量或者属性(比如 $obj->propertiy)就会提示一条“strict standards”的信息和一个提示。使用非静态的方法的途径调用静态方法将会得到一个“strict standard”的消息。
class foo {
static $bar = "bat";
public static function baz() {
echo "Hello World";
}
}
$foo = new foo();
$foo->baz();
运行结果:
Hello WorldPHP Strict Standards: Accessing static property foo::$bar as nonstatic in PHPDocument1 on line 17 Strict Standard: Accessing static property foo::$bar as non static in PHPDocument1 on line 1
Siemen注,实际测试中并没有发现这个消息,只是看到了一个提示,显示说变量不存在。
有必要给静态的变量或者方法修饰作用域,如果不修饰,默认为public。
正如我们之前提到的,类可以包含方法与变量(属性)。定义一个方法就像定义一个函数一样:
class myClass {
function myFunction() {
echo "You called myClass::myFunction";
}
}
使用->指令操作符从一个类的外部调用其内部的方法:
$obj = new myClass(); $obj->myFunction();
理所当然,对象$obj是唯一能够访问类内部代码的途径——可是,如果我们想在类内部调用自己的方法应该如何做呢?可以这样:
class myClass {
function myFunction() {
echo "调用了myClass::myFunction";
}
function callFunction() {
// ???
}
}
很明显,callMyFunction()需要一种可以在类内部调用myFunction()的途径。根据这类需求,PHP中定义了一个特殊的变量$this;这个变量在对象内部,永远指向本类:
class myClass {
function myFunction($data) {
echo "The value is $data";
}
function callMyFunction($data) {
// 调用myFunction()
$this->myFunction($data);
}
}
$obj = new myClass();
$obj->callMyClass(123);
结果就是“The value is 123”。
本章的目标并不是想成为介绍面向对象技术的手册,只是希望快速的过一遍最基础的部分。
OOP的概念是按照自然逻辑将代码与数据封装起来称为类(classes)。这个过程经常是引用封装,或者是隐藏信息,因为它的目的是将一个应用划分到各个分离的对象(Siemen注:类实例化的产物)当中,而当对象改变时不会影响到不相关的内容。
因此,类实质上是表现为一组函数(也可以称为方法)与变量(也可以称为属性)因为相互的联系而组织的对外界的表现形式。重点理解类仅仅只能是蓝图而不能直接使用——必须经过实例化成可以与应用其他部分相互配合的对象。你可以想象成类是汽车的设计蓝图,而对象则是实际意义上的汽车,汽车按照蓝图从生产线上下来成为可以具体操作的实体汽车。工厂根据蓝图,可以生产任意数量的实体汽车,同理,根据类,也可以实例化任意数量的对象。
面向对象技术也许是PHP5中最终也是最具深远影响力的特性。这不是对之前版本的垄断,而是增强了PHP4的OOP特性,使得PHP5成为非常实用的面向对象语言——还有,让你的生活更加美好。
如果非要解释为什么PHP会成为世界上最流行的WEB开发语言,本章内容就很好的阐述了这个问题。它拥有众多惊人特性与很多扩展协同工作,比如Web Services,在易用性比其他平台更胜一筹——而创建一个多层次交互的网络应用,只需要如此少的付出成本使得创建一个动态网站变得非常容易和轻松。
作者提示:请记住那些我们在章节中提到的很多安全问题请阅读安全章节了解细节。
这些知识对于PHP开发非常有用,因此考试也会经常涉及,甚至是从不同观点出发。你应该记住以备考试时用到。
正如我们在第一章节中提到的,服务器对于HTTP请求首先发送一组响应头信息,这组头信息包含了很多有关数据,以及其他细节。他们以简单的字符串形式key: value,使用换行分隔。
尽管PHP与WEB服务器会自动发送预处理这些头信息,有时候会有重写或发送一个新的头信息的需求。
这非常容易办到——你需要做的就是调用header()函数并提供对应格式的头信息。唯一需要注意的是(事实上我们仅仅需要发送一个有效的头信息)在调用header()之前不要有任何的输出,在PHP标签外的空格或者空行,包括所有的HTML与PHP的输出。如果头信息没有遵循了这些规则,那么这两件事情会发生:头信息没有任何作用,还有PHP可能会输出一个错误。
作者提示:如果输出缓存是打开的状态,有可能会把头信息随着一些数据的输出而被带出来。如此一来,代码被放在随时可以打开或者关闭的透明状态,是非常糟糕的。
大多数情况下,脚本中会配合两种HTTP请求方式的其中一种:GET和POST。从技术的角度上来说,这两种方式主要的区别就是后者可以作为数据的载体,而前者只能把数据作为query放在url中传送。
当然,这并不是说表单就一定不能用GET方式递交——只是用这种方式时在数据的长度与数据的类型上有局限。例如,使用POST方式可以用来上传一个文件,而大多数浏览器都会对query的长度作出限制。
作者提示:与流行的说法正好相反,使用POST递交数据并不会比使用GET来的更加安全。这点我们会在安全这一章来讲述。