【PHP】class(クラス)の使い方とは?変数やメソッド、インスタンスの意味
この記事からわかること
- PHPのclass(クラス)の構文と使い方
- プロパティとメソッドの違いと参照の仕方
- アクセス権とコンストラクタの仕組み
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
プログラミング言語のややこしい壁の1つオブジェクト指向。phpでもオブジェクト指向型の考え方を使うクラスがあります。
私も実際に悩んだポイントやつまづいたところを踏まえながら自分の備忘録がてら解説していきたいと思います。
phpのclass(クラス)の使い方
まずはphpにおけるクラスを使う時の流れを確認してみます。
クラスを使うときの流れ
- class命令でクラスを定義(1〜6行目)
- new演算子でインスタンス化して変数に格納(8行目)
- 変数や関数に対して演算子で呼び出す(9行目)
実際のコード
class Number{
public function AddNumber(int $num1,int $num2){
$sum = $num1 + $num2;
return $sum;
}
}
$obj = new Number();
echo $obj->AddNumber(2,3);
// 結果:5
クラスはclass命令
で定義します。使い方は関数の時と似ていますが引数もないので()が不要です。
定義したクラスを実際に使えるようにするのがインスタンス化です。phpではnew演算子
を使ってインスタンス化し、定義したクラスの分身を変数の中に格納できます。
new演算子でクラスを変数の格納するとデータ型はオブジェクト型で格納されます。なので格納された変数をオブジェクト変数と呼ぶ。
オブジェクト型の変数(プロパティ)と関数(メソッド)の呼び出し方はアロー演算子(->)
で呼び出すことができます。
- class命令:クラスを定義するときのコード
- new演算子:クラスをインスタンス化して変数に格納するときのコード
- アロー演算子:インスタンス化したオブジェクト変数のプロパティ/メソッドの呼び出し
クラス名の命名規則
変数や関数の命名規則は「CamelCase記法」か「アンダースコア記法」が主流ですが、クラス名の命名規則は「Pascal記法」が主流です。
記法 | 説明 | 例 |
---|---|---|
CamelCase記法 | 先頭は小文字で単語ごとに大文字 | $myData |
アンダースコア記法 | 小文字で単語の間をアンダースコア(_)で繋ぐ | $my_data |
Pascal記法 | 先頭と単語の区切りが大文字 | $MyData |
Pascal記法は先頭の文字と単語区切りの先頭文字を大文字で記述する方法です。
クラスのメリット
クラスを使うことで決まった処理を1つのコードを書くだけで簡単に使い回すことができます。また修正する箇所もその1つで良いため保守性にも優れているのがクラスです。
クラスのメリット
- 再利用性:決まった処理を簡単に使いまわせる
- 保守性:記述するコードは1つなので修正がしやすい
- 拡張性:後から関数や変数を足しても問題なし
- 可読性:クラス名や関数名は自分で決めるので理解しやすい
プロパティ(メンバ変数)とは
プロパティ(メンバ変数)とはクラス内で定義された変数のことです。
プロパティ(メンバ変数)の使い方
class Number{
public $num;
}
$obj = new Number();
$obj->num = 5;
echo '指定された数字は'.$obj->num.'です';
// 結果:指定された数字は5です
phpで扱っている変数とは基本的な使い方は同じですが少し定義方法や参照方法が異なるので注意が必要です。
定義するときはプロパティの前にアクセス修飾子をつけないといけません。アクセス修飾子はその変数のアクセス権をどこまでの範囲にするかを自分で決める役割を持っています。
アクセス修飾子の種類と概要は後述します。
プロパティを呼び出すときの注意点
クラスの中で定義した変数を呼び出す(言い換えると、インスタンス化したオブジェクト変数からクラスのプロパティを呼び出す時)も注意が必要です。ここら辺の理解が複雑ですよね。。
通常変数の値を取得する(呼び出す)時はそのまま変数名を記述すればOKでした。
echo $var;
しかしプロパティを呼び出すときはインスタンス化したオブジェクト変数に対してアロー演算子を使って呼び出します。
echo $obj->var;
プロパティを呼び出す時は定義時にはつけていた$記号を消さないといけません。
これは値を格納するときも同じです。
変数とプロパティ(メンバ変数)は別物として捉えた方が良さそうですね!
プロパティ(メンバ変数)の注意点
- クラス内では通常の変数のように定義できない(アクセス修飾子をつける)
- 呼び出す時は$記号を外す
メソッド(メンバ関数)とは
メソッド(メンバ関数)とはクラス内で定義された関数のことです。
メソッド(メンバ関数)の使い方
class Char{
public function charView(string $msg = "デフォルト値"){
echo '指定された文字は'.$msg.'です';
}
}
$obj = new Char();
$obj->charView("メンバ関数");
// 結果:指定された文字はメンバ関数です
$obj->charView();
// 結果:指定された文字はデフォルト値です
プロパティより圧倒的に汎用性が高く、実用的なのがメソッド(メンバ関数)です。
メソッド(メンバ関数)もプロパティ同様に定義の前にアクセス修飾子を設置するのが基本となっています。
クラス内の関数も通常の関数と構文にあまり差異はありません。引数を指定したり、引数にデフォルト値を設定したりすることができます。
関数の中にプロパティや引数を入れ込む場合は通常の変数のように文字を結合すればOKです!
関連記事:【PHP】変数と文字列の結合方法!引用符の違いと展開の仕方を理解しよう
特別な変数「$this」
外の関数にはない構文で$this
というキーワードがあります。まずは使い方からみてみます。
$thisの使い方
class Char{
public $lang;
public $greeting;
public function charView(){
echo $this->lang.'での挨拶は'.$this->greeting.'です';
}
}
$obj = new Char();
$obj->charView();
// 結果:での挨拶はです
$obj->lang = "日本語";
$obj->greeting = "こんにちは";
$obj->charView();
// 結果:日本語での挨拶はこんにちはです
$this
はクラス内で定義されたプロパティを関数の中で参照する時に使うキーワードです。
参照方法はインスタンス化した時のようにオブジェクト変数に対してアロー演算子で呼び出すことができます。
こちらも同様に$記号をつけずにプロパティ名を記述する点に注意が必要です。
$thisを使うメリット
プロパティ(変数)の値によってメソッド(関数)の挙動を変化させられるのが大きなメリットでもあります。
class Judge{
public $bool;
public function Judgement(){
if($this->bool){
echo "処理が成功しました!";
}else{
echo "処理が失敗しました。。";
}
}
}
$obj = new Judge();
$obj->bool = true; // 何らかの処理の結果を格納
$obj-> Judgement();
// 結果:処理が成功しました!
例えばこのように処理の結果に応じて真偽値の結果を取得しプロパティに格納させ、その値によって関数の挙動を変化させるなんてことができるようになります。
$thisの特徴とメリット
- 同じクラス内に定義したプロパティをメソッド内で参照できる
- 参照するときは$記号を外す
- プロパティによってメソッドの挙動を変化させられる
アクセス修飾子とは
アクセス修飾子とは先ほども説明した通り、アクセス権の範囲を指定する前置詞です。
プロパティとメソッド両方にアクセス修飾子は記述します。
public $var; // メンバ変数の定義
public function AddNumber(){ // メンバ関数の定義
// 処理
}
アクセス権を指定できるのは3種類です。全部pから始まるので混載しやすいですが英語の意味を理解しやすい単語なので意味をそのまま覚えるのがおすすめです。
アクセス修飾子の種類
アクセス修飾子 | 意味 | 英単語の意味 |
---|---|---|
public | 制限なし | 公衆の〜,公開の〜 |
protected | 定義したクラスとサブクラスのみ | 保護した〜,防いだ |
private | 定義したクラスのみ | 私的な〜,内密の〜 |
英単語の意味を見るとアクセス修飾子がなんとなくどんな範囲を指しているかがわかります。
アクセス修飾子を省略すると自動的に「public」になりますが、明示的に定義しておいた方がわかりやすいですね!
アクセス修飾子をprivate
に設定して外から参照しようとするとエラーになりました。
コンストラクタとは
コンストラクタとはクラスがインスタンス化された時に最初に必ず実行される処理のことです。
コンストラクタを定義することで値の初期化やインスタンス化時に絶対に行わせたい処理を行うことができます。
コンストラクタはクラスやメソッドのように名前を自由に決めることができません。コンストラクタ名は__construct
と覚えておきましょう。
class Char{
public function __construct(int $num){
echo '今回の初期値は'.$num.'です';
}
}
$obj = new Char(1); // この時点でコンストラクタが実行される
// 結果:今回の初期値は1です
$obj = new Char(); // コンストラクタに引数の指定があるのに引数を指定しないとエラーになる
// 結果:エラー
今回はサンプルでこのような処理を記述しましたが、基本的にはインスタンスを初期化するためにコンストラクタは存在します。
このように何かの結果を返すのは厳密には正しくない使い方になるので覚えておきましょう!
デストラクタとは
デストラクタとはコンストラクタの逆で処理の最後に実行される処理のことです。正確にはオブジェクトが破棄されるタイミングで実行されます。
デストラクタ名もコンストラクタ名と同じであらかじめ__destruct
で固定されています。
class Char{
public function __construct(int $num){
echo '<p?>今回の初期値は'.$num.'です</p>';
}
public function charView(string $msg = "デフォルト値"){
echo '<p>指定された文字は'.$msg.'です</p>';
}
public function __destruct(){
echo '<p>オブジェクトが破棄されました</p>';
}
}
$obj = new Char(2); // この時点でコンストラクタが実行される
// 結果:今回の初期値は2です
$obj->charView();
// 結果:指定された文字はデフォルト値です
unset($obj); // この時点でデストラクタが実行される
// 結果:オブジェクトが破棄されました
最後に
今回はクラスの基本的な構文や仕組みを解説しましたが、クラスについてはまだまだサブクラスや継承などのいろいろな仕組みがあります。
ご覧いただきありがとうございました。
次回記事:【PHP】サブクラスとは?オブジェクト指向の考え方とアクセサメソッドを解説
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。