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()」とエラーが出ます。
【参考サイト】
コメントが承認されるまで時間がかかります。