PHP では、Session を使用してオブジェクトを保存すると、PHP はオブジェクトを自動的にシリアル化します。セッション変数を読み取るとき、正確に session_start で、PHP はセッション内のシリアル化されたオブジェクトを逆シリアル化します。このときクラスの定義が必要になるのですが、なぜでしょうか?シリアル化中に保存されるのは Object のプロパティ値だけであるためです。オブジェクトにメソッドが含まれている場合、逆シリアル化中にメソッドを復元するためにクラス定義が必要です。
通常、PHP.ini で session_auto_start をオンにできるため、PHP スクリプトの実行が開始されると、セッション内のオブジェクトが自動的に逆シリアル化されます。ただし、現時点では、すべてのクラス定義ファイルを含めるわけではありません。 session_auto_start をオフにすることをお勧めします。すべてのクラス定義ファイルをインクルードしてから session_start() 関数を呼び出すと、問題は解決したように見えます。
待って、セッション内のすべての変数がすべてのリクエストで使用されるのでしょうか?そうでないかもしれない?では、なぜすべてのクラス定義ファイルを含めるのでしょうか?クラス定義ファイルが 100 個あれば、遅くはなりません。オンデマンドでクラス定義ファイルをインクルードする方法はありますか?持っている!それがPHP5の__autoload関数です。 PHP スクリプトの最初にこれを定義するだけです:
function __autoload($className){ include_once $className . '.php';}
このように、新しいクラスと現在のスクリプトにこのクラスの定義が含まれていない場合、PHP は関数 __autoload At を探します。今回は、__autoload が定義されている場合、PHP はこの関数を呼び出します。