変数


変数を定義する

変数を定義するには最初に$をつけた英数字列を使用します。
_(アンダーバー)も使用できます。-や?は使用できません。$の後に数字を使うこともできません。

$val = 1;   // => 1
//$10val = 10;   // => Parse error
//$v-al = 10;   // => Parse error
//$v?al = 10;   // => Parse error

初期化されていない変数を扱うとデフォルトの初期値が設定されそこに値が代入されます。
この場合代入したつもりが代入できていないことにもつながるのでしっかりテストが必要になると思います。
クラスの場合は__set,__getを定義しておくことで回避できます。

// 定義されていない変数を処理すると
$val2 += 5;   // => 5
$str .= "apple";   // => apple

変数のスコープ

<?phpから?>の範囲がスコープの範囲となります。これはrequireやincludeしたファイルもその範囲に入ります。
ただし関数の中では事情が違います。
関数の中で定義された変数は関数内がスコープとなります。
関数の外の変数はスコープの範囲ではなく明示的にglobal宣言しなければいけません。

$a = 123;
echo $a . "\n";    // => 123

function func(){
    echo $a . "\n";    // => 何も出力されない。関数の外の変数はスコープ外

    global $a;    // => global宣言すると関数の外の変数が見えるようになる
    echo $a . "\n";    // => 123

    $b = 789;
    echo $b . "\n";    // => 789
}

func();
echo $b . "\n";    // => 何も出力されない。関数内の変数はスコープ外

定数を定義する

define(定数名, 値);の形式で定義します。

define("CONSTANT", 1);
define("CONSTANT_STR", "string");

echo CONSTANT . "\n";    // => 1
echo CONSTANT_STR . "\n";    // => string

静的変数を定義する

定義方法は static キーワードをつけて定義するだけで変数定義と変わりません。
グローバル変数との違いはrequireやincludeされた場合にスコープを外れてもその値が保持され続けます。他のプログラムが再度requireなどで参照した場合は値が引き継がれています。

function func_static(){
    static $a = 1;
    echo $a . "\n";
    $a++;
}

func_static();    // => 1
func_static();    // => 2

参照渡しする

&を付けて変数に渡します。

$org = "hello ";
$cp = &$org;
echo $org . "\n";    // => hello 

// 元の変数も変化する
$cp .= "world";
echo $org . "\n";    // => hello world

関数の引数に渡す場合は関数の定義の引数に&を付けます。

function ref_func(&$arg){
    $arg .= " 2\n";
}
ref_func($org);
echo $org . "\n";    // => hello world 2

変数を置き換える(スワップする)

listを使うと一時変数を用意しなくても置き換えることができます。

$var1 = 20;
$var2 = 5;
list($var1, $var2) = array($var2, $var1);

echo $var1 . "\n";    // => 5
echo $var2 . "\n";    // => 20

変数の型を調べる

gettype()を使います。floatはdoubleとなります。

class Type{
    private $var;
}
echo gettype(NULL) . "\n";    // => NULL
echo gettype(true) . "\n";    // => boolean
echo gettype(1) . "\n";    // => integer
echo gettype(1.0) . "\n";    // => double
echo gettype("type") . "\n";    // => string
echo gettype(array(1)) . "\n";    // => array
echo gettype(new Type()) . "\n";   // => object
// ファイルやデータベースのオブジェクトはresourceとなります。