虽然 PHP5 还没有正式发布(开发版本已经提供下载),但我们现在就可以开始体验一下新的版本 将要带给我们的惊喜。在以下的介绍中,我们将重点讲述PHP5 中的三大特色功能。这三大特点为:

* 新的对象模式 (New Object Mode)

* 异常处理 (Exceptions)

* 名称空间 (Namespace)

在开始之前,要声明两点:

* 文章中的例子为了说明如何操作,有些部分使用了 PHP4 的表现手段,这仅仅是为了提高文章的可读性。* 文章中描述的部分与 PHP5 的最终发布版可能会有一些出入

在 PHP5 没有最终正式发布前,你可以随时从 http://snaps.php.net 下载到最新的编译版本来亲自体验一下 PHP5 所带给我们这些崭新的功能。

新的对象模式

PHP5 中的对象已经进行了较系统、较全面的调整,现在的样子可能看起来会有些类似于 Java。本小节着重讲述 PHP5 中新的对象模式,并举了一些较简易的例子来说明。就让本节成为你的 PHP5 之旅的一个新起点吧。

* 构造函数和析构函数

* 对象的引用

* 对象的克隆

* 对象中的私有、公共及受保护模式

* 接口 (Interfaces)

* 抽象类

* __call

* __set 和 __get

* 静态成员

构造函数和析构函数

在 PHP4 中,当函数与对象同名时,这个函数将成为该对象的构造函数,并且在 PHP4 中没有析构函数的概念。

在 PHP5 中,构造函数被统一命名为 __construct,并且引入了析构函数的概念,被统一命名为 __destruct。

例一:构造函数和析构函数

x = $x;

}

function display() {

print($this->x);

}

function __destruct() {

print("bye bye");

}

}

$o1 = new foo(4);

$o1->display();

?>

在上面的例子中,当你终止调用 foo 类的时候,其析构函数将会被调用,上例中会输出 “bye bye”。

对象的引用

众所周知,在PHP4 中,传递变量给一个函数或方法,实际是把这个变量做了一次复制,也就意味着你传给函数或方法的是这个变量的一个副本,除非你使用了引用符号 “&” 来声明是要做一个引用,而不是一个 Copy。在 PHP5 中,对象总是以引用的形式存在的,对象中的赋值操作同样也都是一个引用操作。

例二:对象的引用

x = $x;

}

function getX() {

return $this->x;

}

}

$o1 = new foo;

$o1->setX(4);

$o2 = $o1;

$o1->setX(5);

if($o1->getX() == $o2->getX()) print("Oh my god!");

?>

对象的克隆

如上所述,当一个对象始终以引用的形式来被调用时,如果我想得到该对象的一个副本,该怎么办呢?PHP5 提供了一个新的功能,就是对象的克隆,语法为 __clone。

例三:对象的克隆

x = $x;

}

function getX() {

return $this->x;

}

}

$o1 = new foo;

$o1->setX(4);

$o2 = $o1->__clone();

$o1->setX(5); if($o1->getX() != $o2->getX()) print("Copies are independant");

?>

对象克隆的方法在其它很多应用程序语言中都是存在的,所以你不必担心它的稳定性。

对象中的私有、公共及保护模式

PHP4 中,一个对象的所有方法和变量都是公共的,这意味着你可以在一个对象的外部操作其中的任意一个变量和方法。PHP5 引入了三种新的用来控制这种存取权限的模式,它们是:公共的(Public)、受保护的(Protected)及私有的(Private)。

公共模式(Public):允许在对象外部进行操作控制。私有模式(Private):只允许本对象内的方法对其进行操作控制。受保护模式(Protected):允许本对象及其父对象对其进行操作控制。

例四: 对象中的私有、公共及受保护模式

private_foo(); //Ok because we are in the same class we can call private methods

print("I'm protected");

}

private function private_foo() {

$this->x = 3;

print("I'm private");

}

}

class foo2 extends foo {

public function display() {

$this->protected_foo();

$this->public_foo();

// $this->private_foo(); // Invalid! the function is private in the base class

}

}$x = new foo();

$x->public_foo();

$x->protected_foo(); //Invalid cannot call protected methods// outside the class and derived classes

$x->private_foo(); //Invalid private methods can only be used// inside the class $x2 = new foo2();

$x2->display();

?>

提示:对象中的变量总是以私有形式存在的,直接操作一个对象中的变量不是一个好的面向对象编程的习惯,更好的办法是把你想要的变量交给一个对象的方法去处理。

接口 (Interfaces)

