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

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

ただいまの
回答率

90.61%

  • PHP

    19914questions

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

  • CentOS

    2648questions

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

  • Apache

    1781questions

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

  • Chrome

    591questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 170

HAC

score 58

 解決済

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

<html>
    <head>
        <meta charset="UTF-8">
        <title>親パターン</title>

        <!-- スタイル読込 -->
        <link rel="stylesheet" type="text/css" href="****.css">
    </head>
    <body>

        <?php

        //==============================
        // 親クラス
        //==============================
        class Parent{

            //------------
            // ユーザ名称
            //------------
            protected $userNm;

            //------------
            // 縦値
            //------------
            protected $tate;

            //------------
            // 横値
            //------------
            protected $yoko;

            //---------------------
            // コンストラクタ
            //---------------------
            public function __construct(){

                // 必要があれば実装

            }

            //-------------------------------
            // POSTパラメータをセットする
            //-------------------------------
            public function setupPostParam(){

                $this->userNm= isset($_POST['userNm']) ? $_POST['userNm'] : '';
                $this->tate = isset($_POST['tate']) ? $_POST['tate'] : '';
                $this->yoko = isset($_POST['yoko']) ? $_POST['yoko'] : '';

            }

            //----------------------
            // ユーザ情報を表示
            //----------------------
            public function showUserInfo(){

                print " $this->userNm さんの指定した縦:横の値は $this->tate : $this->yoko です。<br>";

            }

            //---------------------
            // 計算結果表を返す
            //---------------------
            public function createTable(){

                print '<table border="10" cellspacing="1" cellpadding="8">';

                for($i=1; $i <= $this->tate; $i++){
                    print '<tr>';
                    for($j=1; $j <= $this->yoko; $j++){

                        // 偶数の時True 奇数の場合False
                        $dispNum = ($i * $j);
                        $isEven = $this->checkNumAsEvenOrOdd($dispNum);

                        if($isEven){
                            // 偶数の場合のみ着色(タグ直書きしてます)
                            print '<td align="center" bgcolor="#ffffcc"><font color="red">';
                            print $dispNum;
                            print '</font></td>';
                        }else{
                            print '<td align="center">';
                            print $dispNum;
                            print '</td>';
                        }
                    }
                    print '</tr>';
                }
                print '</table>';
            }

            //----------------------------------------------------
            // 偶数奇数を判定する
            // 偶数.T / 奇数.F を返す
            //----------------------------------------------------
            public function checkNumAsEvenOrOdd($pNum){

                try{
                    if(($pNum % 2) == 0){
                        // 2で割り切れる場合は偶数と判断
                        return true;

                    }else{
                        return false;
                    }

                }catch(Exception $ex){
                    // 失敗時はメッセージ出力後スクリプトを終了する
                    die("[偶数奇数判定時エラー] $ex->getMessage()");
                }
            }
        }

        // クラスのインスタンス生成
        $parent = new LessonParent();

        // POST値セット
        $parent->setupPostParam();

        // ユーザ情報の表示
        $parent->showUserInfo();

        // テーブルの生成
        $parent->createTable();

        ?>
    </body>
</html>


【実行結果】
作成ユーザ: 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】

<html>
    <head>
        <meta charset="UTF-8">
        <title>継承</title>

        <!-- スタイル読込 -->
        <link rel="stylesheet" type="text/css" href="****.css">
    </head>
    <body>

    <?php

    require_once '/XXXX/XX/XX/XXXX/XXXXXXXXXXX/parent.php';

        //===========================================
        // 親のクラスを継承したクラス
        //===========================================
        class ExtendA extends Parent{

            //----------------------
            // ユーザ情報を表示
            //----------------------
            public function showUserInfo(){
                print parent::showUserInfo() . "<br>※この1マスの値は縦×横<u>×2</u>によって出力されています。";
            }

            //---------------------
            // 計算結果表を返す
            //---------------------
            public function createTable(){

                print '<table border="10" cellspacing="1" cellpadding="8">';

                for($i=1; $i <= $this->tate; $i++){
                    print '<tr>';
                    for($j=1; $j <= $this->yoko; $j++){

                        // 偶数の時True 奇数の場合False
                        // 【ここを継承したときは変更したい】
                        $dispNum = ($i * $j) * 2;
                        $isEven = $this->checkNumAsEvenOrOdd($dispNum);

                        if($isEven){
                            // 偶数の場合のみ着色(タグ直書きしてます)
                            print '<td align="center" bgcolor="#ffffcc"><font color="red">';
                            print $dispNum;
                            print '</font></td>';
                        }else{
                            print '<td align="center">';
                            print $dispNum;
                            print '</td>';
                        }
                    }
                    print '</tr>';
                }
                print '</table>';
            }

        }


        // クラスのインスタンス生成
        $extendA = new ExtendA();

        // POST値セット
        $extendA->setupPostParam();

        // ユーザ情報の表示
        $extendA->showUserInfo();

        // テーブルの生成
        $extendA->createTable();


    ?>

    </body>
