快速业务通道

构建可配置PHP应用程序的正确方式

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-24
以将 config.php 放到相同的文件中,并作为 Web 应用程序的根。第二,在任何编辑器中都可编辑,并且在一些编辑器中甚至具备语法着色及语法检查功能。

  这项技术的缺点是,这是一个像 INI 文件一样的只读技术。将数据从此文件中提取出来是轻而易举的,但在该 PHP 文件中调整数据却很困难,在一些情况下甚至是不可能的。

  下面的替代方法显示了如何编写在本质上既可读又可写的配置系统。

  文本文件

  前面的两个例子对于只读配置条目都是合适的,但对于既读又写的配置参数来说又如何呢?首先,看看清单 6 中的文本配置文件。

  清单 6. config.txt

# My application''s configuration file
Title=My App
TemplateDirectory=tempdir

  这是同 INI 文件相同的文件格式,但我自己编写了辅助工具。为此,我创建了自己的 Configuration 类,如下所示。

  清单 7. text1.php

<?php
class Configuration
{
 private $configFile = ''config.txt'';
 private $items = array();
 function __construct() { $this->parse(); }
 function __get($id) { return $this->items[ $id ]; }
 function parse()
 {
  $fh = fopen( $this->configFile, ''r'' );
  while( $l = fgets( $fh ) )
  {
   if ( preg_match( ''/^#/'', $l ) == false )
   {
    preg_match( ''/^(.*?)=(.*?)$/'', $l, $found );
    $this->items[ $found[1] ] = $found[2];
   }
  }
  fclose( $fh );
 }
}

$c = new Configuration();

echo( $c->TemplateDirectory."\n" );
?>

  该代码首先创建了一个 Configuration 对象。该构造函数接下来读取 config.txt 并用解析过的文件内容来设置局部变量 $items。

  该脚本随后寻找 TemplateDirectory,这并没有在对象中直接定义。因此,使用设置成 ''TemplateDirectory'' 的 $id 来调用神奇的 __get 方法,__get 方法针对该键返回 $items 数组中的值。

  这个 __get 方法特定于 PHP V5 环境,所以此脚本必须在 PHP V5 下运行。实际上,本文中所有的脚本都需要在 PHP V5 下运行。

  当在命令行运行此脚本时,能看到下列结果:

% php text1.php
tempdir
%

  一切都在预料之中,该对象读取 config.txt 文件,然后为 TemplateDirectory 配置项获得正确的值。

  但对于设置一个配置值,应该怎么做呢?在此类中建立一个新方法及一些新的测试代码,就能够得到这个功能,如下所示。

  清单 8. text2.php

<?php
class Configuration
{
 ...

 function __get($id) { return $this->items[ $id ]; }

 function __set($id,$v) { $this->items[ $id ] = $v; }
 function parse() { ... }
}
$c = new Configuration();
echo( $c->TemplateDirectory."\n" );
$c->TemplateDirectory = ''foobar'';
echo( $c->TemplateDirectory."\n" );
?>

  现在,有了一个 __set 函数,它是 __get 函数的 “堂兄弟”。该函数并不为一个成员变量获取值,当要设置一个成员变量时,才调用这个函数。底部的测试代码设置值并打印出新值。

  下面是在命令行中运行此代码时出现的结果:

% php text2.php
tempdir
foobar
%

  太好了!但如何能将它存储到文件中,从而将使这个改动固定下来呢?为此,需要写文件并读取它。用于写文件的新函数,如下所示。

  清单 9. text3.php

<?php
class Configuration
{
 ...

 function save()
 {
  $nf = '''';
  $fh = fopen( $this->configFile, ''r'' );
  while( $l = fgets( $fh ) )
  {
   if ( preg_match( ''/^#/'', $l ) == false )
   {
    preg_match( ''/^(.*?)=(.*?)$/'', $l, $found );
    $nf .= $found[1]."=".$this->items[$foun

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号