细察 PHP V5.3.0 特性

级别: 中级

Stephen B. Morris, CTO, Omey Communications

2009 年 12 月 07 日

随着流行的 PHP 语言的不断演变,很多新特性使它在面向对象方面有了进一步的增强。本文通过一些 PHP V5.3 实例演示延迟静态绑定、名称空间支持、类方法重载以及变量解析和 heredoc 支持。

需求

除了对 PHP 和 HTML 有基本的认识以外,无需太多其他方面的知识便可阅读本文。每当文中提到 PHP V5.3 时,指的是 V5.3.0。

考察的特性

本文主要考察 PHP V5.3 的以下特性:

  • 延迟静态绑定
  • 名称空间
  • 类方法重载
  • 变量解析和 heredoc

但是,在继续之前,需要设置 PHP V5.3。


回页首

设置

PHP 广为人知的一个特点就是设置起来有点麻烦。这也许是因为 PHP 是安装在 Web 服务器(例如 Apache)上的,而且常常需要连接到外部数据库(例如 MySQL)。而且,某种意义上,PHP 脚本是嵌入在 HTML 代码中的。换句话说,PHP 这种技术横跨多个复杂的领域。所以,在编写 PHP 脚本代码之前,必须越过很多的障碍。我希望可以改善这一现状,但是与软件技术有关的很多事情仍然很困难。

