-1

创建对象时出现奇怪的错误。虽然我按照分类定义的时间顺序创建了一个对象,但它进展顺利。但是当我更改顺序或对象创建时,它会出错。

我正在使用的类如下:

<?php
class dbClass{
private $dbHost, $dbUser, $dbPass, $dbName, $connection;
function __construct(){
    require_once("system/configuration.php");
    $this->dbHost = $database_host;
    $this->dbUser = $database_username;
    $this->dbPass = $database_password;
    $this->dbName = $database_name;
}
function __destruct(){
    if(!$this->connection){

    } else{
        mysql_close($this->connection);
    }
}
function mysqlConnect(){
    $this->connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) or die("MySQL connection failed!");
    mysql_select_db($this->dbName,$this->connection);
}
function mysqlClose(){
    if(!$this->connection){

    } else{
        mysql_close($this->connection);
    }
}
}
class siteInfo{
private $wTitle, $wName, $wUrl;
function __construct(){
    require_once("system/configuration.php");
    $this->wTitle = $website_title;
    $this->wName = $website_name;
    $this->wUrl = $website_url;
}
function __destruct(){

}
function showInfo($keyword){
    if($keyword=="wTitle"){
        return $this->wTitle;
    }
    if($keyword=="wName"){
        return $this->wName;
    }
    if($keyword=="wUrl"){
        return $this->wUrl;
    }
    }
    }
?>

问题是当我按以下顺序创建对象时,它运行良好:

include("system/systemClass.php");
$dbConnection = new dbClass();
$dbConnection -> mysqlConnect();
$siteInfo = new siteInfo();

但是,如果我将顺序更改为以下

include("system/systemClass.php");
$siteInfo = new siteInfo();
$dbConnection = new dbClass();
$dbConnection -> mysqlConnect();

它给出了错误! Warning: mysql_connect() [function.mysql-connect]: Access denied for user '#####'@'localhost' (using password: NO) in /home/#####/public_html/#####/system/systemClass.php on line 19 MySQL connection failed!

4

1 回答 1

2

您的问题来自非常规使用读取一次的配置文件,但应该在所有类中使用。

当您实例化第dbclass一个时,会读取配置,可能会分配变量,然后在构造函数中使用它们。

之后,实例化siteinfo将不会再次读取该文件,这危害较小,因为您最终只会得到一个空对象,该对象确实返回了很多空值,但确实有效。

反过来,你会得到一个siteinfo包含所有信息的对象,但是一个不工作的dbclass.

我的建议:不要那样使用配置文件。

第一步:删除require_once- 您需要多次读取该文件。

第二步:不要在构造函数中读取文件。向构造函数添加一个或多个参数,并从外部传递您想要使用的值。

信息:您可以使用 PHP 代码文件来配置东西,但您不应该在其中定义在外部使用的变量。这将同样有效:

// configuration.php
return array(
    'database_host' => "127.0.0.1",
    'database_user' => "root",
    // ...
);


// using it:
$config = require('configuration.php'); // the variable now has the returned array
于 2013-09-26T07:19:13.980 回答