解決済
[実行するForm] > [php] > [php(class)(parent)]
****************[↓継承↓]***
[実行するForm] > [php] > [php(class)(extend)]
このような構成にすると良い。
クラスはクラス、実行は実行で分けて考える。
以下、質問内容
経緯
PHP初心者です。
PHPで、親クラスを継承して子クラスを作成し、実行したいと考えています。
親クラスはとある動作をします。子クラスはその動作ちょっと違う動作をするといったイメージです。
親クラスはまず正常に動くようですが、子クラスは親クラスの結果と子クラスの結果両方出てしまいます。
rquire_onceで親クラスのファイルを読んでいるからだと思っているのですが、
読まなければそもそも継承できないのではないかと思っているため、完全に詰まってしまいました。
行いたいこと
・parent.php(親クラスを持つphpファイル)
…… POSTパラメータを受け取り、その値で九九表を表示する
・extend.php(子クラスを持つphpファイル)
…… POSTパラメータを受け取り、その値で九九表を表示する(値の出し方だけ親クラスと変えたい) 内、一部の関数は親クラスのものをそのまま使用する。
ソースコード
1.【parent.php】
PHP
1 2<html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>親パターン</title> 6 7 <!-- スタイル読込 --> 8 <link rel="stylesheet" type="text/css" href="****.css"> 9 </head> 10 <body> 11 12 <?php 13 14 //============================== 15 // 親クラス 16 //============================== 17 class Parent{ 18 19 //------------ 20 // ユーザ名称 21 //------------ 22 protected $userNm; 23 24 //------------ 25 // 縦値 26 //------------ 27 protected $tate; 28 29 //------------ 30 // 横値 31 //------------ 32 protected $yoko; 33 34 //--------------------- 35 // コンストラクタ 36 //--------------------- 37 public function __construct(){ 38 39 // 必要があれば実装 40 41 } 42 43 //------------------------------- 44 // POSTパラメータをセットする 45 //------------------------------- 46 public function setupPostParam(){ 47 48 $this->userNm= isset($_POST['userNm']) ? $_POST['userNm'] : ''; 49 $this->tate = isset($_POST['tate']) ? $_POST['tate'] : ''; 50 $this->yoko = isset($_POST['yoko']) ? $_POST['yoko'] : ''; 51 52 } 53 54 //---------------------- 55 // ユーザ情報を表示 56 //---------------------- 57 public function showUserInfo(){ 58 59 print " $this->userNm さんの指定した縦:横の値は $this->tate : $this->yoko です。<br>"; 60 61 } 62 63 //--------------------- 64 // 計算結果表を返す 65 //--------------------- 66 public function createTable(){ 67 68 print '<table border="10" cellspacing="1" cellpadding="8">'; 69 70 for($i=1; $i <= $this->tate; $i++){ 71 print '<tr>'; 72 for($j=1; $j <= $this->yoko; $j++){ 73 74 // 偶数の時True 奇数の場合False 75 $dispNum = ($i * $j); 76 $isEven = $this->checkNumAsEvenOrOdd($dispNum); 77 78 if($isEven){ 79 // 偶数の場合のみ着色(タグ直書きしてます) 80 print '<td align="center" bgcolor="#ffffcc"><font color="red">'; 81 print $dispNum; 82 print '</font></td>'; 83 }else{ 84 print '<td align="center">'; 85 print $dispNum; 86 print '</td>'; 87 } 88 } 89 print '</tr>'; 90 } 91 print '</table>'; 92 } 93 94 //---------------------------------------------------- 95 // 偶数奇数を判定する 96 // 偶数.T / 奇数.F を返す 97 //---------------------------------------------------- 98 public function checkNumAsEvenOrOdd($pNum){ 99 100 try{ 101 if(($pNum % 2) == 0){ 102 // 2で割り切れる場合は偶数と判断 103 return true; 104 105 }else{ 106 return false; 107 } 108 109 }catch(Exception $ex){ 110 // 失敗時はメッセージ出力後スクリプトを終了する 111 die("[偶数奇数判定時エラー] $ex->getMessage()"); 112 } 113 } 114 } 115 116 // クラスのインスタンス生成 117 $parent = new LessonParent(); 118 119 // POST値セット 120 $parent->setupPostParam(); 121 122 // ユーザ情報の表示 123 $parent->showUserInfo(); 124 125 // テーブルの生成 126 $parent->createTable(); 127 128 ?> 129 </body> 130</html> 131
【実行結果】
作成ユーザ: xxxxxさん 2018年xx月xx日
xxxxx さんの指定した縦:横の値は 3 : 9 です。
|1|2|3|4|5|6|7|8|9|
|:--|:--:|--:|
|2|4|6|8|10|12|14|16|18|
|3|6|9|12|15|18|21|24|27|
2.【extend.php】
PHP
1 2<html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>継承</title> 6 7 <!-- スタイル読込 --> 8 <link rel="stylesheet" type="text/css" href="****.css"> 9 </head> 10 <body> 11 12 <?php 13 14 require_once '/XXXX/XX/XX/XXXX/XXXXXXXXXXX/parent.php'; 15 16 //=========================================== 17 // 親のクラスを継承したクラス 18 //=========================================== 19 class ExtendA extends Parent{ 20 21 //---------------------- 22 // ユーザ情報を表示 23 //---------------------- 24 public function showUserInfo(){ 25 print parent::showUserInfo() . "<br>※この1マスの値は縦×横<u>×2</u>によって出力されています。"; 26 } 27 28 //--------------------- 29 // 計算結果表を返す 30 //--------------------- 31 public function createTable(){ 32 33 print '<table border="10" cellspacing="1" cellpadding="8">'; 34 35 for($i=1; $i <= $this->tate; $i++){ 36 print '<tr>'; 37 for($j=1; $j <= $this->yoko; $j++){ 38 39 // 偶数の時True 奇数の場合False 40 // 【ここを継承したときは変更したい】 41 $dispNum = ($i * $j) * 2; 42 $isEven = $this->checkNumAsEvenOrOdd($dispNum); 43 44 if($isEven){ 45 // 偶数の場合のみ着色(タグ直書きしてます) 46 print '<td align="center" bgcolor="#ffffcc"><font color="red">'; 47 print $dispNum; 48 print '</font></td>'; 49 }else{ 50 print '<td align="center">'; 51 print $dispNum; 52 print '</td>'; 53 } 54 } 55 print '</tr>'; 56 } 57 print '</table>'; 58 } 59 60 } 61 62 63 // クラスのインスタンス生成 64 $extendA = new ExtendA(); 65 66 // POST値セット 67 $extendA->setupPostParam(); 68 69 // ユーザ情報の表示 70 $extendA->showUserInfo(); 71 72 // テーブルの生成 73 $extendA->createTable(); 74 75 76 ?> 77 78 </body> 79</html> 80
【実行結果】
作成ユーザ: xxxxxさん 2018年xx月xx日
xxxxx さんの指定した縦:横の値は 3 : 9 です。
|1|2|3|4|5|6|7|8|9|
|:--|:--:|--:|
|2|4|6|8|10|12|14|16|18|
|3|6|9|12|15|18|21|24|27|
作成ユーザ: xxxxxさん 2018年xx月xx日
xxxxx さんの指定した縦:横の値は 3 : 9 です。
※この1マスの値は縦×横×2によって出力されています。
|2|4|6|8|10|12|14|16|18|
|:--|:--:|--:|
|4|8|12|16|20|24|28|32|36|
|6|12|18|24|20|30|36|42|48|
extend.phpの理想の実行結果
作成ユーザ: xxxxxさん 2018年xx月xx日
xxxxx さんの指定した縦:横の値は 3 : 9 です。
※この1マスの値は縦×横×2によって出力されています。
|2|4|6|8|10|12|14|16|18|
|:--|:--:|--:|
|4|8|12|16|20|24|28|32|36|
|6|12|18|24|20|30|36|42|48|
環境
開発パソコン Windows7
ブラウザ GoogleChrome
Webサーバ Apache
PHP バージョン5.3
何卒ご教示頂ければ幸いです。宜しくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/24 08:17
2018/05/24 08:21
2018/05/24 08:22