广·西·电·脑·服·务·网                                     设为首页  收藏本站
首 页 IT 报 道 操作系统 硬件学院 软件学院 网络学院 服 务 器 软件下载
DIY经验 数据恢复 维修宝典 电脑保养 故障症状 黑客安全 病毒快报 电脑优化
维修网点 IT 黄 页 网络游戏 大师答疑 网站技术 动漫游戏 服务社区 素材图片
 广西电脑服务网 ·广西最大的电脑服务平台
您现在的位置: 广西电脑维修在线 >> 网站技术 >> PHP技术 >> 入门教程 >> 网站技术正文
Php5.0说明
作者:佚名 文章来源:不详 点击数: 更新时间:2007-2-2 10:04:59

Php5.0说明 ------为面向对象而生的php5
为面向对象而生的PHP5
---------------------------------------------



[摘要]目前开发中的PHP5,其面向对象的机能已经被大幅度的强化了。下一代的PHP将会是怎样的一种语言呢?下面我们来详细讲解一下目前发布的PHP5的beta release。




(一) Zend 2.0的诞生
现在的PHP4所使用的基本文法是被称之为Zend 引擎的脚本编译引擎。这个就是PHP4的优良机能的原因之一,是作为对PHP3的改进而生成的一种语言。大家一直认为,PHP4的性能根据当初的目标,比PHP3有了很大的提升,在网络编程的世界里占据了很大的份额。

开发了Zend 引擎的Zend公司是在开发PHP4的同时,由PHP3的主要开发者Zeev Suraski和Andi Gutmans所创立的企业合并而来的。Zend的名称是由Zeev和Andi的名字合起来组成的。Zend公司的商业模式是,持续不断的为open source提供zend 引擎的PHP内核 (core),同时提升周边产品开发和贩卖的利益。以open source software作为基盘的商业,在世界范围内大多数正在苦战的企业中,算是比较好的典型例子了。

■PHP4的局限

托PHP4成功的福,这个用途的适用范围逐渐变广起来。作为企业级的用途而使用PHP的说法时有所闻。因此,就有了这样一个问题,构筑大规模网站的时候,代码的再利用性十分差。具体来说就是,PHP4的面向对象性能很弱,因此习惯于使用Java等的技术人员对此有很多的抱怨。

逐步的改善PHP4的面向对象的性能,大幅度的更改基本文法,开发者达成了更新PHP记述方法的开拓目的。

