ローカル変数での質問です。

このQ&Aのポイント
  • ローカル変数での質問です。PHPの教本によると、$a = 1 の1は、数字と認識せずに文字扱いになるため、計算結果が「1」となるそうです。
  • 他の言語でも同じ結果が出るのかどうか不明ですが、PHPの場合はローカル変数の値が文字扱いされてしまうため、ローカル変数の計算結果が「1」となると思われます。
  • ローカル変数での値が文字扱いされるのは、PHP独特の挙動のようで、他の言語では同じ結果が出ない可能性があります。
回答を見る
  • ベストアンサー

ローカル変数での質問です。

<html> <head><title>no_global.php</title></head> <body> <?php> $a = 1; function gtest(){ print ($a+1); } gtest(); ?> </body> </html> 実行結果は  1  とPHPの教本にあります。    $a = 1 の1は、数字と認識しなくて、文字扱いになるみたいです!   なので計算結果が「1となる」と・参考書には色々書いていあるんですが、  たぶんそれをいいたのでしょう?    この場合、PHPだけでなく、他の言語でも同じ結果がでるのでしょうか?   もし、PHPだけでしたら、不思議です。    

  • PHP
  • 回答数2
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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

nattukamu2
質問者

お礼

ご回答誠にありがとうございます。 暇ひま、ご紹介してくださったご回答のURLで勉強しています。  かなり勉強になります。  解決には、しばらくお待ちくださいませ^^  

その他の回答 (1)

noname#244856
noname#244856
回答No.2

ちょっとセンスの無い例ですね・・・この参考書って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となる」と・参考書には色々書いていあるんですが、 >> たぶんそれをいいたのでしょう? ホントに参考書にそうやって書いてあるなら、「絶対に参考にするな」と言いたくなるレベルのとんでもない参考書です。だって間違ったこと書いてますから。

nattukamu2
質問者

補足

毎どうご回答誠にありがとうございましす。  助かります^^ 確認事項の件で!   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となります。 以上です。

