変数と定数

WBOY
リリース: 2016-06-23 13:26:10
オリジナル
938 人が閲覧しました

変数の基本

PHP の変数は、ドル記号とそれに続く変数名で表されます。変数名では大文字と小文字が区別され、漢字も使用できる場合があります。

デフォルトでは、変数は常に値によって割り当てられます。 PHP では、変数に値を代入する別の方法である参照代入も提供しています。これは、新しい変数が単に元の変数を参照する (つまり、「エイリアス」または「ポイントする」) ことを意味します。新しい変数を変更すると元の変数に影響し、その逆も同様です。参照代入を使用するには、代入する変数 (ソース変数) にアンパサンドを追加するだけです。参照によって割り当てられるのは名前付き変数のみであることに注意してください。

事前定義された変数

PHP には多数の事前定義された変数があり、その多くはサーバーに依存します。一部の事前定義された変数はコマンド ラインから実行すると有効になりません。

PHP は、Web サーバー (利用可能な場合)、実行環境、およびユーザー入力からのデータを含む追加の配列変数セットを提供します。これらの配列変数は、多くの場合、オートグローバルまたはスーパーグローバルと呼ばれます。

変数スコープ

ここでの変数スコープとは、変数が定義されているコンテキスト、つまり有効なスコープを指します。変数のスコープには、include および require によって導入されたファイルが含まれます。

PHP のグローバル変数は C 言語とは少し異なります。C 言語では、ローカル変数によってオーバーライドされない限り、グローバル変数は関数内で自動的に有効になります。 PHP のグローバル変数を関数で使用する場合は、グローバル変数を宣言する必要があります。

<?php $a = 'hello';function test() {    var_dump($a);}// test();include 'b.inc';
ログイン後にコピー

b.inc の内容は以下の通りです:

<?php echo 'hello';?>
ログイン後にコピー

プログラムは正常に hello を出力できますが、コメントアウトされた test() は変数 $a が未定義のため正常に解析できません。

グローバル変数を使用する

