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


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

  nqp@nqp.me
  4304410
  www.nqp.me

 

 发表:2006-03-01 16:20:48 阅读 2338 次 回复 0 次 得分0  |   字号 字色
[翻译]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()`"
?> 

(第一节完)

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

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