PHPでclassを作成する

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();

class継承のデモページ
 

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();

protected指定のデモページ
 

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()」とエラーが出ます。
 

【参考サイト】

 

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2024年11月
 12
3456789
10111213141516
17181920212223
24252627282930