【PHP】class(クラス)の使い方とは?変数やメソッド、インスタンスの意味

この記事からわかること

  • PHPのclass(クラス)の構文と使い方
  • プロパティメソッド違いと参照の仕方
  • アクセス権コンストラクタの仕組み

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

プログラミング言語のややこしい壁の1つオブジェクト指向。phpでもオブジェクト指向型の考え方を使うクラスがあります。

私も実際に悩んだポイントやつまづいたところを踏まえながら自分の備忘録がてら解説していきたいと思います。

phpのclass(クラス)の使い方

まずはphpにおけるクラスを使う時の流れを確認してみます。

クラスを使うときの流れ

  1. class命令でクラスを定義(1〜6行目)
  2. new演算子でインスタンス化して変数に格納(8行目)
  3. 変数や関数に対して演算子で呼び出す(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演算子でクラスを変数の格納するとデータ型はオブジェクト型で格納されます。なので格納された変数をオブジェクト変数と呼ぶ。

オブジェクト型の変数(プロパティ)と関数(メソッド)の呼び出し方はアロー演算子(->)で呼び出すことができます。

クラス名の命名規則

変数や関数の命名規則は「CamelCase記法」か「アンダースコア記法」が主流ですが、クラス名の命名規則は「Pascal記法」が主流です。

記法 説明
CamelCase記法 先頭は小文字で単語ごとに大文字 $myData
アンダースコア記法 小文字で単語の間をアンダースコア(_)で繋ぐ $my_data
Pascal記法 先頭と単語の区切りが大文字 $MyData

Pascal記法は先頭の文字と単語区切りの先頭文字を大文字で記述する方法です。

クラスのメリット

クラスを使うことで決まった処理を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】サブクラスとは?オブジェクト指向の考え方とアクセサメソッドを解説

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index