PHPでは他のプログラミング言語同様さまざまな変数の使い方があります。
この記事では、
・変数とは
・変数の基本的な使い方
・可変変数の使い方
・変数のスコープについて
・変数を使用する上での注意点
という基本的な内容から、
・疑似変数thisの使い方
・疑似変数で現在のクラス名を取得する方法
・静的なメンバを参照する方法
などの応用的な使い方に関しても解説していきます。
今回はPHPの変数の基本的な使い方から応用的な使い方まで網羅的に解説いたします!
変数とは
変数とはプログラムにおいて、「値や計算結果などを一時的に格納する箱のようなもの」です。
PHPで変数を扱うには、ドル記号($)の後に変数名を指定します。変数名は大文字小文字で区別されます。
変数については以下の記事でも詳しく解説しています!
変数の基本的な使い方
以下に変数の基本的な使い方を紹介します。
$str1 = 'samurai '; echo $str1; // samurai $str2 = "engineer"; echo $str1.$str2; // samurai engineer $num1 = 10; $num2 = 20; echo $num1 + $num2; // 30
上記のように変数の宣言と同時に値を代入するのがPHPの変数の基本的な使い方になります。
値をシングルクォーテーション「’」やダブルクォーテーション「”」で囲むとStringとして扱われます。
また、変数名は大文字小文字で区別され、先頭に数字は指定できませんので注意しましょう!
//大文字小文字は区別される $str = 'samurai '; $STR = 'engineer'; //先頭に数字はエラー $3item = 10; //アンダーバー'_'で区切るのはOK $num_1 = 100;
可変変数
可変変数を使用すると、変数の値と同じ変数名の値を使用できます。
例えば、以下のように$engineerの変数の値を変数名とすることで以下のような結果になります。
$samurai = 'engineer'; $engineer = 'samurai'; echo $$engineer;
実行結果:
engineer
変数に「$$」とすることで、その変数の値を変数名として使用できるため、結果は”engineer”となります。
しかし、可変変数は「$$」と書いても逆にわかりにくくなるので、特別な理由が無い限りは多用しないほうがよいでしょう。
変数のスコープ
変数のスコープとは、変数が使用できる範囲のことを言います。
functionで定義した関数の中で宣言した変数をローカル変数、ソースファイル全体で有効な変数をグローバル変数と呼びます。
ローカル変数は関数などの限られた範囲でのみ参照するためローカルスコープ、関数内や関数外でも参照できることをグローバルスコープとも呼びます。
ローカルスコープ:
function func(){ //ローカル変数 $num = 100; echo $num; } func(); //関数の外では参照できない echo $num;
関数内のブロック内で宣言された変数$numは関数の制御構造内でのみ使用可能です。
グローバルスコープ:
//グローバル変数 $num = 100; function func(){ //globalを指定して、グローバルスコープの変数を参照する global $num; echo 'ローカルスコープでの参照:'.$num; echo '<br>'; } func(); echo 'グローバルスコープでの参照:'.$num;
グローバルスコープで設定した変数を関数内で参照するにはglobalを指定して参照する必要があります。
たとえば、関数内でglobalを指定せずに「echo $num;」を記述しても値はNULLとなってしまいます。
変数の注意点
PHPの変数は、はじめに解説したとおり変数の前にドル記号($)を付けないとエラーとなります。
また、空の変数をechoなどで出力しようとしてもエラーとなります。
変数に値がセットされているか確認したい場合はempty関数やisset関数を使用します。
//変数に$を付けていないのでエラー test = 100; // エラー:PHP Parse error: syntax error //変数を宣言していないのでエラー echo $num; // エラー:PHP Notice: Undefined variable: //値をセットしていないのでemptyはTRUEを返す。 if (empty($num)){ echo '$numは空です。'; }
isset関数やempty関数については、以下の記事で詳しく解説していますので参考にしてくださいね!
疑似変数this
クラス内でメンバ変数が定義されている場合、疑似変数$thisを使用することで、クラスの変数にアクセスすることができます。
例えばクラスのメンバ変数を定義して、メンバ変数をそのクラスのメソッド内で参照したい場合、$変数のみの指定では参照することができません。
そのため、クラス内のメンバ変数にアクセスするためには疑似変数$thisを使用します。
thisはクラス内に定義されているメンバを、ひとつにまとめたオブジェクトのようなものです。
疑似変数$thisは以下のように使用します。
疑似変数の使い方:
class クラス名{ public $変数名 = 値; public function メソッド名(){ echo this->$変数名; } }
上記のようにメソッド内でクラス内のメンバ変数にアクセスするために、this->$変数名とすれば値を参照することができます。
thisの使い方
ここでは、実際にthisの使い方を見ていきましょう。
以下のサンプルでは、クラス内のメンバ変数をメソッド内でthisを使用してアクセスしています。
<?php class SamuraiClass{ public $val = 'Samurai'; //メソッドの宣言 public function SamuraiMethod(){ $val = 'Engineer'; echo $this->val; } } //インスタンスの生成 $class = new SamuraiClass(); //メソッドの呼出し $class->SamuraiMethod(); ?>
実行結果:
Samurai
サンプルではクラスSamuraiClassのメンバ変数とメソッドSamuraiMethodのローカル変数で、同じ変数名を定義しています。
たとえクラスとメソッドで同じ変数が定義されていても、thisを使用すればクラスのメンバ変数を参照することができます。
thisを指定しなければ、メソッド内のローカル変数を参照します。
現在のクラス名を取得する
現在のクラス名を取得したいとき、get_class関数の引数にthisを指定すればクラス名を取得することができます。
get_class関数は以下のように記述します。
string get_class($オブジェクト名);
以下にget_class関数でthisを指定して、現在のクラス名を取得する方法を記述します。
<?php class SamuraiClass{ //メソッドの宣言 public function SamuraiMethod(){ echo 'this class is a '.get_class($this); } } //インスタンスの生成 $class = new SamuraiClass(); //メソッドの呼出し $class->SamuraiMethod(); ?>
実行結果:
this class is a SamuraiClass
静的メンバを参照する
thisを使用すれば、クラス内のメンバに対してアクセスすることができますが、クラス内のメンバが静的メンバ(static)の場合はどうなのでしょうか?
thisの使い方で説明したクラス内メンバを、以下のように静的メンバとしてプログラムを実行してみます。
public static $val = 'Samurai';
staticなメンバに対してthisを実行すると、以下のような「静的プロパティに非正規的にアクセスしている」旨のエラーがログに出力されます。
PHP Notice: Accessing static property SamuraiClass::$val as non static in ~
staticは、オブジェクトをインスタンス化せずに矢印演算子(->)を使用しないで静的にアクセスすることができます。
しかし、クラスのオブジェクトであるthisは、クラスのインスタンス化と同様のアクセス方法であるため、staticで宣言された静的メンバにアクセスすることはできません。
では、クラス内の静的なメンバにメソッドからアクセスするにはどうすればいいか?を次項で詳しく解説します。
staticの使用方法については、以下の記事で詳しく解説しています!
selfを使用する
先述したように、staticを指定した静的メンバにthisを指定してアクセスすることはできません。
そのため、メソッドから静的メンバにアクセスためには、self::を使用します。
selfは、クラスの静的なメンバやメソッドに静的にアクセスすることができます。
以下にselfを使用して、メソッド内からクラスの静的メンバにアクセスする方法を記述します。
<?php class SamuraiClass{ public static $val = 'Samurai'; //メソッドの宣言 public function SamuraiMethod(){ $val = 'Engineer'; echo self::$val; } } //インスタンスの生成 $class = new SamuraiClass(); //メソッドの呼出し $class->SamuraiMethod(); ?>
実行結果:
Samurai
実行結果のとおり、self::を使用すればstaticを使用した静的メンバにアクセスすることができますね!
thisと同じくローカル変数に同じ変数名が定義されていても、self::を使用すればクラスのメンバを参照することができます。
まとめ
この記事では変数について、
・変数とは
・変数の基本的な使い方
・可変変数の使い方
・変数のスコープについて
・変数を使用する上での注意点
という基本的な内容から、
・疑似変数thisの使い方
・疑似変数で現在のクラス名を取得する方法
・静的なメンバを参照する方法
などについて解説しました。
変数はプログラミングをする上で最も基本的な内容なりますので、使い方はしっかりと覚えておきましょう。
もし変数の使い方を忘れてしまったら、この記事を思い出してくださいね!