[本站译文]PHP5中的类与对象(一)前言 |
______________________________________________________
文章原地址:http://www.php.net/manual/zh/language.oop5.php#op5.intro
文章原语言:英文 English
文章原作者:www.php.net
翻译者:www.17php.com rznqp@163.com 2005-4-30 17:19
******************************************************
1、声明:
本站所有翻译文章,原文章版权归原作者所有,中文版版权归
本站所有,本站文章一律用作非商业的学习性研究,并且欢迎
一切形式的转载,但转载时务必请注明出处。书面转载必须经
过本站同意。
2、约定
本站所有翻译文章,均为直译翻译,有关术语和专用名词以
目前通用名词为准。部分不能确定含义的词语仍保留原样。
文章中翻译者插入的辅助性解释均用()括起,并用“译者按”
开头。
本站假定您对相关的概念和术语都已经了解,因此在翻译时
不会对每个概念作出解释。
本翻译为www.17php.com友情翻译,不保证翻译的准确性和可
靠性,如有疑问,建议您阅读原文。
******************************************************
很久以来就想翻译一些比较新的资料给大家,但是由于工作比较忙,又加上英语许久不用有些退化,翻译起来很是费力气,所以一直没有做。但是现在PHP5使用越来越广,问题也越来越多,站长终于决定集中精力翻译一批官方网站的资料来给大家研究。
从今天开始,在未来的1个月之内,我计划将PHP官方文档中最新的一部分“PHP5种的类与对象”一章全部翻译出来,大约有十几个小节,涉及到PHP5中关于对象与类的方方面面的知识,这是第一篇。
翻译当中我不会对一些基本的概念作出解释,比如:类、对象、构造器、方法、重载、覆盖、多态、访问控制、接口、继承、封装等等,如果您对这些概念不太了解,因此无法理解本文内容,建议您首先阅读一下面向对象的编程的有关知识。
--------------------------------------------------------------
前言
PHP5中的对象模式的介绍。
你的类里有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()`"
?>
(第一节完)
|
|
|