関連するQ&A

  • PHPでの文字列置換の方法について

    質問があります。 PHP5で下記のようなページを作りました。 <?php $a = "あいうえお"; $b = "かきくけこ"; ?> <html> <head> <title>トップページ</title> </head> <body> <?php print $a ?> <?php print $b ?> </body> </html> 実行結果はこうなります。 あいうえお かきくけこ これを、別ファイルに $a = "あいうえお"; $b = "かきくけこ"; と書いたものをインクルードするにはどう書けばいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • ヒアドキュメントとクラスの基本的?な質問です

    PHPのヒアドキュメントを使ってHTMLのクラスを使ろうと思っているのですがいきなりわからなくなってしまいました。下のソースのどこがいけないのでしょうか。 エラー内容は Parse error: parse error, unexpected $end in \Html.php on line 19 です。よろしくお願いします。 index.php <?php require_once("./Html.php"); $html = new Html(); print $html->NoFrame(); ?> Html.php <?php class Html{ function Html(){ } function NoFrame(){ $html = <<<EOF <html> <head> <title> </title> </head> <body> おーい </body> </html> EOF; return $html; } } ?>

    • ベストアンサー
    • PHP
  • 超初心者 ローカルでOKだったからUPしたら動かない

    超初心者です。 Perlの超入門本で勉強中。 OSはWin98、PerlはCygwinPerl、WebサーバーはANHTTPDです。 ローカルではうまく動作したので、実際にアップロードして動かしてみたのですがうまく動きません。 単に文字を入れて実行ボタンをクリックすると、その文字が表示されるだけという簡単なものなのですが、CGIのソースそのものが表示されてしまうのです。 ソースはこんな感じです。 ==文字を入れるWebページ== <html> <head> <title>実験</title> </head> <body> <form action=http://CGIサーバーのpathとファイル名(a1.pl) method="get" > <p><input type="text" name="data"></p> <p><input type="submit" value="実行"></p> </form> </body> </html> ====== ==Perlのソース(ファイル名はa1.pl)== #!/usr/local/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title></title>\n"; print "</head>\n"; print "<body>\n"; print $in{'data'}; print "</body></html>"; ===== perlのPathはプロバイダーの指定通り パーミッションも指定された番号に(なにやら755という事なので)しました。 プロバイダーの環境は、 OSはx86 Solaris2.6、Webサーバーはapache/1.3.12、言語はperlVer.5.005_003です。 誰か助けてください。

    • ベストアンサー
    • CGI
  • 変数について

    下記のような例の場合は、どのようにすれば【意図した結果】のようになりますでしょうか? 【コード】 <?php $post['thread_id'] = 1; $thread_id = $post['thread_id']; $logs = array( array(1, 0, $post['thread_id'], '<a href ="thread.php?id=$thread_id">編集</a>', '削除'), ); foreach ($logs as list($no, $oya, $kiji, $edit, $delete)) { if ($oya > 0) { continue; } print $no .'<br>'. $kiji . $edit . $delete . '<br>'; listchild($logs, $no); } function listchild($logs, $parent) { $ct = 0; foreach ($logs as list($no, $oya, $kiji, $edit, $delete)) { if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<nobr>&nbsp<ul></nobr>'; } print '<li>' . $no .'<br>'. $kiji . $edit . $delete . '<br>' . '</li>'; listchild($logs, $no); } if ($ct > 0) { print '&nbsp</ul>'; } } 【結果:編集のリンク先】 「thread.php?id=$thread_id」 【意図した結果】 「thread.php?id=1」

    • ベストアンサー
    • PHP
  • グローバル変数とローカル変数について

    今JavaScriptを勉強している初心者です。 実は、ある本に書かれているソースコードでグローバル変数とローカル変数の違いがよく分からなくなりましてここに質問させて頂く次第です。 まずは、ソースコードを書きます。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title>変数のスコープ</title> <script type="text/javascript"> function testFunc(){ var num; num=5; } </script> </head> <body bgcolor="#FFFFFF"> <p style="font-size:200%"> <script type="text/javascript"> var num=3; testFunc(); document.write(num, "<br>") </script> </p> </body> </html> このままだとブラウザに表示されるのはグローバル変数「3」になるというのも今一分からないのですが。 この次に<head>部分の var num; をコメントにします。 すると、何故かローカル変数「5」がグローバル変数になり、<body>部分のtestFunc()メソッドの結果ブラウザに表示される値が「5」になるというものです。 var num; をコメントとする事はnumは変数宣言されていないことになります。 なのに num = 5; が成り立つのもよく分かりません。 そこでアドバイスを頂きたくここに書き込む事にしました。 是非とも宜しくお願い致します。

  • 型変換プログラムで

      以下の型変換プログラムで質問です!? PHPレベルは下の下です。 <html> 1 <head> 2 <title>型変換</title> 3 </head> 4 <body> 5 <?php 6 $var = TRUE; 7 print (gettype($var). "<br />"); 8 $var=100; 9 print (gettype($var). "<br />"); 10 $var=100.001; 11 print (gettype($var). "<br />"); 12 $var="TRUE"; 13 print  (gettype($var)); 14 ?> 15 </body> 16 </html>   以上ですが、result(実行結果は)以下です。  boolean integer double string  以上の実行結果で疑問に思うことは、 同じ変数のTRUEでありながら プログラムの6の実行結果の”boolean”と   プログラム12の”string”の実行結果と違いがあるのはなぜですか!?  ※agunuz 回答禁止    宜しくお願いします。

    • ベストアンサー
    • PHP
  • whileで処理した結果を変数に入れる方法

    PHP初心者です。 教えてください。 以下の実行結果が「5 4 3 2 1」です。 <?php $a=5; while ($a > 0) { print $a; print "\n"; $a--; } ?> 「5 4 3 2 1」をprintせずに変数に入れたいのですが、どうすればいいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP側でSESSON変数に値をセットして、クライアント側のjavas

    PHP側でSESSON変数に値をセットして、クライアント側のjavascriptで、SESSON変数の値を取得する方法は? <?php session_start(); $a[0][0] = 5; $a[0][1] = 9; $a[0][2] = 8; $_SESSION["id"] =$a; ?> <html> <head> <title>wwww</title> </head> <body> <script language="JavaScript" type="text/JavaScript"> function test(){ id =getsession(); //←このようなことが、したいです。     document.write(id[0][0]); } </script> <button onclick="test()">sssssss</button> </body></html>

  • PHPのデータやり取りについて

    自分はPHPを独学している学生です。 ちなみにPHP歴3日です。。。 先日[改訂3版 基礎PHP]という教本を購入してPHPの勉強を始めたのですが、 何度教本の通りに試してもうまく動作しないスクリプトがありまして、 内容としてはHTMLファイルの入力フォームでデータを受け取り、phpファイルに受け渡して表示するだけの簡単なものなのですが、なぜかphpによる画面が表示される際に入力したものが表示されないという症状になっています。 ブラウザが原因かと思い、IEとFirefoxで試したのですがどちらも同じ症状でした。 原因がわかる方に教えていただけないかと思っております。 コードは以下の通りです。 welcome.html <html> <head><title>welcome.html</title></head> <body> どちら様ですか?<br /> <form action="welcome.php" method="POST"> <input type="text" name="name"> <input type="submit" value="送信"> </form> </body> </html> welcome.php <html> <head><title>welcome.php</title></head> <body> ようこそ <?php $name = $_POST['name']; print (htmlspecialchars($name, ENT_QUOTES,'UTF-8')); ?> さん </body> </html>

    • 締切済み
    • PHP
  • PHPからCプログラムを実行して実行結果をHTML上に表示

    PHP初心者です。PHPからCプログラムを実行して実行結果をHTML上に表示する方法が分からなく困っています。 Cプログラムの中身は、 #include <stdio.h> int main(){ printf("Hello."); } です。 phpの中身は、 <HTML> <HEAD><TITLE>Cプログラム呼び出し</TITLE></HEAD> <BODY> <?php $cmd = "test.exe"; $a = exec($cmd); echo $a; ?> </BODY> </HTML> としており、調べてみるとexec()関数で外部プログラムを実行すると書いてあったのでこのように作成しました。

    • ベストアンサー
    • PHP

専門家に質問してみよう