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();
#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]}
$a[1] を変数として
$$a を変数として、変数内のインデックス 1 の値を取り出します。
変数名のドットとスペースはアンダースコアに変換されることに注意してください。たとえば、 は $_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>
<?php var_dump(isset($_POST['my.text']));var_dump(isset($_POST['mytext']));var_dump(isset($_POST['my_text']));var_dump($_POST['my_text']);
boolean falseboolean falseboolean truestring 'h3' (length=2)
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;}
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;}
array (size=3) 'action' => string '1' (length=1) 'sub_x' => string '334' (length=3) 'sub_y' => string '282' (length=3)
関連する 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个魔术常量的值随着它们在代码中的位置改变而改变。
(全文完)