私は多少OOPプログラミングの新人ですので、私はいくつかばかげた過ちを犯している可能性が非常に高いです。ここに私の問題があります。私のコードを実行しているとき、私は次のエラーを取得:への私の試みにおいてグローバル変数の問題
<?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;
}
}
:以下
Fatal error: Call to a member function checkLogin() on a non-object in /application/libraries/Session.php on line 30
をSession.phpファイル(私はそれが簡単に見つけることにするためにライン30をコメントしました)です問題のトラブルシューティング私はechoとgettype($ auth)をインクルードとクラス宣言の間に置いています。結果の出力は「Object」でした。 startSession関数でglobal $ authを宣言した直後に、echo gettype($ auth)を置いてみました。結果の出力は "NULL"でした。私の問題が何であるか、どんな考えですか?ありがとう。
EDIT:の$ authは$auth
がAuthentication.php
で定義されている方法を見ずにAuthentication.php
+1グローバルが悪いと、6になり、とにかく使用するのは悪い習慣です。 –
簡単な質問です。データベースクラスやセッションクラスなどの特定のクラスのインスタンスをインスタンス化し続けるのは悪いことに思えます。私はちょっと読んだことがあり、これに対する解決策はシングルトンパターンを使用しているようです。あなたはシングルトンパターンを使用することに同意するか、より良い方法ですか?ご協力いただきありがとうございます。 – blcArmadillo
シングルトンは、これらのタイプの状況に最適です。クラスの1つのグローバルインスタンスである必要があるのは、そのクラスがアプリケーションの残りの部分に対して単一のサービスを提供するからです。シングルトンパターンも最も濫用されているパターンの1つです。そのため、過剰使用しないように注意してください。 –