2009-05-28 13 views
1

私は多少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は$authAuthentication.phpで定義されている方法を見ずにAuthentication.php

答えて

2

で宣言され、それに役立つのは難しいです。

また、OOPを初めてお使いになりましたので、グローバルが悪いことを最初に教えてください。。ちょうどそれらを使用しないでください。あなたがしなければならないと感じたら、あなたが悪いデザインをしているからでしょう。問題をすばやく解決するためにグローバルを使用する代わりに、そのことを再考する必要があります。その代わり、

$auth = new Authentication; 

ような何かをすることによって、あなたのAuthenticationクラスの新しいインスタンスをインスタンス化Authenticationが実際にクラスとして適切に設定し、すべてのものであることを確認してください。 PHPのオンラインドキュメントは良いOOP introductionを持っています。

+0

+1グローバルが悪いと、6になり、とにかく使用するのは悪い習慣です。 –

+0

簡単な質問です。データベースクラスやセッションクラスなどの特定のクラスのインスタンスをインスタンス化し続けるのは悪いことに思えます。私はちょっと読んだことがあり、これに対する解決策はシングルトンパターンを使用しているようです。あなたはシングルトンパターンを使用することに同意するか、より良い方法ですか?ご協力いただきありがとうございます。 – blcArmadillo

+0

シングルトンは、これらのタイプの状況に最適です。クラスの1つのグローバルインスタンスである必要があるのは、そのクラスがアプリケーションの残りの部分に対して単一のサービスを提供するからです。シングルトンパターンも最も濫用されているパターンの1つです。そのため、過剰使用しないように注意してください。 –

-1

は、$ authは問題はあなたが実際に見せているコードではありませんAuthentication.php

+1

PHPでは変数をグローバルとして宣言しません。グローバルは、関数のスコープに変数をインポートするためにのみ使用されます。 –

1

でグローバル宣言されていることを確認してください。実際の問題はセッションの宣言の後のどこかにありますが、実際にインスタンスを作成する前にあることは確信しています。 var_dump($ auth)を挿入してみてください。 new Sessionを呼び出して、実際にそこに設定されているかどうかを確認してください。次に、コードを後方に探査し、それが設定されていないポイントを特定することができます。

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

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クラスに渡すようにしてください。

関連する問題