|
|

楼主 |
发表于 2010-1-8 13:21:04
|
显示全部楼层

类方法重载
在 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 其他相关主题的资料。 |
|