1

次のコードがあります。

class user{
    public function __construct(){
    }
}
$user = new user;
$id = $_SESSION['user'];

その結果、「タイプ __PHP_Incomplete_Class のオブジェクトを配列として使用できません」というエラーが発生します。に変更$_SESSION['user']すると$_SESSION['_user']、これが修正されます。

これは開発環境でのみ発生しています。私のライブ環境では、このエラーは発生しません。

私の質問: セッション キー 'ユーザー' をクラス オブジェクトとして扱う構成設定はありますか?

4

4 に答える 4

1

実際には、この問題を引き起こす可能性のあるものは他にもあります。

  1. register_globals は on です - 上で述べたように。つまり、register_globals はすっごく STONE AGE !!! OFFなら回すだけ!

  2. 以前に含まれていなかった $_SESSION からオブジェクトをロードする場合 - オートローダーを設定すると役立つかもしれませんが、私が試したことから、それがポイント 1 と一緒になる場合 - これは役に立ちません (もう一度、まだオンの場合は 1 をオフにしてください) ..)

  3. セッション変数の実際の名前が問題を引き起こす可能性があります -> 例: $_SESSION['user'] - セッションをロードするとき、PHP (神はその理由を知っています) はクラス "User" を探そうとします。 class - セッション変数をこのクラスのインスタンスとして処理しようとしますが、CLass がまだロードされていないか、単にこの変数の構造が間違っているため (異なるデータを保持しているため)、不完全なクラスになる可能性がありますコース)。私の場合、それは 1 と 3 の組み合わせでした。セッション変数の名前を $_SESSION['save-user'] または sth に変更するだけで問題が解決します

  4. 上記のいずれかが発生した場合は、 __PHP_Incomplete_Class オブジェクト プロパティへのアクセスを強制する壊れたセッション オブジェクトを修正するこの anwser のコードを使用してみてください。

于 2013-06-11T08:35:21.217 に答える
1

私がこれに遭遇したとき、それは session_start(); の呼び出しが原因でした。クラス定義がロードされた後。最初に呼び出す必要がありました。

于 2012-09-06T02:38:31.543 に答える
0

クラスのインスタンスをセッションに保存する場合は、最初にそれをシリアル化する必要があります。PHPでは標準のserialize()関数を使用できます。情報を取得し、unserialize()関数を使用します。

class User()
{
    private $id;
    // other

    public function __construct()
    {
        //
    }
}

// Set the session
$newUser = new User();
$_SESSION['mySession'] = serialize($newUser);

// Retrieve session info
$myUser = unserialize($_SESSION['mySession']);
于 2012-09-06T13:16:07.880 に答える
0

私の推測では、register_globals が有効になっています。つまり、グローバル変数$userとセッション変数$_SESSION['user']は同じものであるため、セッション変数を新しいオブジェクトで$user = new user上書きすると、['user']

PHP は、呼び出し時にセッションに保存されているすべてのものをsession_start非シリアル化します。クラスがまだ定義されていない場合、PHP はオブジェクトを非シリアル化できません。そのようなことをしようとすると、PHP はそれを__PHP_Incomplete_Classという特別な役に立たないクラスにスローします。

これで問題が解決します

これにより、$_SESSION['user'] が配列ではなくオブジェクトであり、配列表記を使用してオブジェクトにアクセスできない (つまり、['index'])* という問題が修正されます。'index' がパブリック プロパティである場合は、->index を使用してアクセスします。それ以外の場合は、'index' を取得するためのメソッドをクラスに追加し、->get_index(); を使用してそのメソッドを呼び出す必要があります。

于 2012-09-06T02:38:51.247 に答える