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

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

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

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

Q&A

解決済

4回答

11736閲覧

PHPでクラス中のメソッドからreturnで返された場合、そのメソッド内ではreturn以降は処理されないという認識は間違いでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

2グッド

5クリップ

投稿2016/12/26 07:23

編集2016/12/26 07:26

【質問】
PHPでクラス中のメソッドからreturnで返された場合、そのメソッド内ではreturn以降は処理されないという認識は間違いでしょうか?


【例】あるクラスhogeを、newした後に、hogeクラス中にhugaメソッドを実行すると仮定します。

php

1(とあるプログラム内) 2$obj = new hoge(); 3$obj->huga(); 4 5 6(hogeクラス) 7class hoge(){ 8 public function huga(){ 9 if(条件){ 10 return true; //↓※1ここ以降の処理は行われないと思っていた。 11 } 12 //※2 ここ以降にも処理が実装されている 13 } 14}

hogeのクラスから抜ける場合、上記※1の様にreturnで抜けられると思っておりました。
ところがチームメンバーにソースレビューで
「return の直後にexit入れた方がいいのでは?」
という指摘を受けました。

return を実装するだけで、上記※1と※2のように「return以降の処理は一切されない」という認識は間違いでしょうか?

seastar3👍を押しています

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

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

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

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

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

guest

回答4

0

return の後に exitが必要ないと言うのはその通りなのですが、なぜそのような誤解が生じたのか考えてみました。一つ思い当たるは、リダイレクト処理の後には exit を書くべきということです。
次のようなコードを考えてみます。

PHP

1 2if (! isloggedin() ) { // ログインしていない場合は 3 header('Location: https://example.jp/loginform.php'); // ログイン画面にリダイレクト 4} 5// 以下、ログインしているユーザーだけが見ることのできる情報の表示

このようなコードを書くと、一見うまく動いているように見えますが、リダイレクト時のHTTPレスポンスには秘密情報が含まれているので、ツール等を使うとその情報を閲覧できます。ログインしていないユーザーが秘密情報を閲覧できてしまうことになります。

このため、リダイレクト処理の header関数呼び出しの後は、仮に後続の処理がなくても、exitを明示するとこの種の事故を避けることができます。

return とリダイレクトでは全然違いますが、レビュアーの方は、この種のケースと勘違いされたのではないでしょうか。

投稿2016/12/29 14:19

ockeghem

総合スコア11701

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

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

退会済みユーザー

退会済みユーザー

2017/01/04 01:22

>ockeghem様 返答に遅れましたことをお詫び申し上げます。 あの後レビュアーに、まさに同じことを誤解されて「exitを入れるべきだ」という指摘を行ったとのことでした。 セキュリティの実例を交えたご説明、誠にありがとうございました。
guest

0

exitはそのプログラムを終わらせるものです。一方、returnは呼び出し元へ返り値を返し呼び出し元で処理を終了するものです。
returnは呼び出し元へ戻ってから終了するのに対し、exitは即座に終了します。
たとえば、以下の例1のreturnを用いたコードならば、textMatch()以降を続けていますが、例2のexitを用いたコードでは関数でexitでプログラムを終了させたため、textMatch()以降の処理が行われません。
例1

PHP

1<?php 2$text1 = "text"; 3$text2 = "text"; 4$text3 = "text2"; 5function textMatch($text1, $text2) 6{ 7 if ($text1 == $text2) { 8 echo "text1"; 9 return true; 10 } 11 return true; 12} 13 14textMatch($text1, $text2); 15 16if ($text1 != $text3) { 17 echo "text2"; 18}

例2

PHP

1<?php 2$text1 = "text"; 3$text2 = "text"; 4$text3 = "text2"; 5function textMatch($text1, $text2) 6{ 7 if ($text1 == $text2) { 8 echo "text1"; 9 exit(); 10 } 11 return true; 12} 13 14textMatch($text1, $text2); 15 16if ($text1 != $text3) { 17 echo "text2"; 18}

また、requireやinclude中でexitを使うと、require, include以降のプログラムが実行されない可能性があるので読み込まれるファイルでexitやdieを使うときは注意が必要です。できればreturnを使うほうが好ましいです。

投稿2016/12/26 07:44

s8_chu

総合スコア14731

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

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

s8_chu

2016/12/26 07:46

あ、解決済みになっていましたね。失礼しました。
退会済みユーザー

退会済みユーザー

2016/12/26 07:48

ご回答ありがとうございます。 たしかに呼び出し先で「exit」してしまうと、そのまますべて終了になってしまうのが不安だったので「return」を選びました。 ソースレビュアーにPHPマニュアルを見せ、説得したいとおもいます。
guest

0

ベストアンサー

「return の直後にexit入れた方がいいのでは?」

不要です。

return を実装するだけで、上記※1と※2のように「return以降の処理は一切されない」という認識は間違いでしょうか?

間違いではありません。あっています。

投稿2016/12/26 07:25

編集2016/12/26 07:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/12/26 07:34

PHPマニュアルを読み返して認識は間違っていないこと、またShibuyaさんのおっしゃる通りであることで安心しました。 即答いただきありがとうございました。
guest

0

念のためですが…
上記の//※2 ここ以降にも処理が実装されているの場所ですが、if(条件){}の外ですよね。
もちろん、ifの条件に当てはまらない場合は、この場所で処理がされるのでこの処理は必要ですよ。

returnのすぐ1行後にexitを書くのは、Kosuke_Shibuya様の指摘通り不要です。

投稿2016/12/26 07:30

motuo

総合スコア3027

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

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

退会済みユーザー

退会済みユーザー

2016/12/26 07:32

はい、※2は「if(条件){}の外 」を指しています。 「if(条件){} 」が一致した時だけ、returnで脱出させ、※2以降は処理させないという狙いです。
motuo

2016/12/26 07:34 編集

その狙いであれば、質問のソースで目的は果たせるでしょうね。 ifの条件に合致したら※2は実行されません。returnの1行後のexitも不要です。 ifの条件に合致しない場合は※2の処理が実行されます。
退会済みユーザー

退会済みユーザー

2016/12/26 07:35

Shibuyaさんとmotuoさんのご回答が一致していて安心できました。 即答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問