当在命令行运行此脚本时,能看到下列结果:
一切都在预料之中,该对象读取 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[$found[1]]."\n"; } else { $nf .= $l; } } fclose( $fh ); copy( $this->configFile, $this->configFile.'.bak' ); $fh = fopen( $this->configFile, 'w' ); fwrite( $fh, $nf ); fclose( $fh ); } } $c = new Configuration(); echo( $c->TemplateDirectory."\n" ); $c->TemplateDirectory = 'foobar'; echo( $c->TemplateDirectory."\n" ); $c->save(); ?>
|
新的 save 函数巧妙地操作 config.txt。我并没有仅用更新过的配置项重写文件(这样会移除掉注释),而是读取了这个文件并灵活地重写了 $items 数组中的内容。这样的话,就保留了文件中的注释。
在命令行运行该脚本并输出文本配置文件中的内容,能够看到下列输出。
清单 10. 保存函数输出
% php text3.php tempdir foobar % cat config.txt # My application's configuration file Title=My App TemplateDirectory=foobar %
|
原始的 config.txt 文件现在被新值更新了。