1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
|
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.19 $ -->
<chapter id="language.variables">
<title>変数</title>
<sect1 id="language.variables.basics">
<title>基本的な事</title>
<simpara>
PHP の変数はドル記号の後に変数名が続く形式で表されます。
変数名は大文字小文字を区別します。
</simpara>
<para>
変数名は、PHPの他のラベルと同じルールに従います。
有効な変数名は文字またはアンダースコアから始まり、任意の数の文字、
数字、アンダースコアが続きます。正規表現によれば、これは次の
ように表現することができます。
'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
</para>
<note>
<simpara>
ここで言うところの文字とはa-z、A-Z、127から255まで
(0x7f-0xff)のアスキー文字を意味します。
</simpara>
</note>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
$var = "Bob";
$Var = "Joe";
echo "$var, $Var"; // "Bob, Joe"を出力します。
$4site = 'not yet'; // 無効:数字で始まっている。
$_4site = 'not yet'; // 有効:アンダースコアで始まっている。
$täyte = 'mansikka'; // 有効:'ä' はアスキーコード228です。
]]>
</programlisting>
</informalexample>
</para>
<para>
PHP 3では、変数は常にその値により代入されていました。
これは、つまり、ある変数にある式を代入する際、元の式の
値全体がコピーされる側の変数にコピーされるということです。
これは、例えば、ある変数の値を他の変数に代入した後で、
これらの変数の1つを変更しても他の変数には影響を与えないという
ことを意味します。この種の代入に関するより詳細な情報については、
<link linkend="language.expressions">式</link> を参照下さい。
</para>
<para>
PHP 4 は変数に値の代入を行う別の方法を提供します。それは、
<emphasis>参照による代入</emphasis> です。
この場合、新規の変数は元の変数を参照するだけです。
(言いかえると、元の変数の"エイリアスを作る"または元の変数を"指す")
新規の変数への代入は、元の変数に影響し、その逆も同様となります。
この手法ではコピーは行われないため、代入はより速やかに行われます。
しかし、速度の向上が体感できるのは、重いループや大きな配列または
オブジェクトを割り付ける場合に限られるものと思われます。
</para>
<para>
参照により代入を行うには、代入する変数(ソース変数)の先頭に
アンパサンドを加えます。たとえば、次の簡単なコードは
'My name is Bob'を二度出力します。
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo = 'Bob'; // 値'Bob'を$fooに代入する。
$bar = &$foo; // $fooを$barにより参照
$bar = "My name is $bar"; // $barを変更...
echo $foo; // $fooも変更される。
echo $bar;
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
注意すべき重要な点として、名前のある変数のみが参照により代入できる
ということがあります。
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo = 25;
$bar = &$foo; // これは有効な代入です。
$bar = &(24 * 7); // 無効です。名前のない式を参照しています。
function test() {
return 25;
}
$bar = &test(); // 無効。
?>
]]>
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="language.variables.predefined">
<title>定義済みの変数</title>
<simpara>
PHPは、実行する全てのスクリプトに定義済みの多くの変数を
提供します。しかし、これらの変数の多くは、
実行するサーバーの種類、サーバーのバージョンおよび設定、
その他の要素に依存しており、完全に記述することはできません。
これらの変数のいくつかはPHPをコマンドラインで実行した場合には
利用できません。
</simpara>
<simpara>
これらの要因はあるものの、<ulink
url="&url.apache;">Apache</ulink> 1.3.6のデフォルトインストールを
行い、PHP 3をモジュールとしてデフォルトインストールを行った状態で
定義済みの変数のリストを以下に示します。
</simpara>
<simpara>
全ての定義済み変数のリスト(そして他の多くの有益な情報)については、
<function>phpinfo</function>を参照(および使用)ください。
</simpara>
<note>
<simpara>
このリストは、網羅的なものでも網羅的にしようとするものでもありません。
どんな定義済みの変数に自分のスクリプトからアクセス可能と期待できる
のかに関するガイドラインであるに過ぎません。
</simpara>
</note>
<sect2 id="language.variables.predefined.apache">
<title>Apache により設定される変数</title>
<simpara>
これらの変数は、<ulink
url="&url.apache;">Apache</ulink> Webサーバーにより
作成されるものです。他のWebサーバーを実行している場合には、
同じ変数が提供される保証はありません。いくつかの変数が
省略されたり、このリストにない別の変数が提供されている
可能性があります。このリストにある変数の多くは、 <ulink
url="&url.cgispec;">CGI 1.1の規約</ulink>に記述されており、他の
Webサーバーでも利用可能であると期待することができます。
</simpara>
<simpara>
数は少ないですが、これらの変数のいくつかはPHPをコマンドラインで実
行している時のみ利用可能(または意味がある)であるということに注意
して下さい。
</simpara>
<para>
<variablelist>
<varlistentry>
<term>$GATEWAY_INTERFACE</term>
<listitem>
<simpara>
サーバーが使用するCGI 規約のリビジョン。例えば、'CGI/1.1'。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$SERVER_NAME</term>
<listitem>
<simpara>
現在のスクリプトが実行されているサーバーホストの名前。
スクリプトが仮想ホストで実行されている場合、その仮想
ホストに関して定義された値となります。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$SERVER_SOFTWARE</term>
<listitem>
<simpara>
サーバーのIDを表す文字列。リクエストに応答する際に、
ヘッダに表示されます。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$SERVER_PROTOCOL</term>
<listitem>
<simpara>
リクエストされたページを送信する際のプロトコルの名前及びリビジョン。
すなわち、'HTTP/1.0'。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$REQUEST_METHOD</term>
<listitem>
<simpara>
ページにアクセスする際に使用されるリクエストメソッドの種類。
すなわち、'GET','HEAD', 'POST', 'PUT'。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$QUERY_STRING</term>
<listitem>
<simpara>
クエリー文字列。または、ページがアクセスされたパス。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$DOCUMENT_ROOT</term>
<listitem>
<simpara>
現在のスクリプトが実行されているサーバーのドキュメントルートディレクトリ。
サーバーの設定ファイルで定義されています。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_ACCEPT</term>
<listitem>
<simpara>
現在のリクエストにおける<literal>Accept:</literal>ヘッダーの内容。
ただし、該当するヘッダーがある場合のみ定義されます。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_ACCEPT_CHARSET</term>
<listitem>
<simpara>
現在のリクエストにおける<literal>Accept-Charset:</literal>ヘッダー
の内容。ただし、該当するヘッダーがある場合のみ定義されます。例えば、
'iso-8859-1,*,utf-8'。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_ACCEPT_ENCODING</term>
<listitem>
<simpara>
現在のリクエストにおける<literal>Accept-Encoding:</literal>ヘッ
ダーの内容。ただし、該当するヘッダーがある場合のみ定義されま
す。例えば、'gzip'。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_ACCEPT_LANGUAGE</term>
<listitem>
<simpara>
現在のリクエストにおける<literal>Accept-Language:</literal>ヘッダーの内容。
ただし、該当するヘッダーがある場合のみ定義されます。例えば、'en'。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_CONNECTION</term>
<listitem>
<simpara>
現在のリクエストにおける<literal>Connection:</literal>ヘッダーの内容。
ただし、該当するヘッダーがある場合のみ定義されます。例えば、'Keep-Alive'。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_HOST</term>
<listitem>
<simpara>
現在のリクエストにおける<literal>Host:</literal>ヘッダーの内容。
ただし、該当するヘッダーがある場合のみ定義されます。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_REFERER</term>
<listitem>
<simpara>
ブラウザから現在のページを参照する際のページアドレス。
この変数は、ユーザーのブラウザにより設定されます。全てのブラウザが
この変数を設定するわけではありません。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_USER_AGENT</term>
<listitem>
<simpara>
現在のリクエストにおいて<literal>User_Agent:</literal>ヘッダーが
定義されている場合にはその内容。これは、現在のページを見るために
使用されているブラウザソフトウエアを示す文字列です。すなわち、
<computeroutput>Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)
</computeroutput> となります。
例えば、ページの機能をユーザーのブラウザの能力に合わせるために
<function>get_browser</function>にこの値を指定することが可能です。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$REMOTE_ADDR</term>
<listitem>
<simpara>
現在のページを見ているユーザーのIPアドレス。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$REMOTE_PORT</term>
<listitem>
<simpara>
Webサーバーと通信するユーザーのマシンで使用されているポート。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$SCRIPT_FILENAME</term>
<listitem>
<simpara>
現在実行中のスクリプトの絶対パス。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$SERVER_ADMIN</term>
<listitem>
<simpara>
(Apacheの場合、)Webサーバーの設定ファイルでSERVER_ADMIN
ディレクティブに指定された値。
スクリプトが仮想ホストで実行されている場合、その仮想ホストに関して
値が定義されます。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$SERVER_PORT</term>
<listitem>
<simpara>
Webサーバーで使用されているサーバーマシンの通信用ポート。
デフォルトの設定では、'80'となります。
例えば、SSLを使用している場合、セキュアHTTPポートの番号により
この値は変化します。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$SERVER_SIGNATURE</term>
<listitem>
<simpara>
サーバーのバージョンおよび仮想ホスト名を含む文字列。
この文字列は、サーバーが生成したページに追加されます。ただし、
これが行われるのは、この機能を有効にした場合です。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$PATH_TRANSLATED</term>
<listitem>
<simpara>
サーバーが仮想的なパスを実際のパスへ変換した後で、
現在のスクリプトの(ドキュメントルートではなく)ファイルシステムに
基づくパス。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$SCRIPT_NAME</term>
<listitem>
<simpara>
現在のスクリプトのパスを有します。自分自身を指す必要があるページ
では便利です。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$REQUEST_URI</term>
<listitem>
<simpara>
このページにアクセスするために指定されたURI。
例えば、'/index.html'。
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect2>
<sect2 id="language.variables.predefined.environment">
<title>環境変数</title>
<simpara>
これらの変数は、PHPパーサが実行されている環境からPHPのグローバル
変数領域にインポートされます。その多くは、PHPを実行したシェルによ
り提供されたものであり、システムが異なると恐らくシェルの種類も異
なるので、固定したリストを示すことはできません。定義済みの環境変
数のリストについては、使用するシェルのドキュメントを参照下さい。
</simpara>
<simpara>
CGI変数を含む他の環境変数は、PHPがサーバーモジュールとして実行さ
れているのか、CGIプロセッサとして実行されているのかによらず設定さ
れます。
</simpara>
</sect2>
<sect2 id="language.variables.predefined.php">
<title>PHP により定義される変数</title>
<simpara>
これらの変数は、PHP自体により作成されます。変数
<varname>$HTTP_*_VARS</varname> は、
設定 <link linkend="ini.track-vars">track_vars</link> がオンの場
合にのみ利用可能です。有効にした場合、この変数は、空の配列である
場合でも、常に設定されます。これにより、悪意のあるユーザがこれら
の変数に不正な値を入力することを防止します。
</simpara>
<note>
<para>
PHP 4.0.3以降では、設定ファイルの設定によらず<link
linkend="ini.track-vars">track_vars</link> は常に on です。
</para>
</note>
<note>
<para>
"スーパーグローバル"な変数はPHP 4.1.0で追加されました。詳細については
<ulink url="&url.php.release4.1.0;">4.1.0 Release Announcement</ulink>
を参照してください。スコープに関係なく常に有効な配列<varname>
$_GET</varname>, <varname>$_POST</varname>, <varname>$_ENV</varname>,
<varname>$_SERVER</varname>, <varname>$_COOKIE</varname>,
<varname>$_REQUEST</varname>, <varname>$_FILES</varname>そして
<varname>$_SESSION</varname>は略して<emphasis>
スーパーグローバル</emphasis>と呼ばれています。これに対応する以前の
<varname>HTTP_*_VARS</varname>の使用は推奨されません。
</para>
</note>
<para>
ディレクティブ <link
linkend="ini.register-globals">register_globals</link> が設定され
ていた場合、これらの変数もスクリプトのグローバルスコープで利用可能
です。そしてこの変数は配列 <varname>$HTTP_*_VARS</varname>
もしくは<varname>$_*</varname>とは別のものとして利用可能です。
関連する情報がセキュリティの章の<link linkend="security.registerglobals">
グローバル変数への登録を使用</link>にありますので参照下さい。
</para>
<para>
<variablelist>
<varlistentry>
<term>$argv</term>
<listitem>
<simpara>
スクリプトに渡される引数の配列。スクリプトがコマンドラインで
実行された場合、これにより、C言語の形式でコマンドラインのパラ
メータにアクセスすることができます。GETメソッドでコールされた
場合、この配列にはクエリー文字列が含まれます。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$argc</term>
<listitem>
<simpara>
スクリプトに渡されたコマンドラインパラメータの数を有しています。
(コマンドラインで実行された場合)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$PHP_SELF</term>
<listitem>
<simpara>
現在実行しているスクリプトのドキュメントルートに相対パスで表し
たファイル名。PHPがコマンドラインプロセッサとして実行されてい
る場合、この変数は利用できません。パス情報がある場合には、
その情報も含まれます(例えば "http://example.com/test.php/foo.bar"
にアクセスした場合の$PHP_SELFの内容は"/test.php/foo.bar"になります)。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_COOKIE_VARS</term>
<listitem>
<simpara>
HTTPクッキーにより現在のスクリプトに渡された変数を有する連想配
列です。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$_COOKIE</term>
<listitem>
<simpara>
HTTPクッキーにより現在のスクリプトに渡された変数を有する連想配
列です。あらゆるスコープで自動的にグローバルになります。PHP
4.1.0で導入されました。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_GET_VARS</term>
<listitem>
<simpara>
HTTP GETメソッドにより現在のスクリプトに渡された変数を有する
連想配列です。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$_GET</term>
<listitem>
<simpara>
HTTP GETメソッドにより現在のスクリプトに渡された変数を有する
連想配列です。あらゆるスコープで自動的にグローバルになります。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_POST_VARS</term>
<listitem>
<simpara>
HTTP POSTメソッドによりカレントのスクリプトの渡された変数を有
する連想配列です。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$_POST</term>
<listitem>
<simpara>
HTTP POSTメソッドによりカレントのスクリプトの渡された変数を有
する連想配列です。あらゆるスコープで自動的にグローバルに
なります。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_POST_FILES</term>
<listitem>
<simpara>
HTTP POSTメソッドによりアップロードされたファイルに関する情報
を有する連想配列。<varname>$HTTP_POST_FILES</varname>の内容に
関する情報については、<link
linkend="features.file-upload.post-method">POSTメソッドによるア
ップロード</link>を参照下さい。PHP 4.0.0で導入されました。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$_FILES</term>
<listitem>
<simpara>
HTTP POSTメソッドによりアップロードされたファイルに関する情報
を有する連想配列。<varname>$_FILES</varname>の内容に
関する情報については、<link
linkend="features.file-upload.post-method">POSTメソッドによるア
ップロード</link>を参照下さい。PHP 4.1.0で導入されました。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_ENV_VARS</term>
<listitem>
<simpara>
上位環境からカレントのスクリプトに渡された変数の連想配列。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$_ENV</term>
<listitem>
<simpara>
上位環境からカレントのスクリプトに渡された変数の連想配列。
あらゆるスコープで自動的にグローバルになります。PHP 4.1.0で
導入されました。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_SERVER_VARS</term>
<listitem>
<simpara>
HTTPサーバーからカレントのスクリプトに渡された変数の連想配列。
これらの変数は、前記のApache変数と類似のものです。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$_SERVER</term>
<listitem>
<simpara>
HTTPサーバーからカレントのスクリプトに渡された変数の連想配列。
これらの変数は、前記のApache変数と類似のものです。あらゆる
スコープで自動的にグローバルになります。PHP 4.1.0で導入されました。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$HTTP_SESSION_VARS</term>
<listitem>
<simpara>
カレントのスクリプトに渡されたセッション変数の連想配列。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$_SESSION</term>
<listitem>
<simpara>
カレントのスクリプトに渡されたセッション変数の連想配列。
あらゆるスコープで自動的にグローバルになります。$_SESSION
変数に新しいエントリを作成すると、
<function>session_register</function>を呼び出したときと
同様にその値はセッション変数として登録されます。
PHP 4.1.0で導入されました。
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>$_REQUEST</term>
<listitem>
<simpara>
GET, POSTそしてCookieの値を結合した、即ち、ユーザから
送信された全ての情報をもつ変数。セキュリティ的観点から
言うと必ずしも信用できるものでは有りません。あらゆる
スコープで自動的にグローバルになります。PHP 4.1.0で
導入されました。
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect2>
</sect1>
<sect1 id="language.variables.scope">
<title>変数のスコープ</title>
<simpara>
変数のスコープは、その変数が定義されたコンテキストです。ほとんどの
PHP 変数は、スコープを1つだけ有しています。このスコープの範囲は、
includeやrequireにより読みこまれたファイルも含みます。例えば、
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$a = 1;
include "b.inc";
]]>
</programlisting>
</informalexample>
<simpara>
この例で、変数<varname>$a</varname>はインクルードされた
<filename>b.inc</filename> スクリプトの中でも利用可能です。しかし、
ユーザー定義の関数の中では変数の有効範囲はローカル関数の中となりま
す。関数の中で使用された変数はデフォルトで有効範囲が関数内部に制限
されます。例えば、
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$a = 1; /* グローバルスコープ */
Function Test() {
echo $a; /* ローカルスコープ変数の参照 */
}
Test();
]]>
</programlisting>
</informalexample>
<simpara>
このスクリプトは、出力を全く行いません。これは、echo 命令がローカ
ル版の <varname>$a</varname> 変数を参照しているにもかかわらず、こ
のスコープでは値が代入されていないからです。この動作は、特にローカ
ルな定義で上書きしない限りグローバル変数が自動的に関数で使用可能で
ある C 言語と少々異なっていると気がつかれるかもしれません。C言語の
ような場合、グローバル変数を不注意で変更してしまうという問題を生じ
る可能性があります。PHP では、グローバル変数は、関数の内部で使用す
る場合、関数の内部でグローバルとして宣言する必要があります。例を以
下に示します。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$a = 1;
$b = 2;
Function Sum() {
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
]]>
</programlisting>
</informalexample>
<simpara>
上のスクリプトは、"3" を出力します。関数の内部で
<varname>$a</varname>、<varname>$b</varname>
をグローバル宣言を行うことにより、両変数への参照は、グローバル変数
の方を参照することになります。ある関数により操作できるグローバル変
数の数は無制限です。
</simpara>
<simpara>
グローバルスコープから変数をアクセスする2番目の方法は、PHPが定義す
る配列<varname>$GLOBALS</varname>を使用することです。先の例は、次
のように書き換えることができます。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$a = 1;
$b = 2;
Function Sum() {
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum();
echo $b;
]]>
</programlisting>
</informalexample>
<simpara>
配列<varname>$GLOBALS</varname>は連想配列であり、グローバル変数の
名前がキー、その変数の内容が配列要素の値となっています。
</simpara>
<simpara>
変数のスコープに関する別の重要な機能は、<emphasis>静的
(static)</emphasis> 変数です。静的変数はローカル関数スコープのみに
存在しますが、プログラム実行がこのスコープの外で行われるようになっ
てもその値を失わないません。次の例を見てください。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
Function Test() {
$a = 0;
echo $a;
$a++;
}
]]>
</programlisting>
</informalexample>
<simpara>
この関数は、コールされる度に<varname>$a</varname>を
<literal>0</literal>にセットし、"0" を出力するのでほとん
ど役にたちません。変数を1増やす $a++ は、関数から外に出ると変数
<varname>$a</varname>が消えてしまうために目的を達成しません。現在
のカウントの追跡ができるようにカウント関数を使用できるようにするた
めには、変数<varname>$a</varname>をstaticとして宣言します。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
Function Test() {
static $a = 0;
echo $a;
$a++;
}
]]>
</programlisting>
</informalexample>
<simpara>
こうすると、Test() 関数がコールされる度に<varname>$a</varname>の値
を出力し、その値を増加させます。
</simpara>
<simpara>
静的変数は、再帰関数を実現する1つの手段としても使用されます。再帰
関数は、自分自身をコールする関数です。再帰関数を書くときには、無限
に再帰を行う可能性があるため、注意する必要があります。適当な方法に
より再帰を確実に終了させる必要があります。次の簡単な関数は、中止す
るタイミングを知るために静的変数<varname>$count</varname>を用いて、
10 回まで再帰を行います。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
Function Test() {
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
Test();
}
$count--;
}
]]>
</programlisting>
</informalexample>
</sect1>
<sect1 id="language.variables.variable">
<title>可変変数</title>
<simpara>
変数名を可変にできると便利なことが時々あります。可変変数では、変数
名を動的にセットし使用できます。通常の変数は、次のような命令でセッ
トします。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$a = "hello";
]]>
</programlisting>
</informalexample>
<simpara>
可変変数は、変数の値をとり、変数の名前として扱います。上の例では、
<emphasis>hello</emphasis> は、ドル記号を二つ使用することにより、
変数の名前として使用することができます。つまり、
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
$$a = "world";
]]>
</programlisting>
</informalexample>
<simpara>
ここまでで、二つの変数が定義され、PHP シンボルツリーに定義されてい
ます。これらは、"hello" を値とする<varname>$a</varname>と "world"
を値とする<varname>$hello</varname>です。そこで、次の命令
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
echo "$a ${$a}";
]]>
</programlisting>
</informalexample>
<simpara>
の出力は、次の命令と全く同じとなります。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
echo "$a $hello";
]]>
</programlisting>
</informalexample>
<simpara>
すなわち、両方共、<computeroutput>hello world</computeroutput>を出
力します。
</simpara>
<simpara>
可変変数を配列で使用する際には、曖昧さの問題を解決する必要がありま
す。つまり、<varname>$$a[1]</varname>と書いた場合、
<varname>$a[1]</varname>を変数として使用したいのか、
<varname>$$a</varname>を変数とし [1] を変数の添え字としたいのかを、
パーサが知る必要があるのです。この曖昧さを解決するには、前者では
<varname>${$a[1]}</varname>とし、後者では
<varname>${$a}[1]</varname>とする構文を用います。
</simpara>
</sect1>
<sect1 id="language.variables.external">
<title>PHPの外部から来る変数</title>
<sect2 id="language.variables.external.form">
<title>HTML フォーム (GET と POST)</title>
<simpara>
フォームが PHP スクリプトに投稿された時、フォームから渡された全て
の変数は PHP により自動的にスクリプトから使用可能となります。
設定オプション<link linkend="ini.track-vars">track_vars</link>
がオンの場合、これらの変数は、変数のソースに応じて連想配列
<varname>$HTTP_POST_VARS</varname>,
<varname>$HTTP_GET_VARS</varname>, かつ/または
<varname>$HTTP_POST_FILES</varname> に代入されます。
</simpara>
<para>
これらの変数に関する詳細については、<link
linkend="language.variables.predefined">定義済の変数</link>を参照
下さい。
</para>
<para>
<example>
<title>単純なフォーム変数</title>
<programlisting role="php">
<![CDATA[
<form action="foo.php" method="post">
Name: <input type="text" name="username"><br>
<input type="submit">
</form>
]]>
</programlisting>
</example>
</para>
<para>
上のフォームが投稿された際、text inputで入力された値は、
<varname>$HTTP_POST_VARS['username']</varname>で利用可能となります。
<link linkend="ini.register-globals">register_globals</link>
設定ディレクティブがonの場合、この変数はグローバルスコープで
<varname>$username</varname> として利用可能となります。
</para>
<note>
<para>
<link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link>の設定
はGET、POSTそしてCookieの値に影響します。onになっていると (It's
"PHP!") という値は自動的に (It\'s \"PHP!\") となり、DBへの挿入時の
エスケープが不要になります。<function>addslashes</function>、
<function>stripslashes</function>そして<link
linkend="ini.magic-quotes-sybase">magic_quotes_sybase</link>も
参照してください。
</para>
</note>
<simpara>
PHPではフォーム変数のコンテキスト内で配列が使用可能です(<link
linkend="faq.html">FAQの関連箇所</link>も参照してください)。
例えば、関連する変数をグループ化したり、select inputで複数の値を
取得するといったことが可能です。
</simpara>
<para>
<example>
<title>より複雑なフォーム変数</title>
<programlisting>
<![CDATA[
<form action="array.php" method="post">
Name: <input type="text" name="personal[name]"><br>
Email: <input type="text" name="personal[email]"><br>
Beer: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog
<option value="guinness">Guinness
<option value="stuttgarter">Stuttgarter Schwabenbräu
</select>
<input type="submit">
</form>
]]>
</programlisting>
</example>
</para>
<para>
PHP 3では、配列変数は1次元配列に限定されていました。PHP 4ではこの
ような制約はありません。
</para>
<sect3 id="language.variables.external.form.submit">
<title>IMAGE SUBMIT 変数名</title>
<simpara>
フォームを投稿する際、次のタグのように標準の投稿ボタンの代わりに
画像を使用することができます。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
<input type="image" src="image.gif" name="sub">
]]>
</programlisting>
</informalexample>
<simpara>
画像のどこかがクリックされた場合、二つの変数 sub_x および sub_y
が付け加えられてこのフォームはサーバーに転送されます。これらの変
数は、ユーザーがこの画像をクリックした座標を示しています。経験の
ある人は、ブラウザにより送られた変数の名前においてアンダースコア
がピリオドになってしまっていることを心配するかもしれません。
しかし、PHP はピリオドをアンダースコアに自動的に変換します。
</simpara>
</sect3>
</sect2>
<sect2 id="language.variables.external.cookies">
<title>HTTP クッキー</title>
<simpara>
PHP は、<ulink url="&spec.cookies;">Netscape の規約</ulink> に定
義されたHTTP クッキーを完全にサポートします。クッキーは、リモート
ブラウザにデータを保持し、再訪するユーザーを追跡し、特定する機構
です。<function>SetCookie</function> 関数によりクッキーをセットす
ることができます。クッキーは、HTTP ヘッダの一部なので、SetCookie
関数をブラウザに何かを出力する前にコールする必要があります。
この制約は、<function>header</function> 関数のものと同じです。
クライアントから送られる全てのクッキーは、GET や POST メソッドの
データと全く同じように自勧?に PHP 変数に変換されます。
</simpara>
<simpara>
単一のクッキーに複数の値を代入したい場合は、
<emphasis>[]</emphasis> をクッキー名に付けてください。以下に例を
示します。
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
setcookie("MyCookie[]", "Testing", time()+3600);
]]>
</programlisting>
</informalexample>
<simpara>
クッキーは、パスまたはドメインが異ならない限り、
以前のクッキーをブラウザ上の同じ名前の変数に置き換えることに
注意してください。
さて、買い牧?(Shopping Cart) プログラムの場合、カウンタを保持し、
受け渡したいと思うかもしれません。
これは、次のようになります。
</simpara>
<example>
<title><function>SetCookie</function>の例</title>
<programlisting role="php">
<![CDATA[
$Count++;
setcookie("Count", $Count, time()+3600);
setcookie("Cart[$Count]", $item, time()+3600);
]]>
</programlisting>
</example>
</sect2>
<sect2 id="language.variables.external.environment">
<title>環境変数</title>
<para>
PHP は、環境変数を自動的に通常の PHP 変数として使用可能とします。
<informalexample>
<programlisting role="php">
<![CDATA[
echo $HOME; /* 環境変数 HOME が設定されている場合、表示します。 */
]]>
</programlisting>
</informalexample>
</para>
<para>
情報は、GET、POST、Cookie からも自動的に来るため、意図した種類の
変数を確実に得るために環境変数から変数を明示的に取得する方が好ま
しいということが時々あります。<function>getenv</function> 関数を
このために使用することができます。環境変数を
<function>putenv</function> 関数で設定することもできます。
</para>
</sect2>
<sect2 id="language.variables.external.dot-in-names">
<title>外部変数名のドット</title>
<para>
通常、PHP はスクリプトに渡された変数の名前を変更しません。しかし、
ドット(ピリオド、終止符)はPHPの変数名で有効な文字ではないというこ
とに注意する必要があります。次の例を見てみましょう。
<programlisting role="php">
<![CDATA[
$varname.ext; /* 無効な変数名 */
]]>
</programlisting>
ここで、パーサは、 $varname という名前の変数の後に文字列結合演算
子があり、その後に、裸の文字列(すなわち、既知のキーまたは予約語に
マッチしない引用符無しの文字列) 'ext' が続くとして解釈します。こ
の場合、明らかに意図する結果にはなりません。
</para>
<para>
重要なことを記述しておくと、このため、外部変数に含まれるドットを
PHP は自動的にアンダースコアに変換します。
</para>
</sect2>
<sect2 id="language.variables.determining-type-of">
<title>変数の型の定義</title>
<para>
PHPは、変数の型を定義し、必要に応じて変換します。このため、ある変
数の型がある時点で常に明らかであるわけではありません。PHPは、変数
の型を調べる複数の関数をサポートしています。それらは、
<function>gettype</function>, <function>is_long</function>,
<function>is_double</function>, <function>is_string</function>,
<function>is_array</function>,
<function>is_object</function> です。
</para>
</sect2>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|