1

私はOOPプログラミングに少し慣れていないので、愚かな間違いを犯している可能性が非常に高いです。これが私の問題です。コードを実行すると、次のエラーが発生します。

致命的なエラー:30行目の/application/libraries/Session.phpにある非オブジェクトのメンバー関数checkLogin()を呼び出す

以下は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;
}
}

問題のトラブルシューティングを試みる際に、includesとclass宣言の間にecho gettype($ auth)を配置しました。結果の出力は「オブジェクト」でした。次に、startSession関数でグローバル$ authを宣言した直後に、echo gettype($ auth)を配置してみました。結果の出力は「NULL」でした。私の問題が何であるかについて何か考えはありますか?ありがとう。

編集: $authはAuthentication.phpで宣言されています

4

4 に答える 4

1

$authでどのように定義されているかを見ずにAuthentication.php、助けるのは難しいです。

また、あなたはOOPを初めて使用するので、グローバル変数が悪いことを最初に伝えさせてください。使用しないでください。あなたがしなければならないと感じるなら、おそらくそれはあなたが悪いデザインを持っているからです。グローバルを使用して問題をすばやく修正するのではなく、それを再考する必要があります。Authentication代わりに、次のような操作を行って、クラスの新しいインスタンスをインスタンス化します。

$auth = new Authentication;

Authenticationクラスおよびすべてとして実際に正しく設定されていることを確認してください。PHPのオンラインドキュメントには、 OOPの優れた紹介があります。

于 2009-05-28T23:33:40.433 に答える
1

問題は、実際に表示しているコードにはありません。実際の問題は、Sessionの宣言後、実際にそのインスタンスを作成する前のどこかにあると確信しています。var_dump($ auth);を挿入してみてください。呼び出す直前にnew Session、実際にそこに設定されているかどうかを確認します。次に、コードを逆方向に調べて、設定されていないポイントを見つけることができます。

また、すでに述べたように、グローバルは避ける必要があります。より良い解決策は$auth、のコンストラクターにパラメーターとして渡し、Sessionそれをクラスのメンバー変数として格納することです。

于 2009-05-28T23:38:41.377 に答える
0

エラーメッセージ:

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

これは、PHPがAuthenrication.phpでcheckLogin関数を見つけることができないことを意味します。Authentication.phpにあるクラスをSession.phpにインスタンス化するか、インスタンス化された変数をSessionクラスに渡すようにしてください。

于 2009-05-29T03:46:46.340 に答える
-1

$authがAuthentication.phpでグローバルに宣言されていることを確認してください

于 2009-05-28T23:37:19.677 に答える