首 页   · 站长博客 · 用户注册 · 会员登陆  · 会员排行  ·最新主题  ·最近回复  精华区  版权声明  ·论坛管理
  当前登录身份:游客,请先登录。  笔名: 口令: 验证码:   
楼 主  index »  PHP安装/语法/函数 » [本站译文]PHP5中的类与对象(一)前言  


  作者:一起PHP
  注册时间:2004-02-27
  主题/回复:247/1521
  积分:4649
  等级:★★★★★☆(十一级)
  称号:论坛圣人

  nqp@nqp.me
  4304410
  www.nqp.me

 

 发表:2005-05-01 01:37:30 阅读 2340 次 回复 0 次 得分0  |   字号 字色
[本站译文]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()`"
?> 

(第一节完)
 
  页数1/1首页 « 1 » 末页
  发表回复:您还没有登陆,无法发表回复。请先[登陆]

一起PHP技术联盟 主办:一起PHP 联系方式:站长QQ:4304410 QQ群:8423742 20159565 站长博客 E-mail: nqp@nqp.me 执行时间:0.003sec
SimsmaBBS 2008 (v6.0) Developed by 17php.com,Copyright(C)2003-2010 All rights reserved. 副本授权:一起PHP官方专用版