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

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

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

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

Q&A

解決済

2回答

6888閲覧

PHP のクラス(関数)内でのセッションについて

SofPyon

総合スコア65

PHP

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

0グッド

1クリップ

投稿2015/02/21 09:38

PHP でのクラスで、セッションについて聞きたいことがあります。

例えば、以下のようなコードがあるとします。

###コード

lang

1 2//コード1 3 4class Hoge1 { 5 public function __construct(){ 6 session_start(); 7 $_SESSION["test1"] = "test1"; 8 } 9} 10 11class Hoge2 { 12 public function __construct(){ 13 echo $_SESSION["test1"]; 14 } 15} 16 17$hoge1 = new Hoge1(); 18$hoge2 = new Hoge2(); 19

lang

1 2//コード2 3 4session_start(); 5 6$_SESSION["test2"] = "test2"; 7 8class Hoge3 { 9 public function __construct(){ 10 echo $_SESSION["test2"]; 11 } 12} 13 14$hoge3 = new Hoge3(); 15

lang

1 2//コード3 3 4class Hoge4 { 5 public function __construct(){ 6 session_start(); 7 } 8} 9 10$hoge4 = new Hoge4(); 11 12$_SESSION["test3"] = "test3"; 13 14echo $_SESSION["test3"]; 15

lang

1 2//追加1 3 4function hogehoge1() { 5 session_start(); 6} 7 8hogehoge1(); 9 10$_SESSION["test4"] = "test4"; 11 12echo $_SESSION["test4"]; 13

lang

1 2//追加2 3 4session_start(); 5 6function hogehoge2() { 7 $_SESSION["test5"] = "test5"; 8} 9 10hogehoge2(); 11 12echo $_SESSION["test5"]; 13 14//hogehoge2(); //ここにあったら? 15

###質問

  1. これら全てのコードの $_SESSION["test*"] は、セッションへの代入後、値が test* となるか
  2. 他のページに移動しても、 1 と同じことが言えるか
  3. 上で示したコード以外でも、考えられるパターンがあるか。
  4. session_start() は、そもそもどんな機能の関数なのか。

上のコードそれぞれが機能するかどうか、というものがメインではなく、
クラス(関数)内とクラス(関数)外でのセッションについて 知りたいので、回答よろしくお願いします。

質問がややこしくて申し訳ありません。

(一部、細かな誤りがあるかもしれません。)

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

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

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

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

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

guest

回答2

0

ベストアンサー

$_SESSION[] に限らず、スーパーグローバルで規定されている変数は、
関数の内外にかかわらずグローバル扱いとなります。
なので、(1) については単に実行の順序でその値が決まります。

ただし、それは PHP が実行中の間のみの話であり、(2) については
『他のページ』において $_SESSION[] がセッション変数であるかどうか、
で決まります。$_SESSION[] をセッション変数として扱うためには、
プログラムのできるだけ先頭に近いところで session_start() を
呼んでやる必要があります。無条件にセッションを開始して良いので
あれば、session.auto_start を設定しておくのが簡単です。

ちなみにセッションが有効な場合($_SESSION[] がセッション変数
として機能している場合)、プログラムの終了時に $_SESSION[]
の中身が(デフォルトでは)ファイルに書きだされます。その後、
『他のページ』がプログラムとして動いて、その中で session_start()
が呼ばれると、ファイルの中身が $_SESSION[] に戻されます。
これでサーバ側で変数の受け渡しを実現しています。

ファイルの中にはたくさんのセッション情報がありますが、その中で
『どのセッション情報を使うか』というキーにあたるのが、ブラウザ
から送られてくるクッキーです。

机上でいろいろやっても実際にはケアレスミスで動かない

ことも多いので、ここまでサンプルを作れるのであれば、

実際にやってみるのが一番確実に理解できると思います。

投稿2015/02/21 10:47

hotta

総合スコア1613

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

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

SofPyon

2015/02/21 13:50

スーパーグローバルなら、関数内外関係なしに変数扱えるのですね。 > 実際にやってみるのが一番確実に理解できると思います。 そうですね。試してみます。 回答ありがとうございました。
guest

0

$_SESSIONはスーパーグローバル変数なので、クラスや関数の中でも同じ値(配列)を指します。
なので、それらのどの例でも有効です。
特に、$_SESSIONの値はサーバ側にサイトごとに何らかのファイルが作られて保持されるので、Webサーバを再起動しても値が保持されます。そのため、同一サイトならページを跨って保持されます。
session_start()はデータ保持を開始する、という意味の処理です。このタイミングで、データ保持ファイルが無ければ作成され、存在すれば値が読み込まれます。
このデータは、セッションがタイムアウトするまで保持されます。

投稿2015/02/21 10:33

shinosan

総合スコア209

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

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

SofPyon

2015/02/21 13:53

セッションって、サーバーを再起動しても消えないんですね。 session_start について詳しく解説してくださり、大変納得できました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問