众所周知,PHP4 中的对象支持继承,要使一个对象成为另一个对象的派生类,你需要使用类似 “class foo extends parent” 的代码来控制。 PHP4 和 PHP5 中,一个对象都仅能继承一次,多重继承是不被支持的。不过,在 PHP5 中产生了一个新的名词:接口,接口是一个没有具体处理代码的特殊对象,它仅仅定义了一些方法的名称及参数,此后的对象就可以方便的使用 'implement' 关键字把需要的接口整合起来,然后再加入具体的执行代码。

例五:接口

<?php

interface displayable {

function display();

}

interface printable {

function doprint();

}

class foo implements displayable,printable {

function display() {

// code

} function doprint() {

// code

}

}

?>

这对提高代码的可读性及通俗性有很大的帮助,通过上面的例子可以看到,对象 foo 包含了 displayable 和 printable 两个接口,这时我们就可以清楚的知道,对象 foo 一定会有一个 display() 方法和一个 print() 方法,只需要去了解接口部分,你就可以轻易的操作该对象而不必去关心对象的内部是如何运作的。

抽象类

抽象类不能被实例化。抽象类与其它类一样,允许定义变量及方法。抽象类同样可以定义一个抽象的方法,抽象类的方法不会被执行,不过将有可能会在其派生类中执行。

例六:抽象类

x = $x;

}

}

class foo2 extends foo {

function display() {

// Code

}

}

?>

__call

PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。

例七:__call

doStuff();

$x->fancy_stuff();

?>

这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。

例八:使用 __call 实现“过载”动作

foo_for_int($arguments[0]);

if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);

}

} private function foo_for_int($x) {

print("oh an int!");

} private function foo_for_string($x) {

print("oh a string!");

}

} $x = new Magic();

$x->foo(3);

$x->foo("3");

?>

__set 和 __get

这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。

例九: __set 和 __get

bar = 3;

print($x->winky_winky);

?>

类型指示

在 PHP5 中,你可以在对象的方法中指明其参数必须为另一个对象的实例。

例十:类型指示

process_a_foo($f);

?>

可以看出,我们可以显性的在参数前指明一个对象的名称,PHP5 会识别出这个参数将会要是一个对象实例。

静态成员

静态成员和静态方法在面象对象编程的术语中被称作 “对象方法(class methods)” 和 “对象变量(class variables)”。

“对象方法” 在一个对象没有实例化前允许被调用。同样,“对象变量” 在一个对象没有实例化前可以被独立操作控制(不需要用一个对象的方法来控制)。

例十一:对象方法和对象变量

<?php

class calculator {

static public $pi = 3.14151692;

static public function add($x,$y) {

return $x + $y;

}

}

$s = calculator::$pi;

$result = calculator::add(3,7);

print("$result");

?>

异常处理

异常处理是公认的处理程序错误的理想方法,在 Java 及 C++ 中都有这个概念,我们欣喜的看到,在 PHP5 已经加入了这方面的应用。你可以尝试使用 “try” 和 “catch” 来控制程序的错误

divide(3,0);

} catch (Exception $e) {

echo $e->getMessage();

echo "n

n";

// Some catastrophic measure here

}

?>

上例中,我们使用了 “try” 来执行花括号中的语句,当有错误发生的时候,代码会把错误交给 “catch” 子句来处理,在 “catch” 子句中,你需要指明要把错误交给某个对象处理,这样做可以使代码结构看起来更清晰,因为现在我们可以把所有的错误信息交给一个对象来处理。

自定义错误处理

你可以很方便的用自定义的处理错误的代码来控制你的程序中的意外。你仅仅需要从异常类中派生出一个自己的错误控制类,在你自己的错误控制类中,你需要有一个构造函数和一个 getMessage 方法,以下是一个例子。

例十三:自定义错误处理

data = $data;

}

function getMessage() {

return $this->data . " caused a weird exception!";

}

}

?>

现在我们可以使用 “throw new WeirdProblem($foo)” 来抛出一个错误句柄,如果错误在 “try” 的代码块中发生,PHP5 会自动把错误交给 “catch” 部分来处理。

名称空间

名称空间对类的分组或函数分组很有用。它可以把一些相关的类或函数给组合到一起,方便以后调用。

例十四:名称空间

<?php

namespace Math {

class Complex {

//...code...

function __construct() {

print("hey");

}

}

} $m = new Math::Complex();

?>

注意你需要在何种情况下使用名称空间,在实际运用中,你可能会需要声明两个或多个名称一样的对象来做不同的事情,那么你就可以把他们分别放到不同的名称空间中去(但接口是要相同的)。

译者注:本篇文章来自 PHPbuilder,从以上文字中我们高兴的看到 PHP5 中新增加的一些优秀的功能。我们还可以看到一些 Java 和 C++ 的影子,现在的 PHP5 还没有正式发布,等到真正发布那一天,希望能再带给所有的 PHP 爱好者更多的惊喜。对这方面比较感兴趣的朋友可以登录 PHP 官方新闻组去了解更新情况。新闻组地址为 news://news.php.net ,也可以登录WEB界面 http://news.php.net 来访问。让我们一起来期待新版本的发布吧。:)

