変数 (variable)

定義

未定義 (undefined)

未定義の変数から読み込むとNULLが返されます。読み込む前にその状態を知るには、isset()を呼びます。またエラーレベルにE_NOTICEを追加することで、定義されていない変数の読み込み時にNotice: Undefined variableの警告を発生させることができます。

$a;
echo $a; // Notice: Undefined variable: a

$b = $a; // Notice: Undefined variable: a
echo is_null( $b ); // 1

$a = 'A';
echo $a; // A

定数 (Constants)

グローバル定数 (Global Constants)

define()関数によって定義します。ちなみにC言語の#defineはキーワードですが、PHPでは関数です。

bool define (
    string $name ,
    mixed $value
    [, bool $case_insensitive = false ]
    )
PHP: define - Manual

たとえば、定数AAAに123という値を定義するには、

define( 'AAA', 123 );

とします。

定数の再定義

定数を再定義するとエラーとなります。

define( 'AAA', 10 );
define( 'AAA', 20 ); // NG : Notice: Constant AAA already defined

未定義の定数

未定義の定数を使用すると、その定数の名前の文字列として処理されます。

define( 'AAA', 123 );

echo AAA; // 123と出力
echo BBB; // BBBと出力

このような挙動が好ましくない状況では、定数を使用する前に、それが定義されているかを確認します。それはdefined()で行えます。

bool defined ( string $name )
PHP: defined - Manual

引数$name文字列で指定することに注意が必要です。これを定数としては、確認対象の定数を定数で指定することになってしまいます。

define( 'AAA', 123 );

echo defined(  AAA  )? AAA : 'undefined'; // NG : defined(123)と解釈される
echo defined( 'AAA' )? AAA : 'undefined'; // OK

クラス定数 (Class Constants)

クラス定数は、constキーワードによって定義します。PHP: オブジェクト定数 - Manual

class Foo
{
    const CONSTANT = 256;
}

定義済み定数 (Predefined Constants)

定数 説明
PHP_VERSION 現在のPHPのバージョン
PHP_MAJOR_VERSION 現在のPHPのメジャー バージョン
...  
PHP: 定義済みの定数 - Manual

定義済み変数 ($_GET、$_POSTなど) ≫エラーレベル定数

可変変数 (Variable variables)

変数を利用して変数を定義することで、動的に変数を使い分けられるようになります。PHP: 可変変数 - Manual

$a = 'value';

$$a = 256;    // 変数valueが定義され数値が格納される

echo $value;  // 256と表示される

可変変数は配列に対して特に有効です。たとえば配列$_POSTの要素を可変変数で処理することで、配列のキーから変数を作成できます。

変数のスコープ

include

includeされるスクリプト内で定義された変数は、includeした側でも有効です。また、その逆も有効です。

たとえばsample.phpで、

$a = 1;

と定義されていると、これをincludeした側では、

include 'sample.php';
echo $a; // 1 と出力

のように変数にアクセスできます。

ブロック

変数のスコープはブロック内に制限されません

for( $i = 0; $i < 10; $i++ )
{
    $a = 1;
}

echo $i; // 10 と出力
echo $a; // 1 と出力

関数

関数の中で使用される変数は、スコープが関数内部となります。

$a = 1; // グローバルスコープ

function Foo()
{
    echo $a; // ローカルスコープの変数の参照
}

関数内部からグローバル変数を参照するには、globalキーワードでグローバル宣言します。global キーワード - PHP: 変数のスコープ - Manual

$a = 1; // グローバルスコープ

function Foo()
{
    global $a;

    echo $a; // グローバルスコープの変数の参照
}

静的変数

関数内で定義されるローカルスコープの変数に対して、初期化をコンパイル時にのみ行うように指示します。そのためには、staticキーワードで宣言します。静的変数の使用 - PHP: 変数のスコープ - Manual

function Foo()
{
    static $a = 0;
}

変数の存在と値の確認

isset()

変数が存在して、その値がNULL以外のときにTRUEが返されます。

bool isset ( mixed $var [, mixed $... ] )
PHP: isset - Manual

なお配列内の要素の存在を確認するには、array_key_exists()を用います。

empty()

次のいずれかの場合に、TRUEが返されます。

bool empty ( mixed $var )
PHP: empty - Manual

empty()は意味的に、

!isset( $var ) || $var == FALSE

と同義であり、このように書き換えられます。

isset()とempty()の比較

isset()とempty()の判定には、下表のような違いがあります。

説明 isset() empty()
$var 定義されていない変数 FALSE TRUE
$var 定義されているが、値が未設定の変数
NULL ヌル
TRUE 論理値 TRUE FALSE
256 整数
"abc" 文字列
array(256) 配列
FALSE 論理値 TRUE
0 整数の0
0.0 浮動小数点数の0
"0" 文字列の0
"" 文字列
array() の配列