细察PHPV530特性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 的幸运读者来说,设置过程再简单不过了:
获得 PHP 二进制安装文件()。 在 System Preferences 中关闭 Web Sharing。 找到 /etc/apache2/nf 文件。 在 nf 文件中注释掉下面这行:LoadModule php5_module。 运行 PHP V5.3 安装文件(如果您愿意,也可以构建源代码)。 在 System Preferences 中打开 Web Sharing。本文的目的不是仅仅介绍如何安装,所以如果您的平台是 Microsoft Windows 或 Linux,请参阅一些很棒的 PHP 参考书籍(见我在参考资料中推荐的书籍)。
为了检查 PHP 是否已安装以及版本是否合适,在 /Library/WebServer/Documents 文件夹中创建一个名为 p 的文件。清单 1 展示了这个脚本文件的内容。本文中的所有脚本都在下载小节提供的压缩(ZIP)文件中,所以实际上不需要创建任何文件。
清单 1. p
?phpphpinfo();?
将该脚本文件放在 /Library/WebServer/Documents 文件夹中之后,访问 http://localhost/p。应该可以看到类似图 1 的界面。这里可能需要用您主机的 IP 地址替换 URL 中的 “localhost”。
图 1. PHP V5.3.0 安装成功
延迟静态绑定
PHP V5.3 扩展了 static **的使用。现在,无需实例化类便可访问静态类方法和属性。当类不存在对象,或者不需要对象时,这个特性就比较方便未来会体现出多元化的业态。清单 2 展示了延迟静态绑定的一个例子。
清单 2. 延迟静态绑定
?phpclass 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 名称空间
?phpnamespace test;define('ASTRING', 'Hello World!');define('test\ASTRING', 'Hello World from my namespace!');echo "pMy string is: ";echo ASTRING;echo "/p";echo "pMy 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 重载
?phpclass 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 contextCalling 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 namesecho "$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"; // worksecho "He drank some {$beverage}s"; // works?
清单 5 中的代码产生以下输出:
coffee's taste is greatHe drank a number of He drank some coffeesHe drank some coffees
清单 5 中的代码并不是直到 PHP V5.3.0 才有的。这里给出这段代码,只是为了提醒您字符串处理支持和一些解析规则。但是,PHP V5.3.0 增加了增强的 heredoc 语法支持。清单 6 显示了一个简单的例子。
清单 6. PHP V5.3.0 heredoc 的应用
?phpecho "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。请参阅参考资料小节,获得关于这些专题和其他专题的详细信息。
威门热淋清颗粒针对什么病症肝郁型月经不调如何治通心络对脑梗塞患者管用吗-
投资者提问:请问公司目前库存情况同比和环比如何变化?对于服务业去库存情况有什...
高盛提问:却说该公司目前存量状况去年同期和环比如何波动?对于企业去存...
2023-10-03
-
新款梅赛德斯-AMG SL 63 Shooting Brake渲染三幅
月初,ADSL社从海外舆论autoevolution获取一三组新款法拉利车队-AMG SL 63 Shooting ...
2023-10-02
-
没有和领导做过这3件事,很难成为领导的心腹,说更容易,做却难!
现在的积极支持,更加偏爱任用自己的副手而不是手下的各支, 即便可能存...
2023-09-28
-
为何宇航员在太空遇难,灵柩却不能运回地球?
“节物风景秀丽不宽厚,桑田碧海须臾改。”这是唐宋诗人卢照邻写的《洛阳...
2023-09-23
-
疫情中的特殊618,“承压”的京东写进反思
作者:崔鹏志 可能:IT华尔街日报 北京非典封控已经接下来仅有两个同月,...
2023-09-22
-
后生初期|怀后生前三个月不能说?这是迷信还是另有说法?
女婴后,3个年底内很昧去找别人。这个习俗,老年代代相传,流传至今,还...
2023-09-21