【编辑推荐】

【责任编辑:李明源 TEL:(010)68476606】

php实例新讲php,实例讲解PHP5 新特性相关推荐

  1. python多线程爬虫实例-python多线程爬虫实例讲解

    Python作为一门强大的脚本语言,我们经常使用python来写爬虫程序,简单的爬虫会写,可是用python写多线程网页爬虫,应该如何写呢?一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把 ...

  2. 触发器实例精讲-志在必得

    SQL触发器实例精讲,必看必会 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.        常见的触发器有 ...

  3. 视频教程-C++游戏编程实例精讲--3D射击游戏作弊-C/C++

    C++游戏编程实例精讲--3D射击游戏作弊 80后,游戏作弊工程师,从事C++开发14年,擅长语言:C,C++ 领域:服务器开发,精通MFC,STL,Boost,熟悉TCP/IP协议,熟练运用IOCP ...

  4. python生成一个窗口_PyQt5创建一个新窗口的实例

    更多python教程请到友情连接: 菜鸟教程www.piaodoo.com 人人影视www.sfkyty.com 飞卢小说网www.591319.com 韩剧网www.op-kg.com 兴化论坛ww ...

  5. 如何从类型创建新的对象实例

    在编译时可能并不总是知道对象的Type ,但可能需要创建Type的实例. 如何从Type获取新的对象实例? #1楼 public AbstractType New {get{return (Abstr ...

  6. python csv读取数据 去掉标题-Python读csv文件去掉一列后再写入新的文件实例

    用了两种方式解决该问题,都是网上现有的解决方案. 场景说明: 有一个数据文件,以文本方式保存,现在有三列user_id,plan_id,mobile_id.目标是得到新文件只有mobile_id,pl ...

  7. java的继承实例_java继承(实例讲解一)

    Java继承(Java inheritance) Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类.这种技术使 ...

  8. oracle添加已有的实例,Oracle数据库怎么添加新的实例?,oracle实例

    Oracle数据库怎么添加新的实例?,oracle实例 安装Oracle时如果不指定SID,系统会默认设置为orcl,如果在安装过程中忘记修改了服务名,或者需要添加新的服务名(实例名),本文将讲述如何 ...

  9. python程序实例讲解_python入门编程实例 python入门编程实例解析

    python入门编程实例 python入门编程实例解析 python入门编程实例及解析: 题目:有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十 ...

最新文章

  1. 深入理解DIP、IoC、DI以及IoC容器
  2. 【动态规划】数字金字塔
  3. 计算器小程序java课程设计,java课程设计----计算器小程序报告.doc
  4. MATLAB中的max函数的用法及含义
  5. 经典:趣解什么叫网关?
  6. 《矩阵分析》代码Ⅱ——gauss消元法,列主元素法,总体主元素法matlab实现
  7. java数组使用实验报告_Java课程实验报告实验六——异常处理
  8. delphi2007 注册码
  9. 一个被数字化的职场技术人
  10. 基于点锐度的清晰度算法 EAV
  11. 一次简单的PC游戏汉化
  12. VulnHub靶场系列:Flick
  13. matlab建模DNA双链,PPT绘制科研图形—DNA双链、分子细胞模型
  14. CentOS7 安装 RabbitMQ 3.6(方法适用于安装任意版本 RabbitMQ)
  15. 2021年中国电力行业供需情况分析,市场化改革加速推进「图」
  16. 美泰推出首款获CarbonNeutral(R)认证的Matchbox(R) Tesla Roadster压铸模型车,使用99%的回收材料制作,彰显品牌的发展蓝图
  17. 程序设计语言-软件设计(二十一)
  18. Linux连接外网(方式一)
  19. Linux调整风扇,Linux下风扇调速
  20. mysql 分组查询 语句_详解MySQL中的分组查询与连接查询语句

热门文章

  1. 德勤发布最新元宇宙报告:愿景、技术和应对
  2. 个性化推荐与知识图谱在剧本杀行业的应用与实践
  3. 旅行场景下的推荐算法探索
  4. 【干货】2021新消费品牌STEP增长方法论:品牌营销与生意增长Playbook.pdf(附下载链接)...
  5. 【报告分享】2020中国电商直播粉丝价值研究报告.pdf(附下载链接)
  6. 软件设计师学习1——计算机系统知识
  7. 浙大 PAT 乙级1056
  8. python数据库管理软件_数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接 - Python社区...
  9. 如何更换清华源_树莓派中国软件源
  10. 花书+吴恩达深度学习(三)反向传播算法 Back Propagation