2013-11-14 3 views
0

У меня проблема с доступом к классам.Доступ к различным классам включает:

index.php

include('includes/header.php'); 
include('includes/step1.php'); 
include('includes/footer.php'); 

header.php

session_start(); 

include('php/classes/Errorhandler.php'); 

include('php/classes/User.php'); 

$errorhandler = new Errorhandler(); 

$user = new User(); 

// Test 
print_r($errorhandler->errors); 

...html 

Errorhandler.php

class Errorhandler { 
    public $errors = array(); 
    ... 
} 

User.php

class User { 
    public function __construct() { 

    if($this->grab_computerid()) { 
     if(!$this->grab_mandant()) { 
     $errorhandler->errors[] = "102: There was an error."; 
     } 

     if(!$this->grab_os()) { 
     $errorhandler->errors[] = "103: There was an error."; 
     } 
    } else { 
     $errorhandler->errors[] = "101: There was an error."; 
    } 
} 

private function grab_computerid() { 
    $sqlconnection = new SqlConnection(); 

    $conn = $sqlconnection->db_connect(); 

    if ($conn) { 
     $query = "SELECT Computer_Idn FROM " . DB_PC_TABLE . " WHERE DeviceName = ?"; 

     $params = array($this->get_hostname()); 

     if ($sqlconnection->query($query, $params)) { 
      $computer_id = $sqlconnection->fetchRow(); 

      $this->set_computer_id($computer_id['Computer_Idn']); 

      return true; 
      echo "Test"; 
     } else { 
      $errorhandler->errors[] = "Statement error occurred."; 
     } 
    } else { 
     $errorhandler->errors[] = "Can't connect to database."; 
     // test 
     print_r($errorhandler->errors); 
    } 
    $sqlconnection->db_disconnect(); 
} 
} 

Index.php содержит соответствующие разделы для сборки сайта. В header.php я создаю два объекта (1. errorhandler, 2. user). Класс User проверяет возврат (boolean) из sqlconnection. Я знаю, что я использую неправильный пароль и получаю ложное. Таким образом, if ($ conn) корректно печатает print_r ($ errorhandler-> errors). Но когда я хочу показать ошибки в step1.php, ошибки массива пустые.

step1.php

// show negative messages 
if ($errorhandler->errors) { 
    foreach ($errorhandler->errors as $error) { 
    echo '<div class="alert alert-danger message"><strong>Error: </strong>' . $error . '</div>';  
     } 
    } 

Я тестировал его в header.php также и массив ошибок пуст тоже. Итак, массив ошибок заполняется только классом User.php, но я хочу отображать erros в step1.php. Есть ли проблемы с включениями?


Edit: Надежда, чтобы сделать его более ясным:

header.php

// load the class Errorhandler 
require_once('php/classes/Errorhandler.php'); 

// load the class User 
require_once('php/classes/User.php'); 

// create errorhandler object 
$errorhandler = new Errorhandler(); 

// create user object 
$user = new User(); 

print_r($errorhandler->errors); 

Я установил ошибку в классе пользователя:

$errorhandler->errors[] = "Can't connect to database."; 

Массив $ errorhandler- > ошибки отсутствуют в header.php.

ответ

1

Вы должны вызвать функцию. Вы не можете получить значение напрямую.

1st->$errorhandler = new Errorhandler();

2nd-> Errorhandler.php

class Errorhandler { 
function error() //create a function like this 
{ 
$error= /*any error*/; 
return $error; 
} 
} 

3rd->

if ($err=$errorhandler->error()) { 
foreach ($err as $error) { 
echo '<div class="alert alert-danger message"><strong>Error:</strong>'.$error.'</div>'; 
    } 

}

попробовать Кроме того, используя require_once() вместо того, чтобы включать в себя ();

0

Попробуйте использовать require_once вместо include. require_once выдает ошибку, если что-то пойдет не так и убьет скрипт. Эти ошибки должны появляться в файле error_log в той же папке, что и файл include. include выдает предупреждение и позволяет продолжить сценарий. Я лично использую require_once всюду. Кроме того, дважды проверьте свои пути include.

0

Вы должны передать $ errorhandler классу User. Как это:

$user = new User($errorhandler); 

И в классе Пользователь:

class User { 
    protected $err; 
    public function __construct($errorhandler) { 
     $this->err = $errorhandler; 
     //rest of your code 
    } 

    //rest of your code 
} 

или просто добавить: глобальный $ ErrorHandler; внутри User constructor.

+0

Я не понимаю, почему массив ошибок пуст. Массив является общедоступным, и я создал объект класса. После того, как я включу step1.php, и ошибка (которая была заполнена User.php в тестовой печати) пуста. – mnlfischer

+0

Возможно, это хороший способ создать геттер и сеттер для массива ошибок в классе Errorhandler? – mnlfischer

+0

Попробуйте сделать $ errorhandler глобальной переменной. – MrNomNom

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