質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

2086閲覧

$_SESSION内の未定義のクラスのインスタンスについて

KazuhiroHatano

総合スコア7804

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2018/06/10 09:14

編集2018/06/10 14:44

$_SESSION内にクラスのインスタンスを入れてから
別プロセスでそのインスタンスのクラスを未定義のままsession_startしても
__PHP_Incomplete_Classのオブジェクトとされ
エラーになりませんでした

また、そのインスタンスを操作しようとしない限りは
メッセージも出されませんでした

この動作は普遍でしょうか?

あるいはPHPのバージョンやphp.iniの設定などにより
未定義のクラスのインスタンスがセッション内に存在するだけで
エラーになる場合もあるのでしょうか?


追記

試したコード

test1.php

php

1class Test{ 2 public $hoge; 3 public function __construct($str){ 4 $this->hoge=$str; 5 } 6} 7session_start(); 8$_SESSION['testa']=new Test('a'); 9$testb=new Test('b'); 10file_put_contents('testb.txt',serialize($testb));

test2.php

php

1session_start(); 2var_dump($_SESSION['testa']); 3var_dump(unserialize(file_get_contents('testb.txt'))); 4 5//object(__PHP_Incomplete_Class)#3 (2) { 6// ["__PHP_Incomplete_Class_Name"]=> 7// string(4) "Test" 8// ["hoge"]=> 9// string(1) "a" 10//} 11//object(__PHP_Incomplete_Class)#4 (2) { 12// ["__PHP_Incomplete_Class_Name"]=> 13// string(4) "Test" 14// ["hoge"]=> 15// string(1) "b" 16//} 17

セッションにおいても
あるいはファイルにシリアライズして保存したものについても
500エラーなど出ることなく未定義のクラスは
__PHP_Incomplete_Classのオブジェクトとして処理されました

この動作はPHPのバージョンや設定などによらず
保証される動作なのでしょうか?


さらに追記

unserializeのマニュアルにおいては未定義のクラスのunserializeが行われた場合はunserialize_callback_funcが定義されていた場合
それがコールされるという旨の記述がありました
php.iniの設定などによってはここでエラーや例外を返すこともあり得る
ということではありますが、果たしてここで例外を返したり
エラーにすることを標準としていて
なおかつ上書き不可能という可能性は考慮すべきか否か…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/10 09:33 編集

何言ってのかわかんないねぇ。 インスタンスが生成できてる時点で、なんのクラスがわかるのにクラス未定義ってどういうことよ。1058もスコアがあるならもうちょっとまともな日本語話して。
退会済みユーザー

退会済みユーザー

2018/06/10 09:53

修正したけど、相変わらず、相手に理解してもらうつもりはなさそうな文章だな。
KazuhiroHatano

2018/06/10 10:01

ポーリングにおいての処理を最小限にするため、できれば必要のないクラスの読み込みをしたくないのです。
退会済みユーザー

退会済みユーザー

2018/06/10 10:16

何で必要のないものをセッションに登録するの?
KazuhiroHatano

2018/06/10 10:22

ポーリングには更新の有無の確認と、更新内容の反映の処理があり、更新内容の反映の処理には必要だが更新の有無の確認においては必要がないクラスというものが多くあります
退会済みユーザー

退会済みユーザー

2018/06/10 10:25

なら、その背景を質問文に書いたらいいんじゃねぇの? 1058もスコア貯めておいて、質問の仕方わからねぇなんてことねぇだろ。他の初心者は教えてもらうのにどんな努力してたよ?
m.ts10806

2018/06/10 11:40

実際検証したコードを提示された方が良いかと。文章の説明だけでは自身が検証したことを伝えるのは無理があります。
KazuhiroHatano

2018/06/10 13:25

蛇足ですが、ポーリングにおいては使いたいプロパティだけを定義した同名のダミーのクラスを作って処理する、という手法を取ってます。これにはポーリング中に行える処理を制限する目的もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問