Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对象是否应按类定义的时间顺序创建?_Php_Mysql_Class_Object - Fatal编程技术网

Php 对象是否应按类定义的时间顺序创建?

Php 对象是否应按类定义的时间顺序创建?,php,mysql,class,object,Php,Mysql,Class,Object,我在创建对象时出现了一个奇怪的错误。虽然我按照分类定义的时间顺序创建了一个对象,但它进行得很顺利。但是,当我更改顺序或对象创建时,会出现错误 我使用的课程如下: <?php class dbClass{ private $dbHost, $dbUser, $dbPass, $dbName, $connection; function __construct(){ require_once("system/configuration.php"); $this->dbHo

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

我使用的课程如下:

<?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");
$siteInfo = new siteInfo();
$dbConnection = new dbClass();
$dbConnection -> mysqlConnect();
它会出错!
警告:mysql#u connect()[function.mysql connect]:第19行的/home/###/public#html/####/system/systemClass.php中的用户“##########/system/systemClass.php”被拒绝访问

MySQL连接失败

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

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

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

另一方面,您会得到一个包含所有信息的
siteinfo
对象,但它是一个非工作的
dbclass

我的建议是:不要以这种方式使用配置文件

第一步:删除
require\u一次
-您需要多次读取该文件

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

信息:您可以使用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

我认为sitInfo包含数据库中的信息,该连接尚未建立,之后调用mysqlConnect。不再维护
mysql.*
函数,不应在任何新的代码库中使用。它正逐渐被淘汰,取而代之的是更新的API。相反,你应该与or一起使用。是的。变量的隐藏赋值。这就是为什么糟糕的PHP代码会让人想死的原因之一……我想说的是,您的问题中至少有一个是您在一个文件中定义了所有的类——这通常是一个糟糕的做法。@JoranDenHouting否,site info变量来自configuration.PHP文件。在这里,变量只是简单地列出,如$website\u title=“My website”;等等,它的信息不是来自mysql数据库
// 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