前回の記事で人の名前、年齢をメンバに格納しました。クラス内部のメンバ・メソッドをを自由に使えました。ですが、クラスの外部から名前、年齢を自由に設定できると、困ることもあります。年齢や名前に誤った値を設定すると不具合がでるかもしれません。年齢で0歳と設定されたりする可能性もあります。こういう状況を避けるためメンバは、
クラス外部から直接アクセスできないように
と設定するのが普通です。クラス外部から直接できないようにするにはメンバにprivateという指定を付します。
class Customer
{
//クラスの外部からアクセスできないようにする
private $name = "";
private $age = 20;
}
上記のように書くと、$customer->nameといったようにして
アクセスすることができなくなります。
publicで公開する
privateをメンバに設定して、値を代入できないと困るので、
メンバ変数には、正しい値を設定する為のメソッドを用意します。
Customerクラスに対して名前を設定するのが、setName()、
年齢を設定するのが、setAge()を定義して、クラスの外部から
アクセスします。
メソッドには、メンバ変数に正しい値をが設定されるように、
値をチェックする機能も組み込みます。設定する年齢を
18歳~65歳に限定するようにし、それ以外の値が設定されると
エラーを表すー1が設定されるようにします。
public function setAge($a)
{
if( $a >= 18 && $a <= 65 ){
$this-> = $a;
}else{
$this->age = -1;
}
}
setName(),setAge()メソッドには、publicを
付しました。publicは
クラスの外部からアクセスできる
ことを表します。正しい値を設定するメソッドをクラスの外部から
アクセスできるようにしています。
publicやprivateはアクセス演算子(access identifier)といい
これは、メンバ変数・メソッドにアクセス可能な範囲を表しています。
メソッドにアクセス演算子を付けない場合は、
publicとして指定されたものとして扱います。
アクセス演算子を使うことで、メンバ変数に直接アクセス
できないようにして、値をチェックするメソッドだけを公開ことができます。
これにより、クラス内部に意図しない値が代入されるのを未然に防ぎます。
クラス内部のデータを保護することを、カプセル化(encapsulation)と
いいます。
サンプルコードの実行結果はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<!doctype html> <html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" href="../style.css"> </head> <body> <?php //クラスの定義 class Customer { //メンバ変数宣言 private $name = ""; private $age = 30; //メソッド定義 function getName(){ return $this->name; } function getAge(){ return $this->age; } function setName($n){ $this->name = $n; } function setAge($a){ if( $a >= 18 && $a <= 65 ){ $this->age = $a; }else{ $this->age = -1; } } } ?> <?php //定義したオブジェクトを生成する $cu = new Customer; //メンバ変数に値を代入する $cu->setName("加藤"); $cu->setAge(35); //代入した変数を出力する echo "名前:" . $cu->getName(); echo "<br>"; echo "歳:" . $cu->getAge(); echo "<hr><br>"; ?> </body> </html> |
今回のコードでは、privateを付けてメンバ変数には直接、値を代入することはできません。その代り、アクセス演算子をつけていないメソッド(publicのメソッド)を使い、メンバ変数に値をだいにゅうしています。年齢を18歳から65歳に設定し、メンバ変数$ageに意図しない値が代入されるのを防いでいます。
オブジェクト指向
特定のモノを表すオブジェクトに着目して、プログラミングをすることをオブジェクト指向といいます。カプセル化はオブジェクト指向の重要な特徴のひとつです。