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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Q&A

解決済

2回答

2227閲覧

$_SESSIONにオブジェクト(自分で定義したクラスのインスタンス) をそのまま保存できますか?

tt02

総合スコア36

PHP

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

0グッド

3クリップ

投稿2021/10/04 12:18

下記の例の場合、オブジェクトをserialize関数でシリアライズ化して、セッションに保存したり、
セッションから取得後、unserialize関数でもとに戻す必要はあるでしょうか。

自分としては、下記の検証をして、不要だと思っていますが、この認識に誤りはあるでしょうか。

以下、検証したコードです。

class UserTest {     private $num;     private $name;     public function __construct($num, $name)     {         $this->num = $num;         $this->name = $name;     }     public function getNum()     {         return $this->num;     }     public function getName()     {         return $this->name();     } } $user = new UserTest(2, "taro"); $_SESSION["test"] = $user; $v = $_SESSION["test"]; var_dump($v);

■以下のように、目的通りに出力します。

object(UserTest)#2 (2) { ["num":"UserTest":private]=> int(2) ["name":"UserTest":private]=> string(4) "taro" }

□環境:
・php7.3、
・php.iniのsession.serialize_handler→php。

つまり、セッションにオブジェクトを保存する時に、メンバー変数にリソース型のデータがなければ(下記の引用サイトの警告の説明欄)、

$_SESSION["test"] =serialize($user);

上記のようにシリアライズ化してから保存する必要はないと考えています。セッションにstring型の値を保存するサンプルは多く見てきたのですが、オブジェクトを保存する例をなかなか見つけれなかったので、お尋ねさせて頂きました。
どうぞ、よろしくお願いします。

引用:https://www.php.net/manual/ja/intro.session.php

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

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

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

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

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

guest

回答2

0

検証されているコードだと、単にスーパーグローバル変数$_SESSION['test']にオブジェクトを代入してvar_dump()しているだけなので不十分な内容になっています。
(サーバ側でセッションの保存とレストアがされていないはず)

以下の様に二つのファイルに分けて、
順番にブラウザでアクセスするとどうなりますか?

PHP

1 2//session_save.php 3 4class UserTest 5{ 6 private $num; 7 private $name; 8 public function __construct($num, $name) 9 { 10 $this->num = $num; 11 $this->name = $name; 12 } 13 public function getNum() 14 { 15 return $this->num; 16 } 17 public function getName() 18 { 19 return $this->name(); 20 } 21} 22 23session_start(); 24$user = new UserTest(2, "taro"); 25$_SESSION["test"] = $user; 26

PHP

1 2//session_restore.php 3session_start(); 4$v = $_SESSION["test"]; 5var_dump($v); 6

投稿2021/10/04 15:26

tanat

総合スコア18727

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

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

tt02

2021/10/04 23:32

確認させていただきました。 ご回答ありがとうございます。 しかし、 session_restore.php の側ではクラスファイルの読み込みがなされていないために、うまく再取得できません。 クラスの定義ファイルが読み込まれていれば、serializeとunserializeは不要でした。 また、クラスファイルの読み込みがなければ、serialize,unserializeをつけても、オブジェクトの取得に失敗しました。 やはり、serialize,unserializeは不要そうですね。
tanat

2021/10/05 02:58

はい、ご認識の通りです。
guest

0

自己解決

https://www.php.net/manual/ja/intro.session.php
に記載されている点を留意しつつ、コーディングするという結論に至りました。
※ご協力いただいたtanat様、ありがとうございました。

セッションデータはシリアライズされるので、 resource 型の変数はセッションに格納できません。 シリアライズハンドラ (php および php_binary) は、register_globals の制約を引き継いでいます。 そのため、数値のインデックスや特殊文字 (| や !) を含む文字列のインデックスは使えません。 これらを使っていると、スクリプトのシャットダウン時にエラーが発生します。 php_serialize には、そのような制約はありません。

投稿2021/10/07 12:21

tt02

総合スコア36

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問