<?php
class config {
private $cid;
private $name;
private $value;
private $configNames = array();

public function __construct() {
$this->configNames[] = "mail_address";
$this->configNames[] = "mail_username";
$this->configNames[] = "mail_password";
$this->configNames[] = "mail_pop_host";
$this->configNames[] = "mail_pop_port";
$this->configNames[] = "mail_smtp_host";
$this->configNames[] = "mail_smtp_port";
}

//initialize the configs in database
public static function initialize() {
$newConfig = new config();
$query = sprintf('TRUNCATE TABLE %sconfig',
DB_TBL_PREFIX);
mysql_query($query);
foreach ($newConfig->configNames as $value) {
$query = sprintf('INSERT INTO %sconfig (name) VALUES ("%s")',
DB_TBL_PREFIX,
$value);
mysql_query($query);
}
}

public function __get($name) {
if ($name == "configNames") {
return $this->configNames;
}else {
$query = sprintf('SELECT value FROM %sconfig WHERE name = "%s"',
DB_TBL_PREFIX,
$name);
$result = mysql_query($query);
if (mysql_num_rows($result)) {
$row = mysql_fetch_assoc($result);
$this->value = $row['value'];
return $this->value;
}else {
echo "<strong>no this config option!</strong>";
return false;
exit;
}
}
}

public function __set($name, $value) {
if (in_array($name, $this->configNames)) {
$query = sprintf('UPDATE %sconfig SET value = "%s" WHERE name = "%s"',
DB_TBL_PREFIX,
$value,
$name);
mysql_query($query);
}else {
echo "<strong>no this config option!</strong>";
return false;
exit;
}
}
}
?>这样子就可以直接$config = new config();
//读取
$config->mail_address;
//写入
$config->mail_address = "[email protected]";这样有什么不妥的地方吗?

解决方案 »

  1.   

    你的调用有问题
    config没有mail_address属性
    只用configName属性,而且这个属性是私有的,外部不能直接调用
      

  2.   

    这个类工作正常的,我使用魔术函数__get() 和__set() 实现调用私有变量的。我只是想知道这样写法好不好?会不会有什么问题。
      

  3.   

    我是比较喜欢面向对象的,呵呵。觉得很好,很锻炼思维。
    我看到大多是都是赋值之后,用一个save()方法保存的。这个直接赋值即保存,而且这个是网站配置类。不用多用户多次平凡使用。所以这样我觉得很方便。
      

  4.   

    呵呵,lz用了__set和__get魔术方法,这样是可以的lz这种实时数据库操作不太好,你每次实例化都要truncate一次,insert一次
    建议数据库结合php文件,文件中设置一个$config数组,比如$config['mail_address'] = '[email protected]';
    调用时直接引入文件,取值直接读。写入时插入数据库,生成文件,一般配置的东西更改少,查询多。
      

  5.   

    额,看错了,函数名是initialize,并不是每次实例化调用。不知道你什么时候才调用这个函数。
      

  6.   

    魔术函数有限制的,参看手册
    http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members
      

  7.   

    每次实例化不用truncate的,那个静态方法只是想初始化数据库的时候才用的。
    我感觉这样写扩展以及使用都很方便。
    还有“建议数据库结合php文件,文件中设置一个$config数组,比如$config['mail_address'] = '[email protected]';
    调用时直接引入文件,取值直接读。写入时插入数据库,生成文件,一般配置的东西更改少,查询多。”
    这一段不太明白呢?能不能说详细一点。谢谢~
      

  8.   

    这个是比如我想新增选项:比如现在想新增一个【website_name】的时候,我就写进去,之后初始化一次。呵呵~我觉得很方便的。
      

  9.   

    config类的mail_address是类的成员变量呢,还是方法呢!去多看看类的定义已经方法调用吧!!错误大堆!
      

  10.   

    不要激动
    类的定义没错,是通过__get和__set方法来做的.
      

  11.   

    呵呵~不是绕!是每个人写代码的风格和习惯都不同,_get,_set我一般很少用!看你写代码的风格之前是写C#还是java的吧!
      

  12.   

    哦,原来是这样。读取操作最好少一些。是这个意思吧?
    那我就加一个方法,一次性读完所有的参数。这样行吗?
    这样前台调用就不用很多的select了。
    不知道我是否理解了?cunningboy ?
      

  13.   

    我意思是这样,配置的东西一般是读取多,更新少吧?include_once('config.php');//这个应该是在某个初始化文件引入class config{
       function __construct(){
       }
       function __get($name){
              return $GLOBALS['config'][$name];
       }
      function __set($name){
              //update sql
              if($updateSuccess){
              //select * from config,然后重新生成config.php文件。
              }
      }
    }