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

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

ただいまの
回答率

90.48%

  • PHP

    24459questions

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

  • オブジェクト指向

    331questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

phpでクラスを使用した掲示板

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,059

singlestroke

score 40

php のクラスを勉強中の者です。

勉強のため、簡単な掲示板をクラスを使用して作れないかと思い作ってみました。一応、書き込みができるよう動作はしています。

しかしクラスの使い方というか、使うための考え方というか本質的なところがあまりよくつかめていません。

全コードは下記です。

Bbs.php

<?php
class Bbs {

    const BBS_FILE = './bbs.dat';

    private $name = '';
    private $comment = '';

    // 名前
    public function setName($name) {
        $this->name = (string)filter_var($name);
    }
    // コメント
    public function setComment($comment) {
        $this->comment = (string)filter_var($comment);
    }
    // エンコード
    public static function encode($str) {
        return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
    }
    // データ書き込み
    public function writeData() {
        $data = [];
        $data[] = self::encode($this->name);
        $data[] = self::encode($this->comment);
        $line = implode(',', $data)."\r\n";
        $fp = fopen( self::BBS_FILE, 'a' );
        fputs ( $fp, $line );
        fclose( $fp );
    }
    // csvデータ内容を取得
    public function getFile() {
        if (file_exists( self::BBS_FILE ) === TRUE ) {
            $fp = fopen( self::BBS_FILE, 'r' );
            $data = array();
            while ( $row = fgetcsv($fp) ) {
                $data[] = $row;
            }
            fclose($fp);
        }
        return $data;
    }
    // 取得したcsvデータを表示
    function showData() {
        $data = $this->getFile();
        foreach ( $data as $row ) {
            echo "<dt>投稿者:".$row[0]."</dt>";
            echo "<dd>コメント:".$row[1]."</dd>";
        }
    }
}
?>


index.php

<?php
require_once 'class/Bbs.php';

$bbs = new Bbs();

foreach (['action', 'name', 'comment'] as $key) {
    $p[$key] = (string)  filter_input(INPUT_POST, $key);
}

if ( ($p['action'] == 'write' ) && isset($p['name']) && isset($p['comment']) ) {
    $bbs->setName($p['name']);
    $bbs->setComment($p['comment']);
    $bbs->writeData();
}

?>
<form action="" method="post">
    <p>名前:<input type="text" name="name" /></p>
    <p>コメント:<input type="text" name="comment" /></p>
    <p><button type="submit" name="action" value="write">書き込む</button></p>
</form>

<dl>
<?php
$bbsData = $bbs->showData();
?>
</dl>

間違えている部分、こうした方がよいなどといった部分がありましたらご指摘いただけますと幸いです。

また、下記の部分もクラスにすべきなのか(したかったらすればよいというのはそうなんですが)、するとしたらどのように書いたらよいのでしょうか。

foreach (['action', 'name', 'comment'] as $key) {
    $p[$key] = (string)  filter_input(INPUT_POST, $key);
}

if ( ($p['action'] == 'write' ) && isset($p['name']) && isset($p['comment']) ) {
    $bbs->setName($p['name']);
    $bbs->setComment($p['comment']);
    $bbs->writeData();
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

クラスの学習としては、掲示板というのはあまりいい題材とは言えない気がしますが、学習中ですからね…

間違えている部分、こうした方がよいなどといった部分がありましたらご指摘いただけますと幸いです。 

プログラミングには、正解とか不正解などありません。作成者が意図した動きなら正解ですし、動かないプログラムは、そもそもプログラムではないですね。

動いている以上、「間違えている部分」はないわけですから、おこがましくて「これが正解」などと偉そうに回答はできません…。

しかしクラスの使い方というか、使うための考え方というか本質的なところがあまりよくつかめていません。

学習中ということですので、あえて「こうしたら?」という回答はちょっと差し控えて、「なぜこういう実装にしたの?」と思う部分をあげます。あなたにとってその方が深く理解できるのではないかと思うからです。
また、一字一句に説明できない記述があってはいけないと思うからです。

質問1
・クラス Bbs において、実装されたメソッドには、static を宣言したものと、そうでないものがありますが、その使い分けの意図はなんですか?

質問2
・全て何も値がセットされていなくても、書き込みが可能なようですが、それは意図した動きですか?

質問3
・改行コードがユーザーにより投稿されたデータに含まれていた場合、その考慮はされていますか?

質問4
・<script> タグの書き込みも可能なようですが、それは意図した動作ですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/25 14:52

    勉強になりました。ありがとうございました。

    キャンセル

checkベストアンサー

-1

クラスは同じような処理を汎用的に利用する際に利用するような気がするので、クラスを利用する為にシステムを考案するより、考案したシステムに対してクラスを当てはめると言う考え方のが良いのではないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/25 03:30

    状況によって振り分ける!

    キャンセル

  • 2016/04/25 06:24

    ドラクエ作ると良いかもしれません。

    キャンセル

  • 2016/04/25 14:54

    考え方が逆でした。。状況によっていろいろ分岐があるものを題材に作ってみようと思います。ありがとうございます。

    キャンセル

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

  • PHP

    24459questions

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

  • オブジェクト指向

    331questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。