本帖最后由 hicoo 于 2014-06-07 10:21:04 编辑

解决方案 »

  1.   

    // 链接数据库
      function opendata($database){
      include("../data/a.php");
     }或者定义成常量你在类定义外面 require_once("../data/a.php")
    将导致数据库相关参数变成全局变量,可能会覆盖掉同名变量
    也可以通过 $GLOBALS 数组轻易的观察到
      

  2.   

    你要多看基础哦require_once("../data/a.php");class mydatabase {    // 链接数据库
        function opendata($database) {
            //方法一
            global $dbhost , $dbname , $dbuser , $dbpwd , $dbprefix , $db_language;
            //方法二
            require_once("../data/a.php");
            //方法三
            //在a.php把变量全部定义成常量
            define('DB_HOST' , 'test');
            //调用的时候直接 使用DB_HOST
            echo DB_HOST;
             
        }
        //查询一条记录
        function ReadOne($database) {
            self::opendata($database);
            $rs = mysql_query("SELECT * from fcc where id=1");
            $row = mysql_fetch_array($rs);
            self::closedata();
            return $row["date"];
             
        }}
      

  3.   

    非常感谢以上两位高手,然后我想把获取变量的代码放在构造函数可以吗,因为我在别的方法里也会用到有些变量,那不是又要引用一次,但是构造函数的多个变量如何返回(return)呢?
    class mydatabase{
      private $myhost;
      private $myuser;
      private $mypwd;  public function __construct(){
        require_once("../data/a.php");
    $this->myhost=$dbhost;
    $this->myuser=$dbuser;
    $this->mypwd=$dbpwd;
    return $this->myhost; 
      请问这里多个变量如何返回呢,测试如果没有return的话,别的方法获取不到
    //echo $dbhost;
      }function opendata($database){
        $this->__construct();
    $linkid = mysql_connect($this->myhost, $this->myuser, $this->mypwd);
    }}
      

  4.   

    建议a.php的那些变量写进一个同一个数组,也可改成function 然后return这个数组
    命名污染 有时候挺恶心的
      

  5.   

    第一种方法,用常量,这样在任何地方都可以使用了
    ../data/a.php<?php
        define('MYHOST', 'localhost');
        define('MYUSER', 'cccc');
        define('MYPWD', '123456');
    ?>
    <?php
    require_once("../data/a.php");class mydatabase{    private $myhost;
        private $myuser;
        private $mypwd;    public function __construct(){
            $this->myhost = MYHOST;
            $this->myuser = MYUSER;
            $this->mypwd = MYPWD;
        }    function opendata($database){
            $linkid = mysql_connect($this->myhost, $this->myuser, $this->mypwd);
        }}
    ?>
    第二种,用config数组
    ../data/a.php<?php
    return array(
        'myhost' => 'localhost',
        'myuser' => 'cccc',
        'mypwd' => '123456'
    );
    <?php
    class mydatabase{    private $dbConfig = array();    public function __construct(){
            $this->dbConfig = require_once("../data/a.php");
        }    function opendata($database){
            $this->__construct();
            $linkid = mysql_connect($this->dbConfig['myhost'], $this->dbConfig['myuser'], $this->dbConfig['mypwd']);
        }}
    ?>
      

  6.   

    to fdipzone:
    我按你第二个方法用数组,然后有点问题,调试的时候在构造函数最后输出数组print_r($this->dbConfig); 
    输出结果为:Array ( [myhost] => localhost [myuser] => cccc [mypwd] => 123456 ) Array ( [myhost] => [myuser] => [mypwd] => )
    输出为两个数组,第一个正常,第个值为空,
    然后我再在方法opendata中输出数组:$this->__construct();  print_r($this->dbConfig); 此方法中输出只显示:Array求解?
      

  7.   

    to fdipzone:
    经再次测试,您的第二个方法用数组,把require_once改成include,然后一切正常,问题解决,这是为何??
      

  8.   

    #6 第二方案的代码是错误的!
    虽然是示例代码,但既然是教人家怎么做,怎么说也得是经过测试的吧?1、载入参数使用了 require_once,这就表示被加载的数据只会被加载一次
      那么,当需要实例化两个 mydatabase 时,就只有第一个能获得参数
    2、在 opendata 执行了 $this->__construct() 基于错误1,当执行 mydatabase 方法是,由于未能加载参数文件,将导致数据库连接不上正确的写法是class mydatabase{
      private $linkid;
      public function __construct(){
        $dbConfig = include("../data/a.php");
        $linkid = mysql_connect($dbConfig['myhost'], $dbConfig['myuser'], $dbConfig['mypwd']);
      }  function opendata($database, $charset='utf8'){
        mysql_select_db($database, $this->linkid);
        mysql_query("set names $charset", $this->linkid);
      }
    }
    1、参数文件文件敏感,不应保存在对象中。需要时加载,用完就丢
    2、一个数据库类只对应一个数据库连接,所以数据库连接应在构造函数中完成
    3、opendata 方法只负责选择数据库和字符集设置,任务单一