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

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

ただいまの
回答率

90.47%

  • PHP

    20827questions

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

PHPで変数を初期化したほうが良い場合の具体例

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 2,914

okame

score 50

 わからないこと

PHPで変数を初期化したほうがよいケース

 環境

PHP 5.4.16

 具体例で例えば...

こういうコードの場合の初期化は不要でしょうか?
...

         while (($instance = $class->method()))
         {
             // ファイル名をセット
-            $fileName    = '';
             $fileName    = $instance->fileName;
 
             // 説明をセット
-            $description = '';
             $description = $instance->description;
 
             // 状態をセット
-            $status      = '';
             $status      = $runRecordInstance->get($fileName);

...

 上記コードの初期化の意図

変数を利用する上で型を明示する意味合いと、while文で繰り返し処理で使用する変数のため、
2回目以降のループで各値をセットする前に初期化したほうが上書きするより適切?と感じた

 なぜ上記のような意図を考えたのか

PHPを勉強していく中ででさまざまな書籍やネット上の記事を参考にした過程で
「変数や配列は値をセットする前に初期化したほうがよい」という認識に至りました。

 回答について

①上記具体例についての正否等
②そもそも「初期化」についての考え方や具体例

についてご教示いただければ幸いです。
お手数ですが宜しくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

こういうコードの場合の初期化は不要でしょうか?

不要です。

ただ $fileName などの変数を while の後でも使うことがあるなら while の前で初期化しておいたほうが良いです。

// 初期化
$fileName = null;

while (($instance = $class->method())) {
    // ファイル名をセット
    $fileName    = $instance->fileName;

    :
}

if (isset($fileName)) {
    // 最後のループの $fileName を使って何かする
    :
}

PHP でこのような初期化が必要と言われた最も大きな理由は register_globals という設定が原因です。
この設定が On だと、ブラウザから送られたパラメータがそのままグローバル変数になっていました。
例えば、次のようなリクエストだと、

http://example.com/?fileName=/path/to/secret

次のようなグローバル変数が自動的に作成されます。

$fileName = "/path/to/secret";

したがって、上のコードで while の外で初期化していな場合、

while (($instance = $class->method())) {
    // ファイル名をセット
    $fileName    = $instance->fileName;

    :
}

if (isset($fileName)) {
    // 最後のループの $fileName で何かする
    :
}

もし、while ループが1回も回らなかったら(条件がはじめから false だったら)、その次の if では $fileName は "/path/to/secret" になってしまいます。

もっとも register_globals は PHP 5.4 だとなくなっているので、PHP 5.4 では関係ありません。


が、register_globals とは無関係に、次のようなケースでは初期化しておいた方が良いだろうと思います。

// 初期化
$fileName = null;

while (($instance = $class->method())) {
    // ファイル名をセット
    $fileName    = $instance->fileName;

    :
}

if (isset($fileName)) {
    // 最後のループの $fileName を使って何かする
    :
}

というのも、PHP にはブロックスコープはありませんが、もし、ブロックスコープがあると仮定するなら、↑のコードは while の前で $fileName を初期化しておかなければ while の後に $fileName が存在しなくなってしまうからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/07 19:07

    @ngyuki 様

    ものすごく良くわかりました!
    register_globalsも調べてみると歴史があるのですね...

    ご教示いただいた内容をもとに適切な初期化を行っていきます。
    ありがとうございました⭐︎

    キャンセル

関連した質問

  • 解決済

    (PHP)ファイルのダウンロードについて

    下記のようなダウンロード処理を使用しています。 if (file_exists($hoge_file)) {     header('Content-Description: F

  • 解決済

    PHPでセレクト?がうまくいかない

    登録フォームで生年月日を選ばせるところをPHPで書きたいのですが <?php  echo '<select class="selectpicker">'; for($count 

  • 解決済

    DBからデータの取得

    DBから特定のフィールドから特定のフィールドまでの値の取得方法が分からずご質問させて頂きました。 DBから一行取得すると $stmt = $pdo->prepare("SELEC

  • 解決済

    意図しないタイミングでファイルがダウンロードされる

    PHPのWEBアプリケーションでユーザがダウンロードボタンを押して ファイルをダウンロードさせる機能で、 下記のように実装しています。     header("Content-D

  • 解決済

    【エラー】Header may not contain more than a single hea...

    テキストエリアの内容をプレビューする時にGETで渡しているのですが、テキストエリア内で改行した場合に以下のようにエラーがでてしまいます。 Header may not con

  • 解決済

    phpで変数が入っているページ以外はdescriptionを空欄にしたい

    現在、以下phpが入っていてますが、※の部分を空欄にすると全ページが空欄になってしまい、変数が入っているページのdescriptionも空欄になってしまいます。 どなたかご教示の

  • 解決済

    コードの説明をお願いします。

    見ずらくてすみません。 1は、私がネットから引っ張ってきて試行錯誤で作ったものになります。 2が友人が作ってくれたものになります。現在どちらも同じように表示されていますが、最初

  • 解決済

    <PHP>改行方法/ログ表示方法

    前提・実現したいこと ・改行を行いたい。<br>を入れても改行がされない。 ・発言を入力する前に、日時が取得されてしまい表示されてしまう。 ↓実現したい内容 発生している問題

同じタグがついた質問を見る

  • PHP

    20827questions

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