関数内でグローバル変数を使用したい場合は、次の 2 つの方法を使用できます。

  • グローバル キーワード

    global $a, $b;
    ログイン後にコピー
  • 関数内でグローバル変数を宣言した後は、変数へのすべての参照がそのグローバル バージョンを指すようになります。

  • $GLOBALS スーパーグローバル変数配列

    $GLOBALS['b'] = $GLOBALS['a'] + $BLOBALS['b'];
    ログイン後にコピー
  • 使い方は global キーワードと似ています。

    静的変数

    静的変数はローカル関数スコープ内にのみ存在しますが、プログラムの実行がこのスコープを離れても、その値は失われません。また、初期化されるのは宣言時に一度だけであり、関数が呼び出されるたびに静的関数の値が上書きされることはありません。

    宣言内の式の結果を静的変数に代入すると、静的宣言はコンパイル時に解析エラーが発生します。

    <?php function test() {    static $cnt = 0;    echo $cnt;    $cnt++;    if($cnt < 10) {        test();    }    $cnt--;}test();
    ログイン後にコピー

    C 言語の static と同様に、次の C コードでも 0 から 9 までの 10 個の数値を順番に出力できます。

    #include <stdio.h>void test(void) {    static int cnt = 0;    printf("%d ", cnt);    cnt++;    if(cnt < 10) {        test();    }    cnt--;}int main(void) {    test();    return 0;}
    ログイン後にコピー

    変数の静的定義とグローバル定義は参照によって実装されます。

    変数変数

    変数変数は、PHP 言語における特殊な使用法であり、他の言語にも存在するかどうかはわかりません。

    要するに、可変変数とは、通常の変数の値を可変変数の変数名として取得することを意味します。

    <?php $a = 'hello';$$a = 'world';echo "$a $$a";  // hello $helloecho "$a ${$a}";  // hello world
    ログイン後にコピー

    可変変数を配列で使用すると、あいまいな問題が発生する可能性があります。たとえば、$$a[1] と記述すると、コンパイラはエラーを報告します。表現したい意味は次の 2 つの方法に置き換える必要があります。

    ${$a[1]}

    $a[1] を変数として

    ${$a}[1]

    $$a を変数として、変数内のインデックス 1 の値を取り出します。

    フォーム変数

    フォームが PHP スクリプトに送信されると、フォーム内の情報がスクリプト内で自動的に利用可能になり、$_GET[]、$_POST[]、および $_REQUEST[] を介してアクセスできます。

    変数名のドットとスペースはアンダースコアに変換されることに注意してください。たとえば、 は $_REQUEST["a_b"] になります。次の例は、フォームでの識別子の使用を示しています。

    <form action="process.php" method="post"><input name="my.text" type="text"><input name="my text" type="text"><input name="my_text" type="text"><input type="submit"></form>
    ログイン後にコピー

    フォーム処理ファイル process.php。

    <?php var_dump(isset($_POST['my.text']));var_dump(isset($_POST['mytext']));var_dump(isset($_POST['my_text']));var_dump($_POST['my_text']);
    ログイン後にコピー

    ピリオドは PHP 変数名では有効な文字ではないため、出力は次のようになります。

    boolean falseboolean falseboolean truestring 'h3' (length=2)
    ログイン後にコピー

    magic_quotes_gpc 設定ディレクティブは get/post/cooie の値に影響します。この機能は非推奨となり、入力内の単一引用符、二重引用符、バックスラッシュおよび NULL 文字はエスケープされません。エスケープする必要がある場合は、addslashes() を使用できます。引用符で囲まれた文字列をデク​​ォートする必要がある場合は、stripslashes() を使用する必要があります。

    PHP は、フォーム変数のコンテキストで配列も理解します。以下の例では、より複雑なフォーム変数を使用し、フォームを自身にポストし、送信時にデータを表示します。

    <?php if(isset($_POST['action'])) {    var_dump($_POST);} else {    $page = $_SERVER['PHP_SELF'];    $s = <<<STR<form action="{$_SERVER['PHP_SELF']}" method="post"><input type="text" name="personal[name]"><input type="text" name="personal[detail]"><select multiple name="option[]">    <option value="a">a</option>    <option value="b">b</option>    <option value="c">c</option></select><input type="hidden" name="action" value="submitted"><input type="submit" name="submit"></form>STR;    echo $s;}
    ログイン後にコピー

    ヒアドキュメントに複雑な変数を含める場合は、特に注意してください。中括弧のない上記のコード $_SERVER['PHP_SELF'] は、実行時にエラーを引き起こします。

    array (size=4)  'personal' =>     array (size=2)      'name' => string 'hello' (length=5)      'detail' => string 'world' (length=5)  'option' =>     array (size=2)      0 => string 'a' (length=1)      1 => string 'c' (length=1)  'action' => string 'submitted' (length=9)  'submit' => string '提交查询内容' (length=12)
    ログイン後にコピー

    画像送信

    フォームを送信するときに、標準の送信ボタンを画像に置き換えることができます。初めて使ったときは本当に魔法のようでした。

    <?php if(isset($_POST['action'])) {    var_dump($_POST);} else {    $s = <<<STR<form action="{$_SERVER['PHP_SELF']}" method="post"><input type="hidden" name="action" value="1"><input type="image" src="go.jpg" name="sub"></form>STR;    echo $s;}
    ログイン後にコピー

    上記のプログラムでは、ユーザーが画像内のどこかをクリックすると、フォームがサーバーに送信され、ユーザーがクリックした画像の座標を含む 2 つの変数 sub_x と sub_y が追加されます。

    array (size=3)  'action' => string '1' (length=1)  'sub_x' => string '334' (length=3)  'sub_y' => string '282' (length=3)
    ログイン後にコピー

    cookies

    PHP は setcookie() 関数を使用して Cookie を設定できるため、Cookie は HTTP ヘッダーの一部であるため、ブラウザに出力を送信する前に呼び出す必要があります。

    関連する Cookie の使用は次のとおりです。

    <?php if(isset($_COOKIE['cnt'])) {    $cnt = $_COOKIE['cnt'] + 1;        echo $cnt;} else {    $cnt = 1;}setcookie('cnt', $cnt, time() + 3600);
    ログイン後にコピー

    Cookie データは、対応する Cookie 配列で使用できます。複数の値が Cookie 変数に割り当てられている場合は、それらを配列に割り当てる必要があります。

    常量语法

    常量在脚本执行期间其值不能改变。常量大小写敏感,传统上常量标识符总是大写。常量一旦定义就不能被重新定义或取消定义,常量的值只能是标量。

    可以用define()函数来定义常量,也可以使用const关键字在类定义之外定义常量。自定义常量不要以双下划线开头,可能会与魔术常量冲突。

    define('FOO', 'something');const FOO = 'something';
    ログイン後にコピー

    使用const关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。常量的范围是全局的,不用管作用区域,就可以在脚本的任何地方访问常量。

    魔术常量

    魔术常量值能变,但它其实不是常量。

    __LINE__  // 文件中的当前行号__FILE__  // 文件的完整路径和文件名,绝对路径__DIR__  // 文件所在的目录,除非根目录,否则不包括末尾斜杠,等价于dirname(__FILE__)__FUNCTION__  // 函数名称,区分大小写__CLASS__  // 类的名称,包括其被声明的作用区域__TRAIT__  // Trait的名字,包括其被声明的作用区域__METHOD__  // 类的方法名__NAMESPACE__  // 当前命名空间的名称
    ログイン後にコピー

    PHP向它运行的任何脚本提供了大量的预定义常量,上面8个魔术常量的值随着它们在代码中的位置改变而改变。

    (全文完)

    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート