- ベストアンサー
ローカル変数での質問です。
- ローカル変数での質問です。PHPの教本によると、$a = 1 の1は、数字と認識せずに文字扱いになるため、計算結果が「1」となるそうです。
- 他の言語でも同じ結果が出るのかどうか不明ですが、PHPの場合はローカル変数の値が文字扱いされてしまうため、ローカル変数の計算結果が「1」となると思われます。
- ローカル変数での値が文字扱いされるのは、PHP独特の挙動のようで、他の言語では同じ結果が出ない可能性があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
PHPは詳しくありませんが、 例えば下のページを見てください。 http://www.standpower.com/php_function.html >$a = 1 の1は、数字と認識しなくて、文字扱いになるみたいです! この$a はグローバル変数として定義してあり数字の1が入ります。 一方、 print ($a+1); の$a はローカル変数で初期化されていません。 PHPでは初期化していない変数に+1すると0+1と解釈するようですので結果が1になります。 PHPではグローバル変数を使うのに明示的にglobal等をつけておく必要があります。 http://php.net/manual/ja/language.variables.scope.php >他の言語でも同じ結果がでるのでしょうか? 他の言語では同じような文法を使った場合はそうではありません。 C言語の場合、 int a=1 int main(){ printf("%d",a+1); } ●結果⇒2 int main(){ int a=1; } void s(){ printf("%d",a+1); } ●結果⇒コンパイルエラー int main(){ int a; printf("%d",a+1); } ●結果⇒不定 rubyの場合、global変数使えば2、使わなければ実行時エラー。 $a=1 def x print $a+1 end x ●結果⇒2 a=1 def x print a+1 end x ●結果⇒実行時エラー vbの場合 Const a = 1 Sub x() MsgBox a + 1 End Sub ●結果⇒2 同じような文章を書いても言語によって結果が違います。 このようなことがあるので、他言語にプログラムを移植するときに多くの問題が発生します。 まともなプログラマであれば、移植性を高めるために必ず変数を初期化する等のコーディングルールを採用します。 詳しくは以下を参照指定ください。 プログラミング作法 http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95
その他の回答 (1)
ちょっとセンスの無い例ですね・・・この参考書ってE_NOTICEの表示が無い前提で作られているんでしょうか・・・このままではマズいので、php.iniの設定で error_reporting = E_ALL | E_STRICT display_errors = On になるように2ヵ所の編集と確認をお願いします。こうすることで全てのエラーが表示されるようになります。そうすると先ほどのコードではエラーが発生するのが分かるはずです。 Notice: Undefined variable: a in ... on line 7 PHP入門講座 http://qiita.com/mpyw/items/752e19a578cf7d96fc5f こちらの「NULLと未定義の違い」「型変換」をご覧になればだいたい何が起こっているか把握できると思います。 1. $a+1 の $a が未定義なので、Noticeエラーを発生してNULLと扱われる 2. $a+1 の 1 は整数である 3. NULL + 1 となる 4. 加算ではNULLは整数に変換され、これは0として扱われる 5. 0 + 1となる 6. 結果として整数の1を得る 7. printによって整数が文字列に変換され、画面上に出力される >> $a = 1 の1は、数字と認識しなくて、文字扱いになるみたいです! >> なので計算結果が「1となる」と・参考書には色々書いていあるんですが、 >> たぶんそれをいいたのでしょう? ホントに参考書にそうやって書いてあるなら、「絶対に参考にするな」と言いたくなるレベルのとんでもない参考書です。だって間違ったこと書いてますから。
補足
毎どうご回答誠にありがとうございましす。 助かります^^ 確認事項の件で! php.iniの設定で error_reporting = E_ALL | E_STRICT display_errors = On になるように2ヵ所の編集と確認をお願いします。 以上ですが 私の php.iniを「error_reporting 」で検索したところ 以下4件がヒットしました。 109 ; error_reporting ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED ; Development Value: E_ALL ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT 535 error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT 1827 ; Eval the expression with current error_reporting(). Set to true if you want 1828 ; error_reporting(0) around the eval(). 以上ですが、すみません、以上の何処を修正すればいいのかが私のレベルだと分かりません! 教えていただけないでしょうか? 私が引用した参考書を御紹介します。 「PHP基礎」(インプレスジャパン)[204.10.1 初発行] P91 ■変数の有効範囲(ローカ変数とグローバル変数) さて、上記の例では関数の中に変数を使用しました。変数には有効範囲(これを)スコープと言います) があって、関数内にあるものをローカル変数、それ以外にあるものをグローバル変数と呼んでいます。 変数にとっては、関数の内部とそれ以外は完全に別世界です。同じ名前でも関数中にある変数と関数の 外にある変数は全くの別物として扱われますし、どちらでも交互に行き来することはできません。逆に いえば、こうした仕組みになっているおかげで、どちらでも自由に変数の名前を付けることができる わけです。関数の外にある変数は、グローバル変数であることを関数内で宣言することによって、関 数内に入り込むことができます。 ---◎これらを加えて、PHP4.1.0からは「スーパーグローバル関数」という考えて方も登場しました。 例ば「$_POST」などがそれです。詳細はChapter3で取り扱います。 LIST no_global.php <html> <head><title>no_global.php</title></head> <body> <?php> $a = 1; function gtest(){ print ($a+1); } gtest(); ?> </body> </html> RESULT 実行結果 1 初めに定義されている変数$aには、1が代入されています。これは関数の外にあるのでグローバル 変数です。しかし、関数内で使用されている$aはローカル関数です。変数の初期値は0ですので、1を 加えた結果はやはり1となってしいます。 しかし、関数の内外で変数を共有しない場合もあるでしょう。その場合には、global命令を使用して、 指定された関数がグローバル変数であることを明示的に宣言する必要があります。 LIST global.php <html> <head><title>global.php</title></head> <body> <?php> $a = 1; function gtest(){ global $a; print ($a+1); } gtest(); ?> </body> </html> RESULT 実行結果 2 この例では、globalで変数$aがグローバル変数であることが明示されているため、元の値1に1が加算されて2となります。 以上です。
お礼
ご回答誠にありがとうございます。 暇ひま、ご紹介してくださったご回答のURLで勉強しています。 かなり勉強になります。 解決には、しばらくお待ちくださいませ^^