[PHP] インタフェースと抽象クラス、クラス継承、parent、this
こんにちは。明月です。
前述でPHPのClassを宣言して使う方法に関して説明しました。
link - [PHP] functionとclass使用方法、アクセス修飾子、そしてstatic
PHPもクラスがあるのでインタフェース(interface)と抽象クラス(abstract class)があります。
個人的な考えはPHPにはデータタイプの指示子がないのでインタフェース役がコンパイル言語(javaやC#)より活用性が少ないではないかと思います。筆者も実際にPHPでInterfaceを使ったことがないですね。
でも抽象クラスはよく使います。
<?php
$title = "title";
// インタフェース
interface ITest {
function run();
}
// 抽象クラス(インタフェースITestを継承した。)
abstract class AbstractTest implements ITest {
// ITest インタフェースを継承したので、run関数を必ず宣言しなければならない。
public function run() {
return $this->print();
}
// 抽象メソッド
protected abstract function print();
}
// 抽象クラス
class Test extends AbstractTest {
// AbstractTest 抽象クラスを継承したので「print」関数を必ず宣言しなければならない。
protected function print() {
return "Hello world";
}
}
$obj = new Test;
?>
<!DOCTYPE html>
<html>
<head>
<title>
<?=$title?>
</title>
</head>
<body>
<?=$obj->run()?>
</body>
</html>
上の例をみればITestインタフェースとAbstract抽象クラスとTestクラスがあります。
依存層は「ITest -> AbstractTest -> Test」でなっています。それでTestを宣言してrunを実行すればAbstractTestのrunメソッドが実行してrunメソッド中では派生クラスの「print()」関数を呼び出す結果は「Helloworld」になります。
ここでparentとthisの概念ですね。
<?php
$title = "title";
interface ITest {
function run();
}
abstract class AbstractTest implements ITest {
private $data;
public function run() {
// $thisは実行しているクラスのメンバータイプ、つまりprint()関数が呼び出すこと
return $this->print();
}
protected function setData($data) {
// $this->dataはメンバー変数dataで$dataはパラメータdataだ。
$this->data = $data;
}
protected function getData() {
return $this->data;
}
protected abstract function print();
}
class Test extends AbstractTest {
protected function print() {
// 上位クラスのsetDataを呼び出す。
// 参考でsetDataはprotectedタイプなので、派生クラスだけで参照が可能して外部では参照が不可能。
parent::setData("Hello world");
return parent::getData();
}
}
$obj = new Test;
?>
<!DOCTYPE html>
<html>
<head>
<title>
<?=$title?>
</title>
</head>
<body>
<?=$obj->run()?>
</body>
</html>
$thisの場合は実行しているクラスのメンバーをさしています。すなわち、メンバー変数か関数を指しています。$thisの場合はC++のポインタの形で矢印で指示(->)をしています。
しかしparentの場合はparent::の形で指しています。&parent->の形ではエラーが発生します。文法が面白いですね。
上の例はobj->runを通ってAbstractTestのrunが呼び出してrun関数で抽象メソッドprintが呼び出します。
抽象メソッドprintが呼び出したのでTestクラスのprintが呼び出してprint関数で上位クラスのsetDataにデータを入れてgetDataでデータを持ってきて変換する形です。
私がデータを「Hello world」を入れたので結果は「Hello world」が出ます。
- [PHP] 分散設定ファイル(.htaccess) 使用方法2020/01/28 03:00:00
- [PHP] データベース(mariaDB)を連結して使う方法2020/01/24 03:00:00
- [PHP] IOに関して2020/01/23 03:00:00
- [PHP] requireとinclude、そして「@」の使用方法2020/01/22 03:00:00
- [PHP] Fatal及びNotice,、Warningメッセージ処理する方法2020/01/19 03:00:00
- [PHP] xDebug設定する方法2020/01/18 03:00:00
- [PHP] $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv())2020/01/17 03:00:00
- [PHP] データ確認関数(var_dump, debug_zval_dump, print_r)2020/01/16 03:00:00
- [PHP] 例外処理(try ~ catch ~ finally)2020/01/15 03:00:00
- [PHP] 配列とリスト(list)2020/01/14 03:00:00
- [PHP] インタフェースと抽象クラス、クラス継承、parent、this2020/01/13 03:00:00
- [PHP] functionとclass使用方法、アクセス修飾子、そしてstatic2020/01/09 23:35:27
- [PHP] 基本ページ作成方法と変数使用方法2020/01/06 23:44:20
- [PHP] Composer設定2019/12/27 08:49:09
- [PHP] PHP 開発環境設定とEclipse(IDE)の設定2019/12/26 07:36:47
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07