ホームページ >バックエンド開発 >PHPチュートリアル >変数と定数
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['b'] = $GLOBALS['a'] + $BLOBALS['b'];
静的変数
宣言内の式の結果を静的変数に代入すると、静的宣言はコンパイル時に解析エラーが発生します。
<?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 $a = 'hello';$$a = 'world';echo "$a $$a"; // hello $helloecho "$a ${$a}"; // hello world可変変数を配列で使用すると、あいまいな問題が発生する可能性があります。たとえば、$$a[1] と記述すると、コンパイラはエラーを報告します。表現したい意味は次の 2 つの方法に置き換える必要があります。
${$a[1]}
$a[1] を変数として
$$a を変数として、変数内のインデックス 1 の値を取り出します。
変数名のドットとスペースはアンダースコアに変換されることに注意してください。たとえば、c980bcbd112e55cdd1fa53de54bc2b01 は $_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
関連する 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个魔术常量的值随着它们在代码中的位置改变而改变。
(全文完)