Я немного новичок в программировании ООП, поэтому, скорее всего, я совершу какую-то глупую ошибку. Вот моя проблема. При запуске моего кода я получаю следующую ошибку:
Неустранимая ошибка: вызов функции-члена 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
Не видя, как $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