質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

348閲覧

【PHP】継承元も継承先も実行されてしまう 継承先だけ表示したい

sujico.net

総合スコア453

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/05/24 07:55

編集2018/05/24 09:04

解決済

[実行する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

何卒ご教示頂ければ幸いです。宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

LessonParentというクラスは存在しないですが、これは打ち間違いでしょうか。

そもそもparent.php内でnewして各機能を実行しているのでどちらも表示されますよ。

php

1 // クラスのインスタンス生成 2 $parent = new LessonParent(); 3 4 // POST値セット 5 $parent->setupPostParam(); 6 7 // ユーザ情報の表示 8 $parent->showUserInfo(); 9 10 // テーブルの生成 11 $parent->createTable();

通常Classは定義だけにしておき、利用は別のところからすべきです。

parent.php

php

1class Parent{ 2 //省略 3}

extend.php

php

1require_once '/XXXX/XX/XX/XXXX/XXXXXXXXXXX/parent.php'; 2class ExtendA extends Parent{ 3 //省略 4}

execute.php

php

1<html> 2 <head> 3 <meta charset="UTF-8"> 4 <title>継承</title> 5 6 <!-- スタイル読込 --> 7 <link rel="stylesheet" type="text/css" href="****.css"> 8 </head> 9 <body> 10<?php 11require_once '/XXXX/XX/XX/XXXX/XXXXXXXXXXX/extend.php'; 12// クラスのインスタンス生成 13$extendA = new ExtendA(); 14 15// POST値セット 16$extendA->setupPostParam(); 17 18// ユーザ情報の表示 19$extendA->showUserInfo(); 20 21// テーブルの生成 22$extendA->createTable(); 23?> 24</body> 25</html>

投稿2018/05/24 08:07

編集2018/05/24 08:13
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sujico.net

2018/05/24 08:17

例のコードをまで踏まえていただきありがとうございます。 大変参考になりましたので、ベストアンサーとさせて頂きます。 他の方もありがとうございました。
m.ts10806

2018/05/24 08:21

役割をなるべく分担・細分化させた方が管理もしやすくなります。
sujico.net

2018/05/24 08:22

わかりました! もっときれいに書けるよう頑張ります!ありがとうございます。
guest

0

rquire_onceで親クラスのファイルを読んでいるからだと思っているのですが、

読まなければそもそも継承できないのではないかと思っているため、完全に詰まってしまいました。

通常、PHPでクラスを書く場合は、クラスだけ1つのファイルにするものです。そうしないと、ちょうどこの例のように再使用に差し支えてしまいます。

投稿2018/05/24 08:05

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sujico.net

2018/05/24 08:07 編集

そもそも「継承するとしても、ファイルは分けない」というのがPHPでのお約束という認識であってますか?
maisumakun

2018/05/24 08:09 編集

いえ、そうではないです。出力部分を含まない「class {...}だけ」のファイルにしておけば、それをrequireしても全く問題ありません。
sujico.net

2018/05/24 08:15

あ、そういうことですね… インスタンスを生成した時点でclass内を実行してしまう → だから現状2回走るのは当然ということですね。 ありがとうございます。大変参考になりました。
guest

0

require_onceで親クラスのファイルを読んでいるからだと思っているのですが、
読まなければそもそも継承できないのではないかと思っているため、完全に詰まってしまいました。

requireは必要ですね。間違っていないと思います。
問題は、parent.phpには出力コードがあることだと思います。

parent.phpやextend.phpでは、<?phpから、 // クラスのインスタンス生成の直前までの、出力のないコードとし、画面はまた別のファイルにすることになるかと思います。

  • parent.php (<?php class LessonParent{ ... })
  • extends.php (<?php class ExtendA extends Parent{ ... })
  • index.php (htmlタグや、インスタンス作成以降の部分だけをもつ)

みたいな感じにすることになるかと思います

投稿2018/05/24 08:14

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問