</html>

【実行結果】
作成ユーザ: 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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+4

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

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

        // クラスのインスタンス生成
        $parent = new LessonParent();

        // POST値セット
        $parent->setupPostParam();

        // ユーザ情報の表示
        $parent->showUserInfo();

        // テーブルの生成
        $parent->createTable();

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

parent.php

class Parent{
 //省略
}


extend.php

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


execute.php

<html>
    <head>
        <meta charset="UTF-8">
        <title>継承</title>

        <!-- スタイル読込 -->
        <link rel="stylesheet" type="text/css" href="****.css">
    </head>
    <body>
<?php
require_once '/XXXX/XX/XX/XXXX/XXXXXXXXXXX/extend.php';
// クラスのインスタンス生成
$extendA = new ExtendA();

// POST値セット
$extendA->setupPostParam();

// ユーザ情報の表示
$extendA->showUserInfo();

// テーブルの生成
$extendA->createTable();
?>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/24 17:17

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

    キャンセル

  • 2018/05/24 17:21

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

    キャンセル

  • 2018/05/24 17:22

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

    キャンセル

+4

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/24 17:07 編集

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

    キャンセル

  • 2018/05/24 17:08 編集

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

    キャンセル

  • 2018/05/24 17:15

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

    キャンセル

+3

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タグや、インスタンス作成以降の部分だけをもつ)
    みたいな感じにすることになるかと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    CakePHP2:テーブルモデルの共有は可能?

    接頭辞のみが異なる、まったく同じテーブル構成のテーブル[接頭辞]_applesがあります。 これらのテーブルで同じテーブルモデルの共有は可能でしょうか? 現在、以下のように

  • 解決済

    mysqlからとってきたデータをhtmlのテーブルのように整列させたい。

    前提・実現したいこと PHPでSQLよりデータを抽出し、htmlのテーブルのような形に成形し出したいと思っています。 現在は<pre>を使用し見やすい形にはなっているのです

  • 解決済

    SESSIONで掲示板みたいにしたいのです。

    セッションで掲示板みたいにしたいのですが、 (現在セッションの配列について勉強中でして、自分だけが見られればOKです。以下は勉強のためのコードです) フォームを送信したら配列の中身

  • 受付中

    レイアウト崩れの調整の方法を教えてください

    昔書いたHTMLがあるのですが、レイアウトが崩れるためIEの互換オプションを利用していますが、 互換オプションを利用しなくても崩れないのとCrome/IEどちらでも見れるように変え

  • 解決済

    テーブルのデータが正しく表示されない

    以下のURLを参考にし、テーブルの表示を行おうとしたところ、 テーブルで表示するデータの内容が表示されず、 "._hs($CN->GetFieldData('mes_type'))

  • 解決済

    javaでHTMLファイルを分析

    javaでHTMLのファイルを読みだして財務分析をして流動比率というものを調べたいのですが普通に計算したほうが早いのはわかっているのですが、javaでやりたいです! これは読み

  • 解決済

    tableでthとtdの位置がずれる

    いつもお世話になっております。 動作環境 jQuwey:jquery-3.3.1.min Materialize: 1.0.0-beta PHP7.2.4 以下のコードで書

  • 解決済

    $thisが指すクラスがどれかわかりません。

    下記のコードを実行すると、ブラウザには"さん、こんにちは。"という表示になりましたが、なぜその表示になるのかわからないので教えていただけないでしょうか。 想定していたのは、"ゲスト

同じタグがついた質問を見る

  • PHP

    19914questions

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

  • CentOS

    2648questions

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

  • Apache

    1781questions

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

  • Chrome

    591questions

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