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

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

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

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

オブジェクト指向

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

Q&A

解決済

2回答

3486閲覧

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

singlestroke

総合スコア68

PHP

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

オブジェクト指向

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

0グッド

0クリップ

投稿2016/04/24 14:30

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

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

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

全コードは下記です。

Bbs.php

php

1<?php 2class Bbs { 3 4 const BBS_FILE = './bbs.dat'; 5 6 private $name = ''; 7 private $comment = ''; 8 9 // 名前 10 public function setName($name) { 11 $this->name = (string)filter_var($name); 12 } 13 // コメント 14 public function setComment($comment) { 15 $this->comment = (string)filter_var($comment); 16 } 17 // エンコード 18 public static function encode($str) { 19 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 20 } 21 // データ書き込み 22 public function writeData() { 23 $data = []; 24 $data[] = self::encode($this->name); 25 $data[] = self::encode($this->comment); 26 $line = implode(',', $data)."\r\n"; 27 $fp = fopen( self::BBS_FILE, 'a' ); 28 fputs ( $fp, $line ); 29 fclose( $fp ); 30 } 31 // csvデータ内容を取得 32 public function getFile() { 33 if (file_exists( self::BBS_FILE ) === TRUE ) { 34 $fp = fopen( self::BBS_FILE, 'r' ); 35 $data = array(); 36 while ( $row = fgetcsv($fp) ) { 37 $data[] = $row; 38 } 39 fclose($fp); 40 } 41 return $data; 42 } 43 // 取得したcsvデータを表示 44 function showData() { 45 $data = $this->getFile(); 46 foreach ( $data as $row ) { 47 echo "<dt>投稿者:".$row[0]."</dt>"; 48 echo "<dd>コメント:".$row[1]."</dd>"; 49 } 50 } 51} 52?>

index.php

php

1<?php 2require_once 'class/Bbs.php'; 3 4$bbs = new Bbs(); 5 6foreach (['action', 'name', 'comment'] as $key) { 7 $p[$key] = (string) filter_input(INPUT_POST, $key); 8} 9 10if ( ($p['action'] == 'write' ) && isset($p['name']) && isset($p['comment']) ) { 11 $bbs->setName($p['name']); 12 $bbs->setComment($p['comment']); 13 $bbs->writeData(); 14} 15 16?> 17<form action="" method="post"> 18 <p>名前:<input type="text" name="name" /></p> 19 <p>コメント:<input type="text" name="comment" /></p> 20 <p><button type="submit" name="action" value="write">書き込む</button></p> 21</form> 22 23<dl> 24<?php 25$bbsData = $bbs->showData(); 26?> 27</dl>

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

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

php

1foreach (['action', 'name', 'comment'] as $key) { 2 $p[$key] = (string) filter_input(INPUT_POST, $key); 3} 4 5if ( ($p['action'] == 'write' ) && isset($p['name']) && isset($p['comment']) ) { 6 $bbs->setName($p['name']); 7 $bbs->setComment($p['comment']); 8 $bbs->writeData(); 9}

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

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

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

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

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

guest

回答2

0

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

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

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

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

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

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

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

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

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

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

投稿2016/04/24 17:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

singlestroke

2016/04/25 05:52

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

0

ベストアンサー

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

投稿2016/04/24 18:28

KatsukiSugiura

総合スコア335

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

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

KatsukiSugiura

2016/04/24 21:24

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

2016/04/25 05:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問