Проблема с глобальными переменными

Я немного новичок в программировании ООП, поэтому, скорее всего, я совершу какую-то глупую ошибку. Вот моя проблема. При запуске моего кода я получаю следующую ошибку:

Неустранимая ошибка: вызов функции-члена checkLogin () для не-объекта в /application/libraries/Session.php в строке 30

Ниже представлен файл Session.php (я прокомментировал строку 30, чтобы было легче найти):

<?php require_once(LIBPATH . 'MySQLDB.php'); require_once(LIBPATH . 'Authentication.php'); class Session { public $url; public $referrer; public $redirect; function Session() { $this->startSession(); } function startSession() { global $auth; session_start(); if (isset($_SESSION['url'])) { $this->referrer = $_SESSION['url']; } else { $this->referrer = '/'; } $this->url = $_SESSION['url'] = $_SERVER['PHP_SELF']; if (isset($_SESSION['redirect'])) { $this->redirect = $_SESSION['redirect']; } else { $this->redirect = $_SESSION['redirect'] = '/'; } $auth->checkLogin(); // LINE 30 } function setRedirect($page) { $this->redirect = $_SESSION['redirect'] = $page; } } 

В моих попытках устранить проблему я поставил echo gettype ($ auth) между объявлениями include и class. Результатом вывода был «Объект». Затем я попытался установить echo gettype ($ auth) сразу после объявления глобальной функции $ auth в функции startSession. Результат был «NULL». Любая идея относительно моей проблемы? Благодарю.

EDIT: $ auth объявляется в Authentication.php

Related of "Проблема с глобальными переменными"

Не видя, как $auth определяется в Authentication.php , это сложно.

Кроме того, поскольку вы новичок в ООП, позвольте мне быть первым, кто скажет вам, что глобалы плохие . Просто не используйте их. Если вы чувствуете, что вам нужно, скорее всего, это потому, что у вас плохой дизайн. Вы должны переосмыслить, что вместо того, чтобы использовать глобальные переменные, чтобы быстро исправить вашу проблему. Вместо этого создайте экземпляр нового экземпляра класса Authentication , выполнив что-то вроде

 $auth = new Authentication; 

Убедитесь, что Authentication действительно настроена правильно как класс, так и все. В онлайн-документах PHP есть хорошее представление ООП, которое вы также можете посмотреть.

Проблема заключается не в коде, который вы на самом деле показываете. Я вполне уверен, что реальная проблема лежит где-то после объявления сеанса, но до того, как вы действительно создадите экземпляр этого. Попробуйте вставить var_dump ($ auth); перед тем, как вы вызовете new Session и посмотрите, действительно ли он установлен. Затем вы можете прощупать код назад и найти точку, где она не установлена.

Также, как уже упоминалось: следует избегать глобалов. Лучшим решением было бы передать $auth в качестве параметра конструктору Session и сохранить его как переменную-член класса.

Сообщение об ошибке:

 Fatal error: Call to a member function checkLogin() on a non-object in /application/libraries/Session.php on line 30 

означает, что PHP не может найти функцию checkLogin в Authenrication.php. Убедитесь, что вы создаете класс, найденный в Authentication.php, на свой Session.php или передаете экземпляр переменной в свой класс Session.

Убедитесь, что $ auth объявлен глобальным в Authentication.php