PHPの関数とクラス、インターフェイス
カテゴリ:PHP編
この記事ではPHPの関数とクラス、インターフェイスについて解説します。関数
関数は何かの値を渡すと、何らかの処理を実行し、何かの値を返すという、一連の処理を実行する機械のようなものです。渡す値を引数(ひきすう)、返される値を戻り値(もどりち)と呼びます。 但し関数によっては引数や戻り値の無い関数もあります。
関数の定義は以下のようにfunctionキーワードに続けて関数名と () で囲んで引数を指定し、その後にブロックを用いて実行する文を記述します。
構文:
function 関数名([引数[, ...]]) {
命令文
}
参考角括弧([])の表記はをオプションを意味し、[引数[, ...]]は、引数無し、複数の引数(カンマ区切り)も可能であることを示します。
注意関数名の最初の文字はアルファベットもしくはアンダースコア(_)のいずれかとなります。
関数の実行後に値を返す場合は、return文を使用します。
構文:
function 関数名([引数[, ...]]) {
命令文
return 値;
}
引数の無い関数の例)
//今日の日付を返す
function getToday() {
return date("Y/m/d");
}
引数のある関数の例)
//引数に渡された年の干支を返す
function getJuunishiForYear($year) {
$juunishi = array(
"子","丑","寅",
"卯","辰","巳",
"午","未","申",
"酉","戌","亥"
);
return $juunishi[(($year + 8) % 12)];
}
クラス
クラスは関連する変数と関数を纏めた部屋のようなものです。クラス内の引数はプロパティ、関数はメソッドと呼びます。 クラスは以下のようにclassキーワードに続けてクラス名を指定し、ブロック内に変数や関数定義を記述します。
構文:
class クラス名 {
変数
関数
関数
...
}
年を保持する簡単なクラスの例)
class Year {
public $year = "";
function getYear() {
return $this->year;
}
}
$year = new Year();
$year->year = 2020;
echo $year->getYear();
//「2020」が出力されます。
Note$thisはこのインスタンスのXXXである事を表します。例のようにクラス定義にもsetYear関数の引数にも同一変数名$yearが使用されています。前者はインスタンス変数、後者はローカル変数と呼びます。このような場合にインスタンス変数の$yearである事を明示する場合に$this->yearという記述方法を使用します。
アクセス修飾子
アクセス修飾子はプロパティやメソッドのアクセス許可の設定となり、以下のようにpublic、private、protectedの3種類があります。
public | 他のクラスなど、どこからのアクセスも許可します。 |
---|---|
private | 同じクラス内からのアクセスのみを許可します。 |
protected | 同じクラスもしくはその派生クラスからのアクセスのみを許可します。 |
アクセス修飾子は次に解説するクラスのカプセル化のために使用されます。
カプセル化
上記の例ではクラスインスタンスの$yearに直接値を代入しています。しかしこのクラスの仕様をよく理解していない人が誤って予期しない値(「2020年」など)を代入したとしたら、プログラムの誤動作の原因になりかねません。 その対策として、以下のようにプロパティへの直接アクセスを禁止し、代わりにプロパティに値を代入、取得するための専用のメソッドを実装する手法を取ります。これをカプセル化と呼びます。
カプセル化の例)
class Year {
private $year = ""; //アクセス修飾子はprivateなので外からアクセスできない
function setYear($year) {
//実際にはここで$year値の検証を実施
$this->year = $year;
}
function getYear() {
return $this->year;
}
}
$year = new Year();
$year->setYear(2020);
echo $year->getYear();
//「2020」が出力されます。
$year->year = 2021; //これはエラーとなる
Noteこのように値を代入するsetXXX()関数(セッター)と、値を取得するgetXXX()関数(ゲッター)のみをpublicにしてカプセル化したクラスを特にビーン(Bean)と呼びます。
継承
継承はあるクラス(基底クラス)を拡張して新たなクラス(派生クラス)を作成することを意味します。 派生クラスは基底クラスのプロパティやメソッドを継承し、それらを再定義(上書き)することも可能です。これをオーバーライドと呼びます。
クラスを継承するには、クラス名の後ろに extendsキーワードに続けて継承元となる基底クラス名を指定します。
Noteここで注意が必要なのは、基底クラスのプロパティは派生クラスから参照されるため、アクセス修飾子はprivateではなくprotectedにする必要がある点です。
基底クラスと派生クラスの例)
//基底クラス
class Year {
protected $year = ""; //アクセス修飾子をprotectedにする
function setYear($year) {
$this->year = $year;
}
function getYear() {
return $this->year;
}
}
//派生クラス
class YearAndMonth extends Year {
private $month = "";
function setMonth($month) {
$this->month = $month;
}
function getMonth() {
return $this->month;
}
}
//派生クラスを使用
$yearandmonth = new YearAndMonth();
$yearandmonth->setYear(2020); //基底クラスで実装したメソッド
$yearandmonth->setMonth(5); //派生クラスで実装したメソッド
echo $yearandmonth->getYear() . "年" . $yearandmonth->getMonth() . "月";
//「2020年5月」が出力されます。
インターフェイス
インターフェイスはクラスの基となる雛形(スケルトン)を意味します。雛形であるため、インターフェイスではプロパティやメソッドの実装は許可されず、定数とメソッドの宣言(プロトタイプ)のみが許可されています。
インターフェイスを定義するためには、interfaceキーワードに続けてインターフェイス名を指定し、ブロック内に定数や関数宣言を記述します。
構文:
interface インターフェイス名 {
定数
関数宣言
関数宣言
...
}
先程のYearクラスをインターフェイスとして定義すると以下のようになります。
インターフェイスの例)
//インターフェイス
interface YearInterface {
//メソッドはメソッド名の宣言のみ
function setYear($year);
function getYear();
}
インターフェイスを実装したクラスを作成するには、クラス名の後にimplementsキーワードに続けてインターフェイス名を指定します。
インターフェイスの実装例)
//インターフェイスを実装したクラス
class YearAndMonth implements YearInterface {
//変数は実装時に宣言と定義
protected $year = "";
private $month = "";
//メソッドは実装時に定義
function setYear($year) {
$this->year = $year;
}
function getYear() {
return $this->year;
}
//新たなメソッドを定義
function setMonth($month) {
$this->month = $month;
}
function getMonth() {
return $this->month;
}
}
//実装クラスの使用方法は継承クラスの場合と同じ
$yearandmonth = new YearAndMonth();
$yearandmonth->setYear(2020); //インターフェイスで宣言し、実装クラスで定義したメソッド
$yearandmonth->setMonth(5); //実装クラスで宣言・定義したメソッド
echo $yearandmonth->getYear() . "年" . $yearandmonth->getMonth() . "月";
//「2020年5月」が出力されます。
以上、PHPの関数とクラス、インターフェイスの解説でした。
公開日時:2020年06月01日 21:25:31