现在的位置: 首页 > 编程语言 > 正文

如何利用这些新特性将用 PHP V4 开发的代码迁移到 PHP V5

2020年05月28日 编程语言 ⁄ 共 3517字 ⁄ 字号 评论关闭

  新语言特性使构建可靠的类库和维护类库更加容易。另外,重写标准库帮助使PHP更符合其同一Web语系,例如Java™编程语言。下面学步园小编来讲解下如何利用这些新特性将用PHPV4开发的代码迁移到PHPV5?

  如何利用这些新特性将用PHPV4开发的代码迁移到PHPV5

  首先,先来了解新语言特性及PHP的创建程序怎样更改了用PHPV4创建对象的方法。用V5的想法是要创建一种工业级语言用于Web应用程序开发。那意味着要了解PHPV4的限制,然后从其他语言中(例如Java、C#、C++、Ruby和Perl语言)抽取已知优秀语言架构并将这些架构并入PHP中。

  第一个也是最重要的新特性是针对类的方法和实例变量的访问保护——public、protected和private关键字。这个新特性使类设计人员可以保证对类的内在特性的控制,同时告诉类的使用者哪些类可以而哪些类不可以触及。

  在PHPV4中,所有代码都是public的。在PHPV5中,类设计人员可以声明哪些代码是对外部可见的(public)而哪些代码仅对类内部可见(private)或仅对类的子类可见(protected)。如果没有这些访问控制,则在大型团队中开发代码或将代码分布为库的工作会受阻,因为那些类的使用者很可能使用错误的方法或访问应当为private成员变量的代码。

  另一个较大的新功能是关键字interface和abstract,这两个关键字允许进行契约编程。契约编程意味着一个类向另一个类提供一张契约——换言之:“这是我要做的工作,你不需要知道它是怎样完成的”。实现interface的所有类都遵循该契约。interface的所有使用者都同意仅使用interface中指定的方法。abstract关键字使得使用接口十分容易,我稍后将加以说明。

  这两个主要特性——访问控制和契约编程——允许大型编码人员团队更顺畅地使用大型代码库。这些特性还使IDE可以提供更丰富的语言智能特性集。本文不但说明了若干个迁移问题,而且还花了一些时间说明如何使用这些新主要语言特性。

  访问控制

  为了演示新语言特性,我使用了一个名为Configuration的类。这个简单的类中含有用于Web应用程序的配置项——例如,指向图片目录的路径。在理想的情况下,此信息将驻存在一个文件或数据库里。清单1显示了一个简化的版本。

  清单1.access.php4

  

  classConfiguration

  {

  var$_items=array();

  functionConfiguration(){

  $this->_items['imgpath']='images';

  }

  functionget($key){

  return$this->_items[$key];

  }

  }

  $c=newConfiguration();

  echo($c->get('imgpath')."\n");

  ?>

  这是一个完全正统的PHPV4类。成员变量保存配置项的列表,构造程序装入项,然后名为get()的访问方法返回项的值。

  运行脚本后,以下代码将显示在命令行中:

  %phpaccess.php4

  images

  %

  很好!这个结果意味着代码运行正常并且正常设定和读取了imgpath配置项的值。

  将这个类转换为PHPV5的第一步是要将构造程序重命名。在PHPV5中,初始化对象(构造程序)的方法称为__construct。这次小改动如下所示。

  清单2.access1.php5

  

  classConfiguration

  {

  var$_items=array();

  function__construct(){

  $this->_items['imgpath']='images';

  }

  functionget($key){

  return$this->_items[$key];

  }

  }

  $c=newConfiguration();

  echo($c->get('imgpath')."\n");

  ?>

  这次改动并不大。只是移至PHPV5约定。下一步是添加对类的访问控制以确保类的使用者无法直接读写$_items成员变量。这次改动如下所示。

  清单3.access2.php5

  

  classConfiguration

  {

  private$_items=array();

  publicfunction__construct(){

  $this->_items['imgpath']='images';

  }

  publicfunctionget($key){

  return$this->_items[$key];

  }

  }

  $c=newConfiguration();

  echo($c->get('imgpath')."\n");

  ?>

  如何利用这些新特性将用PHPV4开发的代码迁移到PHPV5

  如果这个对象的使用者都要直接访问项阵列,访问将被拒绝,因为该阵列被标记为private。幸运的是,使用者发现get()方法可以提供广受欢迎的读取权限。

  为了说明如何使用protected权限,我需要另一个类,该类必须继承自Configuration类。我把那个类称为DBConfiguration,并假定该类将从数据库中读取配置值。此设置如下所示。

  清单4.access3.php

  

  classConfiguration

  {

  protected$_items=array();

  publicfunction__construct(){

  $this->load();

  }

  protectedfunctionload(){}

  publicfunctionget($key){

  return$this->_items[$key];

  }

  }

  classDBConfigurationextendsConfiguration

  {

  protectedfunctionload(){

  $this->_items['imgpath']='images';

  }

  }

  $c=newDBConfiguration();

  echo($c->get('imgpath')."\n");

  ?>

  这张清单显示了protected关键字的正确用法。基类定义了名为load()的方法。此类的子类将覆盖load()方法把数据添加到items表中。load()方法对类及其子类是内部方法,因此该方法对所有外部使用者都不可见。如果关键字都是private的,则load()方法不能被覆盖。

  我并不十分喜欢此设计,但是,由于必须让DBConfiguration类能够访问项阵列而选用了此设计。我希望继续由Configuration类来完全维护项阵列,以便在添加其他子类后,那些类将不需要知道如何维护项阵列。我做了以下更改。

  清单5.access4.php5

  

  classConfiguration

  {

  private$_items=array();

  publicfunction__construct(){

  $this->load();

  }

  protectedfunctionload(){}

  protectedfunctionadd($key,$value){

  $this->_items[$key]=$value;

  }

  publicfunctionget($key){

  return$this->_items[$key];

  }

  }

  classDBConfigurationextendsConfiguration

  {

  protectedfunctionload(){

  $this->add('imgpath','images');

  }

  }

  $c=newDBConfiguration();

  echo($c->get('imgpath')."\n");

  ?>

  现在,项阵列可以是private的,因为子类使用受保护的add()方法将配置项添加到列表中。Configuration类可以更改存储和读取配置项的方法而不需要考虑它的子类。只要load()和add()方法以同样的方法运行,子类就应当不会出问题。

  以上就是关于“如何利用这些新特性将用PHPV4开发的代码迁移到PHPV5”的内容,希望对大家有用。更多资讯请关注学步园。学步园,您学习IT技术的优质平台!

抱歉!评论已关闭.