■Zend 2.0开始开发
随后,Zend公司PHP中心的开发者们在2001年7月发表了作为下一代PHP语言引擎的Zend 2.0引擎的构想。以[Zend Engine version 2.0: Feature Overview and Design]
(http://www.zend.com/engine2/ZendEngine-2.0.pdf)作为目标的同时,面向对象的性能大幅度的强化了。
目前的PHP4 Zend 引擎的扩张情况与昔日的PHP3如出一辙。这就意味着,要提升新的语言引擎的主版本号,明确方法目标,迎接来自开发团体的称赞。

Ze2的开发,与以往的Zend引擎一样,都是运行在open source的模式下的。最新的源代码在CVS上被全面的公开,因为是面向开放的开发者的,关于开发的议论非常的活跃。

现在Ze2被决定采用于PHP的下一个版本PHP5中。最终发布的时间现在还未定,但是假如根据Zend公司2003年4月1日发布的Newsletter的话,现在的应该就是Beta Release了。


(二) PHP5的新特性

接下来请按照顺序看一下被强化的PHP5的性能。首先是最为重要的面向对象性能,类的实体特性在大幅度的被修改着。这里说的仅是关于类的新特性。

· 对象的参照过渡是默认的(default)
· 引入访问属性的限制
· 引入访问方法的限制
· 抽象类和抽象方法
· 接口
· final声明
· 名空间
· 类内常量
· 类变量
· 统一构建器
· 析构函数(Distructor)
· 其他附属特性

以上内容是根据2003年4月22日CVS上登录版本资料所写的,在正式的发布之前,也有变动的可能性。

■对象的默认参照过渡

在PHP4中,在以变量$var1为类的实体对象的时候,如果$var2 = $var1;那么,在$var2中,$var1的复制被代入。明显的,$var2为了指向与$var1相同的对象,就要写成$var2 =& $var1,必须要加上&作为参照。
而在PHP5,对象的代入将成为自动的参照过渡。也就是说,
$var2=$var1,两者指向相同的对象。如果想要同php4一样,带入copy,那么就会运用到导入__clone()的方法。
$var2 = $var1->__clone();此处,clone前面是两个连续的“_”
(这仅仅是类的实体的特性)


■引入访问属性的限制

在PHP4的类中,连同属性和方法在内,可以自由的访问类的内外任何地方,而没有限制。因此,用户就无法防范属性的无意中的更改。

而在PHP5中,同C++和Java一样,导入了private, protected, public三个等级的访问限制,使得类的设计者能够对属性和方法的使用方法进行限定。以下是各种访问限制的意思。

· Public: 可以自由的在类的内外任何地方进行参照、变更
· Private: 只能在这个类的方法中进行参照、变更
· Protected:能够在这个类以及继承了这个类的另一个类的方法中进行参照、变更。另外,在继承的类中,能够写入访问指定。

在PHP4中的“var”,同以往一样与public有着相同的意思。下面就来举一个例子,让我们来看看访问限制是怎样起作用的。

PHP代码:--------------------------------------------------------------------------------
class Hoge1 {
 private $var1 = 'A';
 protected $var2 = 'B';
 protected $var3 = 'C';

 function setLower() {
  $this->var1 = 'a';
  $this->var2 = 'b';
  $this->var3 = 'c';
 }
 function var1() {
  return $this->var1;
 }
 function var2() {
  return $this->var2;
 }
 function var3() {
  return $this->var3;
 }
}

--------------------------------------------------------------------------------

在这个类中,带有$var1, $var2, $var3三个属性。$var1被声明为private, $var2和$var3是protected.在此处

PHP代码:--------------------------------------------------------------------------------
$hoge=new Hoge1;
echo’var1:’.$hoge->var1.”
n”

--------------------------------------------------------------------------------

如果尝试参照不允许从外部进行访问的private属性,那么就会出现如下错误:

Fatal error: Cannot access private property hoge1::$var1 in /path/to/script.php on line XX

对于protected的$var2也是相同的。

但是,因为$hoge的方法是没有private和protected的,所以下面的代码能够正常运作,返回内部私有和保护变量的值。

PHP代码:--------------------------------------------------------------------------------
echo 'var1: ' . $hoge->var1() . "
\n"; // var1: A
echo 'var2: ' . $hoge->var2() . "
\n"; // var2: B
echo 'var3: ' . $hoge->var3() . "
\n"; // var3: C

$hoge->setLower();

echo 'var1: ' . $hoge->var1() . "
\n"; // var1: a
echo 'var2: ' . $hoge->var2() . "
\n"; // var2: b
echo 'var3: ' . $hoge->var3() . "
\n"; // var3: c

--------------------------------------------------------------------------------

其次,为了能够看到protected的属性的状态,我们试着创造了继承了Hoge1的类Hoge2

PHP代码:--------------------------------------------------------------------------------
class Hoge2 extends Hoge1 {
 public $var3 = '3';

 function d_var1() {
  return $this->var1;
 }
 function d_var2() {
  return $this->var2;
 }
 function d_var3() {
  return $this->var3;
 }
}

--------------------------------------------------------------------------------

在类Hoge2中,只有$var3被声明为public。在属性是protected的情况下,从子类进行访问有何种限制,是由子类的属性声明决定的。在Hoge2中,因为$var3被声明是public,因此无论是从何处都可以访问Hoge2的$var3(实体是Hoge1的$var3)。因为$var1在Hoge1中是private,因此,在Hoge2子类中Hoge1的$var1不会被继承,而在Hoge2中有可能会做出名为$var1的属性,因此,必须要明确区分Hoge1::$var1和Hoge2::$var1。

PHP代码:--------------------------------------------------------------------------------
$hoge = new Hoge2;

echo 'var1: ' . $hoge->var1 . "
\n";   // var1:
// echo 'var2: ' . $hoge->var2 . "
\n";  // Error
echo 'var3: ' . $hoge->var3 . "
\n";   // var3: 3

echo 'var1: ' . $hoge->d_var1() . "
\n"; // var1:
echo 'var2: ' . $hoge->d_var2() . "
\n"; // var2: B
echo 'var3: ' . $hoge->d_var3() . "
\n"; // var3: 3

--------------------------------------------------------------------------------


$hoge->var1是与Hoge1::var1没有关系的变量,因此不会有任何显示,因为var2有protected访问限制,所以如果不通过method就直接参照$var2,就会出现致命错误。

■引入访问方法的限制

与上述相同,此处也分为private, protected, public三种。

· Public: 能够从任何地方调用
· Private: 只能够从这个类的method内调用
· Protected: 只能够从这个类以及subclass的method中调用

此处的意思同Java和C++相同,请不要搞混。

■抽象(abstract)的类和抽象的方法

支持与Java相同的抽象类和抽象方法。抽象方法只提供了方法名的调用方式,而没有提供实体。另外,持有抽象方法的类,必须抽象宣言类本身。如果想要直接作成抽象类的对象,那么就会出现如下的致命错误。

Fatal error: Cannot instantiate abstract class ClassName

产生错误的实际的例子如下所示:

PHP代码:--------------------------------------------------------------------------------



abstract class MyAbstract {
 abstract public function test();
 public function test2() {
  echo "MyAbstract::test2() called.
\n";
 }
}

class MyImplement extends MyAbstract {
 public function test() {
  echo "MyImplement::test() called.
\n";
 }
}

$obj = new MyImplement;
$obj->test();

?>

--------------------------------------------------------------------------------


■接口(interface)

支持与Java相同的接口(interface)。接口是适合所描述的外部调用形式而设计组合起来的。
接口的实体不能够记录。相反的,实现接口的类必须持有与这个接口的方法相对应的实体。另外,类能够实现多个接口,因此,有可能实现多重继承。

PHP代码:--------------------------------------------------------------------------------


interface Throwable {
 public function getMessage();
}

interface Serializable {
 public function toString();
}

class MyException implements Throwable, Serializable {
 public function getMessage() {
  return 'this is MyException message';
 }

 public function toString() {
  return 'MyException: this is MyException message';
 }
}

$e = new MyException;
echo $e->getMessage();
echo $e->toString();
?>

--------------------------------------------------------------------------------


■final声明

同Java一样,PHP5支持final声明。如果对于一个方法追加final声明,这个方法将肯定在子类不能重载(Override)。如果方法被final声明了,但是还在子类中重载,就会出现如下错误:

PHP代码:--------------------------------------------------------------------------------
Fatal error: Cannot override final method fuga::foo()

--------------------------------------------------------------------------------


产生错误的例子:

PHP代码:--------------------------------------------------------------------------------

class Fuga {
 final function foo() {
  echo "this is final function\n";
 }
}

class Hoge extends Fuga {
 function foo() {
  echo "this is not final function\n";
 }
}
?>

--------------------------------------------------------------------------------


(三) PHP5的新特性(续)

PHP5的发布计划

在前面的文章中我们提到,“根据ZEND公司2003年4月1日发布的讯息的话,现在的应该就是Beta Release了”,但是开发者内部讨论的结果是,Beta为时尚早,而且有可能不是Beta Release.

对这方面动向有兴趣的可以参照 news://news.php.net/ 上所公布的信息 php.version5.dev:372

在这个文件中,PHP5的发布计划又重新回到了一张白纸,而另一方面,Zend Engine2的开发正在着手进行中。PHP5的Release其实大体就是盼望着“快点到年终吧”。

PHP5的新特性

接着我们来看一下在前面所讲到的其他一些关于类的新增的机能

■名空间

PHP5支持名空间。因此,我们可以在名空间内装入类、变量、常量、函数。

在PHP4的Scope中,只有global、函数内、类内这三个种类,所以要特别注意如果不注意的话,将会很容易“污染”global空间。假如使用名空间的话我们就能够在package里分离变量命名空间,因此应该就能比较容易的做成独立的package。

使用实例如下:

PHP代码:--------------------------------------------------------------------------------
namespace This {
 class Hoge {
 }
 const aConstant = 'This Constant';
 function aFunction() {}
 var $aVariable = 'This Variable';
}

$obj = new This::Hoge;
echo This::aConstant . "
\n";
This::aFunction();
echo This::$aVariable . "
\n";

--------------------------------------------------------------------------------


假设要访问名空间内的对象的话,就应该这样做:

名空间名::对象名

但是PHP5的名空间不会套入与C++相异的样子。

■Class内常量

使用关键字const,能够在类、名空间内定义常量。这里因为是常量,因此一定要在常量名的前面加上$。Class内的常量,比这个类中的global常量的优先级要高。

在这里const是预约语,因此在class名和函数名中使用const的时候要做必要的修正。

PHP代码:--------------------------------------------------------------------------------


define('constant_value', 'global constant');

class MyClass {
 const constant_value = 'class constant';

 function printConstant() {
  print constant_value;
 }
}

echo MyClass::constant_value . "
\n";
MyClass:rintConstant();
?>

--------------------------------------------------------------------------------


在这个例子里,MyClass:

[1] [2] [3] 下一页

 
网站技术录入:admin    责任编辑:admin 
  • 上一篇网站技术:

  • 下一篇网站技术:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

     IT图片报道

    联想D222到货22寸LCD迅速串红市场

    入门超频王!双敏945PL狂跑1200 F

    冠捷春季新品197V+突破高对比上市

    核心500MHz!性价比王者双敏X1650
     IT热点报道

    普通IT报道 联想D222到货22寸LCD迅速串红市场
    推荐IT报道 入门超频王!双敏945PL狂跑1200 FSB!
    推荐IT报道 冠捷春季新品197V+突破高对比上市
    普通IT报道 核心500MHz!性价比王者双敏X1650GT登场!
    普通IT报道 549元双敏945GC主板到货!
    普通IT报道 宏碁笔记本存储王As3683升级送礼!
    普通IT报道 魅族MP3全线暴跌 M6SP4G版不足700
    普通IT报道 OPPO首款顶级4.3寸大屏MP4 A3上市
    普通IT报道 维修服务拯救PC,谁拯救维修服务?
    普通IT报道 影驰8800GTS游戏盒子上市
    关于公司 | 免责声明 | 广告服务 | 招贤纳士 | 联系我们 | 友情链接 | 网站地图 1 2 3
    Copyright@2005 - 2006  http://www.GXF.com.cn  All Right Reserved  
    桂ICP备06002242号

    技术咨询
    22097366
    10231086
    30636841
    技术交流群
    27717914