PHPでclassを作成してみます。
classの作成
簡単なclassを定義して実行してみます。
classの定義
classは 「class クラス名 { 定義する内容 }」 の形で定義します。
class Greeting {
// プロパティの宣言
public $name;
public $word;
// メソッドの宣言
public function say() {
return "$this->name さん $this->word";
}
}
publicはプロパティ・メソッドのアクセス権を定義するキーワードで、どこからでもアクセス可能になります。
後ほど使用しますが、publicの他にもprotected・privateが指定できます。
classの実行
classを実行する場合、newキーワードを使ってインスタンスを作成します。
$rem = new Greeting(); $rem->name = 'レム'; $rem->word = 'おはよう'; echo $rem->say();
「->」はアロー演算子で、プロパティやメソッドにアクセスするのに使用します。
classの定義内で使用している「$this」はインスタンス自身で、今回の場合「$rem->say();」で呼ばれているので、$thisは$remになります。
class作成のデモページ
privateの指定
先ほどpublicで指定していた$wordを、privateで指定してみます。
privateを指定すると、そのclass内からしかアクセスできないようになります。
classの定義
$wordのアクセス権をprivateにして、初期値を設定してみます。
class Greeting {
// プロパティの宣言
public $name;
private $word = 'こんにちは';
// メソッドの宣言
public function say() {
return "$this->name さん $this->word";
}
}
classの実行
$ram = new Greeting(); $ram->name = 'ラム'; $ram->word = 'おはよう'; echo $ram->say();
「$ram->word = ‘おはよう’;」の部分で$wordにしようとしていますが、アクセス権がprivateになっているため、「Fatal error: Cannot access private property Greeting::$word」とエラーが出ます。
Greeting内に$wordを変更するメソッドを用意することで、$wordを変更することができます。
classの定義
class Greeting {
// プロパティの宣言
public $name;
private $word = 'こんにちは';
// メソッドの宣言
public function setWord($word) {
$this->word = $word;
}
public function say() {
return "$this->name さん $this->word";
}
}
classの実行
$ram = new Greeting();
$ram->name = 'ラム';
$ram->setWord('おはよう');
echo $ram->say();
$wordを変更することができました。
private指定のデモページ
コンストラクタの指定
__constructメソッドはインスタンス時に自動的に実行されるメソッドです。
classの定義
コンストラクタ内でsetWordメソッドを実行するようにしました。
class Greeting {
// プロパティの宣言
public $name;
private $word = 'こんにちは';
// メソッドの宣言
public function __construct($word) {
$this->setWord($word);
}
public function setWord($word) {
$this->word = $word;
}
public function say() {
return "$this->name さん $this->word";
}
}
classの実行
$felt = new Greeting('こんばんは');
$felt->name = 'フェルト';
echo $felt->say();
classの継承
既存のclassを元に新しいclassを作りたいとき、classを継承することができます。
継承は継承元のプロパティやメソッドが全て引き継がれます。
classの定義
Greetingを継承してSubaruというclassを作成します。
classの継承は「class クラス名 extends 継承元クラス名 { 定義する内容 }」の形で定義します。
class Greeting {
// プロパティの宣言
public $name;
private $word = 'こんにちは';
// メソッドの宣言
public function __construct($word) {
$this->word = $word;
}
public function setWord($word) {
$this->word = $word;
}
public function say() {
return "$this->name さん $this->word";
}
}
class Subaru extends Greeting {
// メソッドの宣言
public function dialouge() {
return 'ヴィクトリー!';
}
public function say() {
return "$this->name たん マジ天使";
}
}
sayメソッドはGreetingで宣言されているので上書き(オーバーライド)されます。
classの実行
$emilia = new Subaru('こんばんは');
$emilia->name = 'エミリア';
echo $emilia->dialouge();
echo $emilia->say();
protectedの指定
先ほど$wordをprivateに変更しましたが、今度は$nameをprotectedに変更してみます。
protectedを指定すると、そのclass内か継承元・継承先のclassからしかアクセスできないようになります。
classの定義
class Greeting {
// プロパティの宣言
protected $name = 'パック';
private $word = 'こんにちは';
// メソッドの宣言
public function __construct($word) {
$this->word = $word;
}
public function setWord($word) {
$this->word = $word;
}
public function say() {
return "$this->name さん $this->word";
}
}
class Subaru extends Greeting {
// メソッドの宣言
public function dialouge() {
return 'ヴィクトリー!';
}
public function say() {
return "$this->name たん マジ天使";
}
}
classの実行
$emilia = new Subaru('こんばんは');
$emilia->name = 'エミリア';
echo $emilia->dialouge();
echo $emilia->say();
「$emilia->name = ‘エミリア’;」の部分で$nameを変更しようとしていますが、アクセス権がprotectedになっているため、「Fatal error: Cannot access protected property Subaru::$name」とエラーが出ます。
privateのときと同様に、Subaru内に$nameを変更するメソッドを用意します。
classの定義
class Greeting {
// プロパティの宣言
protected $name = 'パック';
private $word = 'こんにちは';
// メソッドの宣言
public function __construct($word) {
$this->word = $word;
}
public function setWord($word) {
$this->word = $word;
}
public function say() {
return "$this->name さん $this->word";
}
}
class Subaru extends Greeting {
// メソッドの宣言
public function setName($name) {
$this->name = $name;
}
public function dialouge() {
return 'ヴィクトリー!';
}
public function say() {
return "$this->name たん マジ天使";
}
}
classの実行
$emilia = new Subaru('こんばんは');
$emilia->setName('エミリア');
echo $emilia->dialouge();
echo $emilia->say();
finalの指定
継承先でオーバーライドさせたくない場合、finalを指定します。
classの定義
class Greeting {
// プロパティの宣言
protected $name;
private $word = 'こんにちは';
// メソッドの宣言
public function __construct($word) {
$this->word = $word;
}
public function setWord($word) {
$this->word = $word;
}
final public function say() {
return "$this->name さん $this->word";
}
}
class Subaru extends Greeting {
// メソッドの宣言
public function setName($name) {
$this->name = $name;
}
public function dialouge() {
return 'ヴィクトリー!';
}
public function say() {
return "$this->name たん マジ天使";
}
}
classの実行
$emilia = new Subaru('こんばんは');
$emilia->setName('エミリア');
echo $emilia->dialouge();
echo $emilia->say();
Greetingでsayメソッドにfinalが指定されているため、「Cannot override final method Greeting::say()」とエラーが出ます。
【参考サイト】
コメントが承認されるまで時間がかかります。