选择显示字体大小

初探 php5 (二)


   抽象类

抽象类不能被实例化。
抽象类与其它类一样,允许定义变量及方法。
抽象类同样可以定义一个抽象的方法,抽象类的方法不会被执行,不过将有可能会在其派生类中执行。

例六:抽象类

<?php
abstract class foo {
protected &#36;x;
abstract function display();
function setx(&#36;x) {
&#36;this->x = &#36;x;
}
}
class foo2 extends foo {
function display() {
// code
}
}
?>

__call

php5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。

例七:__call

<?php
class foo {
function __call(&#36;name,&#36;arguments) {
print(&quot;did you call me? i&#39;m &#36;name!&quot;);
}
} &#36;x = new foo();
&#36;x->dostuff();
&#36;x->fancy_stuff();
?>
这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。

例八:使用 __call 实现“过载”动作

<?php
class magic {
function __call(&#36;name,&#36;arguments) {
if(&#36;name==&#39;foo&#39;) {
if(is_int(&#36;arguments[0])) &#36;this->foo_for_int(&#36;arguments[0]);
if(is_string(&#36;arguments[0])) &#36;this->foo_for_string(&#36;arguments[0]);
}
} private function foo_for_int(&#36;x) {
print(&quot;oh an int!&quot;);
} private function foo_for_string(&#36;x) {
print(&quot;oh a string!&quot;);
}
} &#36;x = new magic();
&#36;x->foo(3);
&#36;x->foo(&quot;3&quot;);
?>

__set 和 __get

这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。

例九: __set 和 __get

<?php
class foo {
function __set(&#36;name,&#36;val) {
print(&quot;hello, you tried to put &#36;val in &#36;name&quot;);
}
function __get(&#36;name) {
print(&quot;hey you asked for &#36;name&quot;);
}
}
&#36;x = new foo();
&#36;x->bar = 3;
print(&#36;x->winky_winky);
?>

类型指示

php5 中,你可以在对象的方法中指明其参数必须为另一个对象的实例。

例十:类型指示

<?php
class foo {
// code ...
}
class bar {
public function process_a_foo(foo &#36;foo) {
// some code
}
}
&#36;b = new bar();
&#36;f = new foo();
&#36;b->process_a_foo(&#36;f);
?>
可以看出,我们可以显性的在参数前指明一个对象的名称,php5 会识别出这个参数将会要是一个对象实例。


静态成员

静态成员和静态方法在面象对象编程的术语中被称作 “对象方法(class methods)” 和 “对象变量(class variables)”。
“对象方法” 在一个对象没有实例化前允许被调用。同样,“对象变量” 在一个对象没有实例化前可以被独立操作控制(不需要用一个对象的方法来控制)。

例十一:对象方法和对象变量

<?php
class calculator {
static public &#36;pi = 3.14151692;
static public function add(&#36;x,&#36;y) {
return &#36;x + &#36;y;
}
}
&#36;s = calculator::&#36;pi;
&#36;result = calculator::add(3,7);
print(&quot;&#36;result&quot;);
?>

异常处理

异常处理是公认的处理程序错误的理想方法,在 java 及 c++ 中都有这个概念,我们欣喜的看到,在 php5 已经加入了这方面的应用。你可以尝试使用 “try” 和 “catch” 来控制程序的错误。

例十二:异常处理

<?php
class foo {
function divide(&#36;x,&#36;y) {
if(&#36;y==0) throw new exception(&quot;cannot divide by zero&quot;);
return &#36;x/&#36;y;
}
}
&#36;x = new foo();
try {
&#36;x->divide(3,0);
} catch (exception &#36;e) {
echo &#36;e->getmessage();
echo &quot;n<br />n&quot;;
// some catastrophic measure here
}
?>
上例中,我们使用了 “try” 来执行花括号中的语句,当有错误发生的时候,代码会把错误交给 “catch” 子句来处理,在 “catch” 子句中,你需要指明要把错误交给某个对象处理,这样做可以使代码结构看起来更清晰,因为现在我们可以把所有的错误信息交给一个对象来处理。


自定义错误处理

你可以很方便的用自定义的处理错误的代码来控制你的程序中的意外。你仅仅需要从异常类中派生出一个自己的错误控制类,在你自己的错误控制类中,你需要有一个构造函数和一个 getmessage 方法,以下是一个例子。

例十三:自定义错误处理

<?php
class weirdproblem extends exception {
private &#36;data;
function weirdproblem(&#36;data) {
parent::exception();
&#36;this->data = &#36;data;
}
function getmessage() {
return &#36;this->data . &quot; caused a weird exception!&quot;;
}
}
?>
现在我们可以使用 “throw new weirdproblem(&#36;foo)” 来抛出一个错误句柄,如果错误在 “try” 的代码块中发生,php5 会自动把错误交给 “catch” 部分来处理。


名称空间

名称空间对类的分组或函数分组很有用。它可以把一些相关的类或函数给组合到一起,方便以后调用。

例十四:名称空间

<?php
namespace math {
class complex {
//...code...
function __construct() {
print(&quot;hey&quot;);
}
}
} &#36;m = new math::complex();
?>
注意你需要在何种情况下使用名称空间,在实际运用中,你可能会需要声明两个或多个名称一样的对象来做不同的事情,那么你就可以把他们分别放到不同的名称空间中去(但接口是要相同的)。

译者注:本篇文章来自 phpbuilder,从以上文字中我们高兴的看到 php5 中新增加的一些优秀的功能。我们还可以看到一些 java 和 c++ 的影子,现在的 php5 还没有正式发布,等到真正发布那一天,希望能再带给所有的 php 爱好者更多的惊喜。对这方面比较感兴趣的朋友可以登录 php 官方新闻组去了解更新情况。新闻组地址为 news://news.php.net ,也可以登录web界面 http://news.php.net 来访问。让我们一起来期待新版本的发布吧。:)(超越php avenger)


注:本文章为原创文章,版权归文章作者与超越php网站所有,未经本站同意,禁止任何商业转载。非盈利网站及个人网站转载请注明出处,谢谢合作!


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons