1

既存のアプリケーションに次のコードがあります。

if(!($article = $this->memcached->get('article_'.$articleId))) {
    $article = $this->model->ArticleManager()->getStoryById($articleId);
    $this->memcached->set('article_'.$articleId, $article);
}

いいえ、 $article が ArticleManager から取得された場合、それは正しいタイプであり、正確には名前空間オブジェクト \Site\Articles\Article() です。ただし、この値が memcached に格納され、次のページの読み込みで返される場合、オブジェクトの型は __PHP_Incomplete_Class になります。私が知っているのは、元のクラスが見つからないことを意味しますが、なぜ...?

この呼び出しが含まれるファイルは、名前空間 \Site\index\default_Read_Controller() の下にあります。

4

1 に答える 1

2

その2番目のリクエスト専用のクラス仕様を含めておらず、それを見つけることができる__autoload(または優先) が定義されていないためです。クラス定義はオブジェクトデータと一緒に保存されません。取得時にロードまたはオートロードspl_autoload_register()可能にするか、明示的に定義する必要があります: のコメントを参照してください(これは、php リクエストの外部に保存されている場合に通常通過する関数変数です):unserialize

アンシリアライズ中に未定義のクラスをインスタンス化する必要がある場合に呼び出されるコールバック関数を設定することができます。(不完全なオブジェクト「__PHP_Incomplete_Class」を取得しないようにするため。) php.ini、ini_set()、または .htaccess を使用して「unserialize_callback_func」を定義します。未定義のクラスをインスタンス化する必要があるたびに、それが呼び出されます。この機能を無効にするには、この設定を空にするだけです。

于 2013-10-15T07:46:16.150 に答える