是否应按时间顺序创建对象?

时间:2013-09-26 07:00:38

标签: php mysql class object

创建对象时我遇到了一个奇怪的错误。虽然我按照时间顺序创建了一个按类别定义的对象,但它仍然很好。但是当我改变顺序或对象创建时,它会给出错误。

我正在使用的课程如下:

<?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!

1 个答案:

答案 0 :(得分:2)

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

首先实例化dbclass时,会读取配置,可能会分配变量,并在构造函数中使用这些。

之后,实例化siteinfo将不会再次读取该文件,这样做的危害较小,因为您最终会得到一个空对象,该对象确实会返回大量null,但确实有效。

反过来说,你得到一个包含所有信息的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