[翻译]PHP5特性介绍系列文章(一)PHP5中的对象模式的介绍 |
-------------------------------------------------------
原语言:英文 English
文章出处:www.php.net PHP官方网站
翻译:一起PHP www.17php.com
声明:本文章为一起PHP站长依据英文资料翻译而来,其英文版
版权归原作者所有,中文版版权归本站和原作者共同拥有。
本文章欢迎一切形式的转贴和转发,但为尊重作者和翻译者的
劳动,转贴时请注明出处,并保留原作者和翻译者信息。
-------------------------------------------------------
前言
PHP5中心的对象模式的介绍。
你的类(class)里有3个简单的,彻底让人讨厌的问题:(不是因为你想让他们怎样工作,而是ZENDII引擎如何操作他们。)
1)在一个方法声明中你不能声明string或者int/integer类型的参数变量.这令人讨厌到难以置信的程度——zend 2引擎并不支持!(后面一句对于理解文章无用,省去)
2)在方法声明中如果提供一个null作为一个默认值,那么你将不能为这个参数接受任何null值。(因为方法无论如何都不需要检查参数是否为null。
3)令人悲伤的是,ZendII引擎仅仅通过继承或者多态才可能实现方法重载,(而且__construct()只能被定义在一个类当中)。如果你想在同一个类中重载一个方法,我的建议是在方法声明时提供一个$flag=null的变量,然后通过一个switch语句来选择这个数据应该干什么。
============================================
除了这些afformentioned,ZendII引擎运行机制和JAVA非常相似,正是这些使得PHP5功能更加强大也更加具有通用性。再次感谢Zend!
------------------------------------
本范例作者:hans@lintoo.dk 23-Mar-2005 12:01
多个同名的方法尽管方法声明不同仍然不能编译通过.(译者按:这里的“声明不同”指的是参数行的声明不同)
比如你想这么干:
<?php
public function __construct(string $myString) {
//字符型变量时的处理语句
}
public function __construct(int $myInt) {
//整型变量时的处理语句
}
?>
这样写将编译出错,可能因为你不能用string和int来type hinting(译者按:含义待考,本人认为应该是“声明变量类型”的意思),但是这时候你可能想到把这些参数变量作为对象来创建,如下:
<?php
public function __construct(String $myString) {
// 字符型变量时的处理语句
}
public function __construct(Integer $myInt) {
// 整型变量时的处理语句
}
?>
你会发现这样仍然不能运行。其实,你应该这么办:
<?php
public function __construct($myString=null,$myInt=null) {
if (!is_null($myInt)) {
// 整型变量时的处理语句
} else if (!is_null($myString)) {
// 字符型变量时的处理语句
} else {
throw new Exception("错误: __construct 没有被以整型或者字符型调用。";
}
}
?>
(译者按:由此例子可以看出,PHP不支持方法重载,要实现类似于方法重载的效果,只能使用IF或者switch判断,依靠判断传递过来的参数类型来决定如何作出处理)
例子二:
本例作者:spam@afoyi.com 20-Mar-2005 08:18
你可以在父类中调用子类中定义的函数,本例在php4.3.6和php5中都能运行。
<?php
class p {
function p() {
print "父类的构造器\n";
}
function p_test() {
print "p_test()\n";
$this->c_test(); //编者按1
}
}
class c extends p {
function c() {
print "子类的构造器\n";
parent::p();
}
function c_test() {
print "c_test()\n";
}
}
$obj = new c;
$obj->p_test();
?>
输出结果:
子类的构造器
父类的构造器
p_test()
c_test()
(译者按:在JAVA语言当中“编者按1”处的一行是错误的,但是PHP可以。)
例子3:
本例作者:farzan@ifarzan.com 05-Oct-2004 07:04
PHP5中访问成员变量和成员函数是非常非常灵活的。这些访问方法第一眼乍看起来可能不太常用也并非必须的;但是有时候他们非常有用。尤其是当你在和SimpleXML类和对象打交道的时候。我已经在SimpleXML函数参考区发过一个类似的说明,但是这一个更加全面。
我用下面这个类作为所有例子的参考:
<?
class Foo {
public $aMemberVar = 'aMemberVar Member Variable';
public $aFuncName = 'aMemberFunc';
function aMemberFunc() {
print 'Inside `aMemberFunc()`';
}
}
$foo = new Foo;
?>
你可以在一个对象中使用另外一个变量作为名字来访问成员变量
<?
$element = 'aMemberVar';
print $foo->$element; // 输出 "aMemberVar Member Variable"
?>
(译者按:本来应该用$foo->aMemberVar来访问类Foo的成员变量aMemberVar,但是由于PHP的这一特殊性,你可以使用“变量的变量”来访问,有些时候这对于书写灵活性强程序非常有用!!)
或者使用函数:
<?
function getVarName()
{ return 'aMemberVar'; }
print $foo->{getVarName()}; // prints "aMemberVar Member Variable"
?>
重要提示:你必须用{和}把函数名包围起来。否则PHP会认为你在调用一个对象foo的成员函数。
你同样可以在{}使用一个常量或者一个确切的字符串:
<?
define(MY_CONSTANT, 'aMemberVar');
print $foo->{MY_CONSTANT}; // 输出 "aMemberVar Member Variable"
print $foo->{'aMemberVar'}; // 输出 "aMemberVar Member Variable"
?>
你还可以在{}中使用其他对象的成员
<?
print $foo->{$otherObj->var};
print $foo->{$otherObj->func()};
?>
你同样可以使用上面的方法来访问成员方法
<?
print $foo->{'aMemberFunc'}(); // 输出 "Inside `aMemberFunc()`"
print $foo->{$foo->aFuncName}(); // 输出 "Inside `aMemberFunc()`"
?>
(第一节完)
|
|
|