2013-09-26 3 views
-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!

+5

Я думаю, что sitInfo содержит информацию из базы данных, соединение которой еще не выполнено, после чего вызывается mysqlConnect. –

+1

Функции 'mysql_ *' ** больше не поддерживаются ** и не должны использоваться в какой-либо новой кодовой базе. Он постепенно прекращается в пользу новых API. Вместо этого вы должны использовать [** подготовленные заявления **] (https://www.youtube.com/watch?v=nLinqtCfhKY) с помощью [PDO] (http://php.net/pdo) или [MySQLi] (http://php.net/mysqli). –

+0

Да. Скрытое назначение переменных. Это одна из причин, почему ** плохой ** PHP-код может заставить человека хотеть умереть ... – ppeterka

ответ

2

Ваша проблема связана с нетрадиционным использованием файла конфигурации, который читается ONCE, но должен использоваться во всех классах.

Когда вы сначала создаете экземпляр 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 
+0

Спасибо. Это сработало. – programmer

Смежные вопросы