質問編集履歴

3 追記

KazuhiroHatano

KazuhiroHatano score 6631

2018/06/10 23:43  投稿

$_SESSION内の未定義のクラスのインスタンスについて
$_SESSION内にクラスのインスタンスを入れてから
別プロセスでそのインスタンスのクラスを未定義のままsession_startしても
__PHP_Incomplete_Classのオブジェクトとされ
エラーになりませんでした
また、そのインスタンスを操作しようとしない限りは
メッセージも出されませんでした
この動作は普遍でしょうか?
あるいはPHPのバージョンやphp.iniの設定などにより
未定義のクラスのインスタンスがセッション内に存在するだけで
エラーになる場合もあるのでしょうか?
---
追記
試したコード
test1.php
```php
class Test{
   public $hoge;
   public function __construct($str){
       $this->hoge=$str;
   }
}
session_start();
$_SESSION['testa']=new Test('a');
$testb=new Test('b');
file_put_contents('testb.txt',serialize($testb));
```
test2.php
```php
session_start();
var_dump($_SESSION['testa']);
var_dump(unserialize(file_get_contents('testb.txt')));
//object(__PHP_Incomplete_Class)#3 (2) {
// ["__PHP_Incomplete_Class_Name"]=>
// string(4) "Test"
// ["hoge"]=>
// string(1) "a"
//}
//object(__PHP_Incomplete_Class)#4 (2) {
// ["__PHP_Incomplete_Class_Name"]=>
// string(4) "Test"
// ["hoge"]=>
// string(1) "b"
//}
```
セッションにおいても
あるいはファイルにシリアライズして保存したものについても
500エラーなど出ることなく未定義のクラスは
__PHP_Incomplete_Classのオブジェクトとして処理されました
この動作はPHPのバージョンや設定などによらず
保証される動作なのでしょうか?
保証される動作なのでしょうか?
---
さらに追記
[unserialize](http://php.net/manual/ja/function.unserialize.php)のマニュアルにおいては未定義のクラスのunserializeが行われた場合はunserialize_callback_funcが定義されていた場合
それがコールされるという旨の記述がありました
php.iniの設定などによってはここでエラーや例外を返すこともあり得る
ということではありますが、果たしてここで例外を返したり
エラーにすることを標準としていて
なおかつ上書き不可能という可能性は考慮すべきか否か…
  • PHP

    37419 questions

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

2 追記

KazuhiroHatano

KazuhiroHatano score 6631

2018/06/10 22:12  投稿

$_SESSION内の未定義のクラスのインスタンスについて
$_SESSION内にクラスのインスタンスを入れてから
別プロセスでそのインスタンスのクラスを未定義のままsession_startしても
__PHP_Incomplete_Classのオブジェクトとされ
エラーになりませんでした
また、そのインスタンスを操作しようとしない限りは
メッセージも出されませんでした
この動作は普遍でしょうか?
あるいはPHPのバージョンやphp.iniの設定などにより
未定義のクラスのインスタンスがセッション内に存在するだけで
エラーになる場合もあるのでしょうか?
エラーになる場合もあるのでしょうか?
---
追記
試したコード
test1.php
```php
class Test{
   public $hoge;
   public function __construct($str){
       $this->hoge=$str;
   }
}
session_start();
$_SESSION['testa']=new Test('a');
$testb=new Test('b');
file_put_contents('testb.txt',serialize($testb));
```
test2.php
```php
session_start();
var_dump($_SESSION['testa']);
var_dump(unserialize(file_get_contents('testb.txt')));
//object(__PHP_Incomplete_Class)#3 (2) {
// ["__PHP_Incomplete_Class_Name"]=>
// string(4) "Test"
// ["hoge"]=>
// string(1) "a"
//}
//object(__PHP_Incomplete_Class)#4 (2) {
// ["__PHP_Incomplete_Class_Name"]=>
// string(4) "Test"
// ["hoge"]=>
// string(1) "b"
//}
```
セッションにおいても
あるいはファイルにシリアライズして保存したものについても
500エラーなど出ることなく未定義のクラスは
__PHP_Incomplete_Classのオブジェクトとして処理されました
この動作はPHPのバージョンや設定などによらず
保証される動作なのでしょうか?
  • PHP

    37419 questions

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

1 修正

KazuhiroHatano

KazuhiroHatano score 6631

2018/06/10 18:47  投稿

$_SESSION内の未定義のクラスのインスタンスについて
$_SESSION内にクラスのインスタンスを入れてから
クラスの未定義のままsession_startしても
別プロセスでそのインスタンスのクラスを未定義のままsession_startしても
__PHP_Incomplete_Classのオブジェクトとされ
エラーになりませんでした
また、そのインスタンスを操作しようとしない限りは
メッセージも出されませんでした
この動作は普遍でしょうか?
あるいはPHPのバージョンやphp.iniの設定などにより
未定義のクラスのインスタンスがセッション内に存在するだけで
エラーになる場合もあるのでしょうか?
  • PHP

    37419 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る