不过,对于那些使用 Apple Macs 的幸运读者来说,设置过程再简单不过了:

  1. 获得 PHP 二进制安装文件(http://www.entropy.ch/software/macosx/php/)。
  2. 在 System Preferences 中关闭 Web Sharing。
  3. 找到 /etc/apache2/httpd.conf 文件。
  4. 在 httpd.conf 文件中注释掉下面这行:LoadModule php5_module
  5. 运行 PHP V5.3 安装文件(如果您愿意,也可以构建源代码)。
  6. 在 System Preferences 中打开 Web Sharing。

本文的目的不是仅仅介绍如何安装,所以如果您的平台是 Microsoft® Windows® 或 Linux®,请参阅一些很棒的 PHP 参考书籍(见我在 参考资料 中推荐的书籍)。

为了检查 PHP 是否已安装以及版本是否合适,在 /Library/WebServer/Documents 文件夹中创建一个名为 phpinfo1.php 的文件。清单 1 展示了这个脚本文件的内容。本文中的所有脚本都在 下载 小节提供的压缩(ZIP)文件中,所以实际上不需要创建任何文件。

清单 1. phpinfo1.php

<?php
phpinfo();
?>

将该脚本文件放在 /Library/WebServer/Documents 文件夹中之后,访问 http://localhost/phpinfo1.php。应该可以看到类似图 1 的界面。这里可能需要用您主机的 IP 地址替换 URL 中的 “localhost”。

图 1. PHP V5.3.0 安装成功


回页首

延迟静态绑定

PHP V5.3 扩展了 static 关键词的使用。现在,无需实例化类便可访问静态类方法和属性。当类不存在对象,或者不需要对象时,这个特性就比较方便。清单 2 展示了延迟静态绑定的一个例子。

清单 2. 延迟静态绑定

<?php
class A {public static function who() {echo 'Calling who method from class '.__CLASS__;}public static function test() {static::who();}
}class B extends A {public static function who() {echo 'Calling who method from class '.__CLASS__;}
}B::test();
?>

清单 2 中的代码产生以下输出:

Calling who method from class B
增强面向对象

任何能增强 PHP 面向对象方面的改变都是受鼓励的,因为这将导致更可靠的设计和更易于维护的代码。对于清单 2 中的代码我有些许微词,基类(A)和派生类(B)中的 who() 方法是重复的。如果类 B 中不必复制该代码就好了,但是似乎 PHP V5.3.0 中的 __CLASS__ 语法要求必须这么做。也就是说,__CLASS__ 不支持延迟绑定。

清单 2 中使用 __CLASS__ 也许有点勉强,但确实可以说明 PHP V5.3.0 有一个小小的问题。显然,对于清单 2 中的例子,这不是多大的问题,但是对于有数千行 PHP 代码的网站来说,就没那么简单了。重复代码通常意味着重复劳动。

在 PHP V5.3.0 之前,类 A 中的方法可能被定义为 self::who()。不幸的是,这将导致调用类 A 中的函数,而不是子类 B 中的函数。PHP V5.3.0 用 static:: 关键词修复了这个问题,允许在运行时才引用之前调用的类方法。显然这就是清单 2 中代码的目的。


回页首

名称空间

PHP V5.3 提供名称空间功能,以增强该语言的封装能力。名称空间在现代语言中非常常见,例如 C# 和 XML。名称空间的主要优点是,通过它可以为代码符号(类、函数和常量)定义独立的容器,这听起来有点复杂,其实不然。清单 3 显示了使用 PHP 名称空间定义本地和全局字符串常量的一个例子。

清单 3. PHP 名称空间

<?php
namespace test;
define('ASTRING', 'Hello World!');
define('test/ASTRING', 'Hello World from my namespace!');echo "<p>My string is: ";
echo ASTRING;
echo "</p>";echo "<p>My string is ";
echo /ASTRING;
echo "</p>";
?>

清单 3 中的代码产生以下输出:

My string is: Hello World from my namespace!
My string is: Hello World!

那么,代码中发生了什么?第一个 define 语句在名称空间 test 中创建一个字符串常量 ASTRING。然后,当引用 ASTRING 字符串时,引擎首先查看本地 test 名称空间。这就是为什么看到本地定义的字符串首先显示。然后,要看到全局定义的字符串,只需使用语法 /ASTRING。有了这些简单的规则,便可以使用任意数量的名称空间,而不必担心名称冲突。

有了名称空间功能,和之前相比,代码之间的界限更加清晰。而这一点又有助于团队环境中的代码整合。换句话说,不同的团队可以分配他们自己的名称空间,当所有团队成员都遵循这个惯例时,名称冲突的情况应该会降为零。这也是 5.3.0 版对 PHP 语言在面向对象方面的一个增强。


回页首

类方法重载

在 PHP 中,术语重载(overloading) 与通常的面向对象上下文稍有不同。在 Java™ 语言或 C# 中,“重载” 方法是指为不同参数列表提供相同代码的方法。例如,如果有一个名为 draw(String str) 的方法,那么重载的方法可以有以下形式:draw(String str, int i)。这种方法符号名称被称作方法签名,为了便于重载,返回类型被省略。

在 PHP 中,“重载” 是指动态创建的方法和属性。这实际上是动态代码,任何这样的动态实体都是由所谓的魔术方法(magic methods) 来处理。可以在一个类中为各种不同的动作创建这些魔术方法。然后,当代码中遇到未声明或不可见的属性或方法时,便可以调用重载方法。这样风格的重载提供了很大程度上的灵活性。

听起来有些复杂,所以来看看一个具体的例子。清单 4 展示如何使用 PHP 重载调用对象和类方法。

清单 4. PHP 重载

<?php
class OverloadedMethodTest {public function __call($name, $arguments) {// The value of $name is case sensitive.echo "Calling object method '$name' ". implode(', ', $arguments)。 "/n";}/**  As of PHP 5.3.0  */public static function __callStatic($name, $arguments) {// The value of $name is case sensitive.echo "Calling static method '$name' ". implode(', ', $arguments)。 "/n";}
}$obj = new OverloadedMethodTest;
$obj->runOverloadedTest('in an object context');OverloadedMethodTest::runOverloadedTest('in a static context');  // As of PHP 5.3.0
?>

清单 4 中的代码产生以下输出:

Calling object method 'runOverloadedTest' in an object context
Calling static method 'runOverloadedTest' in a static context

在清单 4 中,注意重载的代码是如何根据调用代码来推断方法名和参数的:

$obj->runOverloadedTest('in an object context');OverloadedMethodTest::runOverloadedTest('in a static context');  // As of PHP 5.3.0

要使用这种能力,程序员需要承担较大的责任。虽然重载为编写灵活的代码提供了便利,但同时也为错误提供了土壤。所以,使用重载时应该谨慎,并且要有严格的代码测试纪律。


回页首

变量解析和 heredoc

PHP 的优势之一在于字符串解析。PHP 对于字符串的长度没有限制,只要主机的可用内存够大就行。清单 5 展示了使用 PHP 时拥有的灵活性。

清单 5. PHP 解析

<?php
$beverage = 'coffee';
// The following works; "'" is an invalid
character for variable names
echo "$beverage's taste is great";
// The following won't work; 's' is a valid
character for variable names but the
echo "He drank a number of $beverages";
variable is "$beverage"
echo "He drank some ${beverage}s"; // works
echo "He drank some {$beverage}s"; // works
?>

清单 5 中的代码产生以下输出:

coffee's taste is great
He drank a number of
He drank some coffees
He drank some coffees

清单 5 中的代码并不是直到 PHP V5.3.0 才有的。这里给出这段代码,只是为了提醒您字符串处理支持和一些解析规则。但是,PHP V5.3.0 增加了增强的 heredoc 语法支持。清单 6 显示了一个简单的例子。

清单 6. PHP V5.3.0 heredoc 的应用

<?php
echo >>>"FOOBAR"
Hello World!
FOOBAR;
?>

清单 6 中的代码产生以下令人惊叹的输出:

Hello World!

那么,清单 6 有什么特别之处呢?PHP V5.3.0 中的 heredoc 支持使用双引号。其优点主要在于,双引号中的内容不会被解析,这样便有了更大的灵活性。基本上,这只是在已经强大的字符串支持的基础上增加了更多的灵活性。PHP V5.3.0 的在线参考包括更多关于这个主题和 PHP V5.3.0 其他相关主题的资料。


回页首

结束语

PHP 是一项有吸引力的技术。它为拼凑式(pick-and-mix)网站开发提供了便利。您可以为网站增加数据库,PHP 语言为此提供了所需的绑定。您不需要重量级的应用服务器或 servlet 技术。换句话说,只需极小的投资 — 无论是财务上还是智力上的投资,就可以控制环境。

PHP 语言在不断演变,很高兴看到 V5.3.0 中的很多改进有效地增强了面向对象方面。这有助于 PHP 在与那些更重量级(也更昂贵)的 Web 设计方法的竞争中胜出。

在本文中,我讨论了延迟静态绑定、名称空间支持、类方法重载和 heredoc 支持。这只是 PHP V5.3.0 的冰山一角。还有很多其他专题,例如迁移到 V5.3.0。请参阅 参考资料 小节,获得关于这些专题和其他专题的详细信息。


回页首

下载

描述 名字 大小 下载方法
本文使用的脚本 os-php-v5.3ftrs-PHPScripts.zip 2KB HTTP
关于下载方法的信息

参考资料

学习

  • Luke Welling 和 Laura Thompson 撰写的 PHP and MySQL Web Development 是一本很好的 PHP 参考书籍。
  • 阅读 “在 PHP 中创建更好的名称空间”,了解更多关于在 PHP 中使用名称空间的信息。
  • “PHP object orientation: Separating concerns” 讨论使用 PHP 的面向对象设计。
  • PHP.net 是 PHP 开发人员资源中心。
  • 查看 “推荐 PHP 读物列表”。
  • 浏览 developerWorks 上所有的 PHP 内容。
  • 查看 IBM developerWorks 的 PHP 项目资源,扩展 PHP 技能。
  • 要收听有关软件开发人员的有趣访谈和讨论,请浏览 developerWorks podcasts。
  • 在 PHP 中使用数据库?试试 Zend Core for IBM,这是一个无缝、即开即用、易于安装的 PHP 开发和生产环境,支持 IBM DB2 V9。
  • 随时关注 developerWorks 技术活动和网络广播。
  • 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 活动。
  • 访问 developerWorks 在 Eclipse Workbench 之外使用 Eclipse GUI,第 2 部分:使用 JFace 图像注册表,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
  • 查看免费的 developerWorks 演示中心,观看并了解 IBM 及开源技术和产品功能。

获得产品和技术

  • 了解更多关于 PHP V5.3.0 的信息。
  • 使用 IBM 产品评估试用版软件 改进您的下一个开发项目,这些软件可以通过下载获得。
  • 下载 IBM 产品评估试用版软件,或者 IBM SOA Sandbox for Reuse,获得来自 DB2®、 Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

讨论

  • 参与 developerWorks 博客 并加入 developerWorks 社区。
  • 参与 developerWorks PHP 论坛:用 IBM 信息管理产品(DB2,IDS)开发 PHP 应用程序。

关于作者

Stephen Morris 是爱尔兰的 Omey Communications 的 CTO。在过去 20 年中,Stephen 曾在一些全球最大的网络公司参与过各种软件项目,包括基于 J2EE/J2SE 的网络管理系统、账单编制应用程序、移植和开发 SNMP 实体、网络设备技术和 GSM 移动网络应用程序。他是 Network Management, MIBs and MPLS: Principles, Design and Implementation(Prentice Hall PTR,2003 年)一书的作者,同时也在 InformIT 和 OnJava.com 发表过多篇有关网络管理和其他主题的文章。

文章来源:http://www.ibm.com/developerworks/cn/opensource/os-php-v5.3ftrs/index.html

[转]细察 PHP V5.3.0 特性相关推荐

  1. 现代化个人博客系统 ModStartBlog v5.7.0 简约纯白主题,富文本大升级

    系统介绍 ModStart 是一个基于 Laravel 模块化极速开发框架.模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发. 系统完全开源,基于 Apache 2.0 ...

  2. 1024 程序员节专题论坛来袭,权威解读 MindSpore、CANN 5.0 特性和 HCIA MDC 开发者认证...

    "授人以鱼不如授人以渔",一句古话中蕴含的发展真理,我们将其套用到如今炽手可热的 AI 领域之上会发现无比适用.2018 年,华为提出了普惠 AI 的概念,降低 AI 开发门槛,让 ...

  3. 实用知识点梳理:网络操作系统、HTTPS、交换机中用户权限、路由器与集线器功能、HTTP2.0特性

    网络操作系统 网络操作系统的基本任务: 屏蔽本地资源与网络资源之间的差异: 为用户提供基本的网络服务功能: 管理网络系统的共享资源: 提供网络系统的安全服务. HTTPS 在HTTP跟TCP中间多了一 ...

  4. Entity Framework Core 2.0 特性介绍和使用指南

    前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...

  5. ASP.NET Core 2.0 特性介绍和使用指南

    ASP.NET Core 2.0 发布日期:2017年8月14日 ASP.NET团队宣布ASP.NET Core 2.0正式发布,发布Visual Studio 2017 15.3支持ASP.NET ...

  6. .NET Core 2.0 特性介绍和使用指南

    前言 这一篇会比较长,介绍了.NET Core 2.0新特性.工具支持及系统生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路径.提纲来用. 对于.NET Core 2.0的发布介绍, ...

  7. .NET Standard 2.0 特性介绍和使用指南

    前言 早上起来.NET社区沸腾了,期待已久的.NET Core 2.0终于发布!根据个人经验,微软的产品一般在2.0时会趋于成熟,所以一个新的.Net开发时代已经来临!未来属于.NET Core. 对 ...

  8. FineUIPro v5.1.0 发布了!

    FineUIPro v5.1.0 已发布,这已经是自 2014 年以来的第 31 个版本,4 年来精雕细琢,只为你来! 上个大版本新增了响应式布局,而这个版本主要是BUG修正,此外还增加了树控件的级联 ...

  9. 谷歌:明年开始对应用内购买抽取 30% 分成;钉钉创始人无招将离任;Java O2OA V5.2.0 发布|极客头条

    整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 扫描上方二维码,快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋 ...

最新文章

  1. [转]android selector 背景选择器
  2. 计算机组成原理的中央控制器,计算机组成原理第六章中央控制器(6-7,8,9).pdf
  3. python3 类字符串名实例化对象
  4. c++与Delphi中的类型转换
  5. ICCV‘21 Oral|拒绝调参,显著提点:检测分割任务的新损失函数RS Loss开源
  6. 程序员漫画:别人眼中的程序员vs真实的程序员
  7. CodeForces1477D Nezzar and Hidden Permutations(构造+调整+菊花图)
  8. java mybatis 教程_(整理)MyBatis入门教程(一)
  9. 大二下学期软件工程概论总结
  10. Android 获取系统或SDCARD剩余空间信息(转)
  11. java tree类子项的添加和删除_Java学习2-23 JTree节点的删除与添加(来源网上)
  12. [论文阅读] Cross-level Contrastive Learning and Consistency Constraint for Medical Image Segmentation
  13. 一朵落地中国的“智能云”是如何飘到你身边的!
  14. 重温Javascript继承机制
  15. linux压缩文件夹
  16. html video函数,HTML5 Video 的API函数
  17. “Network”游戏棋人机对弈的设计与实现(二)—判断步骤是否合法
  18. deepin安装教程(deepin安装教程不用u盘)
  19. HTML5+CSS大作业——学生个人博客(5页) 大学生个人博客网页作品 网页设计作业模板 学生网页制作源代码下载
  20. 程序员如何写好设计方案

热门文章

  1. IMT-2020明确5G频谱需求:高频需求量至少14GHz
  2. 最新Git 版本在Windows系统中的安装详解过程
  3. 经典算法学习——哈希查找
  4. 2021年初级会计实务会计要素及其确认与计量
  5. 梦幻西游服务器维护查询,梦幻西游转服查询
  6. 基于proteus软件仿真AT89C52的电压表(附工程文件)
  7. 行列式,线性变换,变换,雅克比行列式,二次型
  8. 计算机整机组装流程公开课,公开课流程及注意事项(附实操流程)
  9. 匹配中文汉字日文韩文等多国语言的正则表达式(转)
  10. c语言教案模板app,c语言教案模板.doc