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

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

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

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

Q&A

解決済

2回答

1716閲覧

PHP4からPHP5へのバージョンアップに伴う$thisの変更について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2016/05/26 06:31

###前提・実現したいこと
サーバーを変更したところPHPのバージョンが変わってしまい今まで動いていたプログラムが動かなくなってしまいました。
そのためプログラムをPHP5に対応した形に変更したいのですが、$thisの動きで躓いてしまいました。
自分なりに調べてみたもののあまりピンとこなかったもので、こちらで聞いたほうが早いかと思い質問をさせていただきました。
当方、PHPをはじめて半年足らずで$thisをあまり使ったことが無いので、ここはこういう動きをしているからこういう風に直したらよいなどの解説、助言をお願いします。

###該当のソースコード

PHP

1<?php 2class Reload { 3 var $id; // ID 4 var $val; // ユニーク値 5 var $flag; // GET/POSTフラグ 6 7 // コンストラクタ 8 function Reload($id = 'RELOAD') { 9 10 // IDをセット 11 $this ->id = $id; 12 13 // GET/POSTをチェック 14 if ($_GET[$this->id]){ 15 $this->val = $_GET[$this->id]; 16 }else if ($_POST[$this->id]){ 17 $this->val = $_POST[$this->id]; 18 } 19 // GET/POSTで送信した場合はフラグをセット 20 if ($this->val){ 21 $this->flag = true; 22 } 23 // 送信していない場合はIDを生成 24 else{ 25 $this->val = uniqid(''); 26 } 27 } 28 29 // リロードチェック 30 // 0: リロードしていない 31 // 1: リロードした 32 function Check() { 33 34 // セッションデータを初期化 35 session_start(); 36 37 // GET/POSTフラグをチェック 38 if ($this->flag) { 39 40 // セッション変数が存在する場合は1をリターン 41 if ($_SESSION[$this->val]){ 42 return 1; 43 } 44 // 存在しない場合はセッション変数をセットして0をリターン 45 else { 46 47 $_SESSION[$this->val] = TRUE; 48 return 0; 49 } 50 } 51 return 0; 52 } 53 54 // URL用パラメータを出力 55 function ParamURL() { 56 return sprintf("?%s=%s", $this->id, $this->val); 57 } 58 59 // フォームタグ用パラメータを出力 60 function ParamTAG() { 61 return "<input type=\"hidden\" name=\"$this->id\" value=\"$this->val\">"; 62 } 63} 64 65?> 66

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

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

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

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

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

icham

2016/05/26 08:37

どのようなエラーがでているのですか?
guest

回答2

0

$thisは、主にそのクラスのメソッドや変数を参照する時に使うので、そう難しく考える必要はないと思います。

また、ご質問の内容とはやや違うかもしれないですが、コンストラクタとアクセス修飾子が気になりました。

PHP5からは、コンストラクタは__construct()で記述することが推奨されています。
コンストラクタとデストラクタ

また、使わないでも問題ないですが、アクセス修飾子をつけるほうがより安全なプログラムになると思います。
PHPのアクセス修飾子public, protected, privateの違い

投稿2016/05/26 07:11

yiwa

総合スコア60

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

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

退会済みユーザー

退会済みユーザー

2016/05/26 07:26

メソッドや変数を参照、というとたとえば $this -> id = $id; では何を参照しているのでしょうか? コンストラクタやアクセス修飾子など知らないことばかりです! 教えていただいてありがとうございます。 今回は$thisを動かすのが急務ですのでできるようになったら勉強したいと思います。
yiwa

2016/05/26 07:45

$this->idは、3行目の「 var $id;」を参照しています。
guest

0

ベストアンサー

php

1if ($_GET[$this->id]){ 2 $this->val = $_GET[$this->id]; 3}else if ($_POST[$this->id]){ 4 $this->val = $_POST[$this->id]; 5}

スーパーグローバルとはいえ、$_GETや$_POSTは配列なので、
存在しないキーを参照しようとするとNoticeエラーを吐きます。
isset()で包みましょう。

php

1if (isset($_GET[$this->id])) { 2 $this->val = $_GET[$this->id]; 3} else if (isset($_POST[$this->id])) { 4 $this->val = $_POST[$this->id]; 5}

これは単なるテクニックの話ですが、
特定条件のみ行う場合は逆を速攻で終わらせればネストが減ります。
コードリーティングに影響するので状況に応じて使ってください。

毎行にコメントを仕込まなければならないのは、
リロードのチェックというメソッドがログイン中のセッション情報を気にし始めてるからだと思います。

全く別の複数の変数の状態を気にしながら改修や修正作業を行う必要が出てくるので、後々苦労すると思います。
余裕ができたらメソッド名や処理を見なおしてみてください。
下記はとりあえずネストだけ減らしてみました。

PHP

1 // リロードチェック 2 // 0: リロードしていない 3 // 1: リロードした 4 function Check() { 5 // セッションデータを初期化 6 session_start(); 7 // GET/POSTフラグをチェック 8 if ($this->flag) { 9 // セッション変数が存在する場合は1をリターン 10 if ($_SESSION[$this->val]){ 11 return 1; 12 } 13 // 存在しない場合はセッション変数をセットして0をリターン 14 else { 15 $_SESSION[$this->val] = TRUE; 16 return 0; 17 } 18 } 19 return 0; 20 }

PHP

1// リロードチェック 2// 0: リロードしていない 3// 1: リロードした 4function Check() { 5 session_start(); 6 if (!$this->flag) { 7 return 0; 8 } 9 if ($_SESSION[$this->val]) { 10 return 1; 11 } 12 $_SESSION[$this->val] = true; 13 return 0; 14}

投稿2016/05/26 11:37

miyabi-sun

総合スコア21158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問