[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 09:19 / Filesize : 227 KB / Number-of Response : 595
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

PHPでOOP



1 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:35:52 ID:???]
PHPを使ってプログラミングするとき、
プロシージャ指向(手続き型、構造化プログラミング)でもできますが、
オブジェクト指向を使った場合の恩恵を享受するために、
PHPでオブジェクト指向プログラミングの勉強をしてみましょう。

<目的>
PHP5でオブジェクト指向プログラミングを行なうための知識を習得する。
(PHP4のOOPもOK、このスレが1000に行く前にPHP6が出たらPHP6のOOPもOK)

<方向性>
・このスレは、プログラミング初心者、PHP初心者の勉強の場として利用することを前提にします。
・PHPのOOPの話題に限定します。
(Ruby、Python、Javaなど他言語のOOPについては、その言語のスレッドでお願いします。)
・PHPのOOP学習に役立つ本、WEBサイトの紹介をお願いします。

<その他>
・略記は、「OO」=「オブジェクト指向」、「OOP」=「オブジェクト指向プログラミング」でお願いします。
・質問をする人はなるべくトリップを付けましょう。
・荒らし、煽り、叩き、気違いは無視・無干渉でお願いします。

このスレで、今日から貴方もOOP!!!\(^o^)/

2 名前:nobodyさん mailto:sage [2007/02/23(金) 13:38:15 ID:???]
初心者にもわかるようにメリットぐらいかいてよ・・。

3 名前:nobodyさん mailto:sage [2007/02/23(金) 13:41:55 ID:???]
インスタンスとインヘリタンスがまぎわらしい(なぜか変換・・・

4 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:42:26 ID:???]
オブジェクトと関数の本質的な違いと使い分け
ttp://d.hatena.ne.jp/toku-hiro/20060826

var とか this って何だ?
ttp://d.hatena.ne.jp/toku-hiro/20060902

アクセサメソッド
ttp://d.hatena.ne.jp/toku-hiro/20061022

継承、 オブジェクトコンポジション
ttp://d.hatena.ne.jp/toku-hiro/20061129
ttp://d.hatena.ne.jp/toku-hiro/20061203


5 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:51:33 ID:???]
>>2
ttp://d.hatena.ne.jp/toku-hiro/20060826
この説明見てなるほどな〜〜〜!と思いました^^

>(1) オブジェクトと関数の本質的な違いと使い分け
>コーディング上の本質的な違いは「変数を保持できるか否か」に尽きます!
>関数を定義するときには、(グローバル変数を除き)引数として関数の外部から渡し、return で返すことしかできませんが、クラスは内部で変数を定義でき、クラスの実体のオブジェクトはどこからでも内部変数を引き出すことができます。
>定義関数の return であれもこれも返したいのにうまく返せず、煩雑な配列に格納して返す…といったことが減ると思います。
>あれもこれも引数として渡したいとき、または、あれもこれもreturnしたいときは、関数よりクラスの方が遥かに簡単です。

「クラス」という仕組は便利そうですね。クラスを考えた奴、偉い!


6 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:54:53 ID:???]
>>3
なんかプログラミングって、カタカナ用語がたくさん登場しますよね><
クラスって聞いたら学校の「教室」を連想しちゃう><


7 名前:nobodyさん mailto:sage [2007/02/23(金) 15:12:49 ID:???]
Webでオブジェクト指向
pc10.2ch.net/test/read.cgi/php/1133489897/

こっちじゃ何故駄目なんだ?

8 名前:nobodyさん mailto:sage [2007/02/23(金) 16:25:04 ID:???]
>>1
>>5
自作自演乙w


9 名前:nobodyさん mailto:sage [2007/02/23(金) 16:52:36 ID:???]
トリップ出してるのに自作自演もくそもあるのかw

10 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/23(金) 19:44:43 ID:???]
>>7
>Webでオブジェクト指向
>pc10.2ch.net/test/read.cgi/php/1133489897/
>こっちじゃ何故駄目なんだ?

そっちも参考に眺めています。
あと、プログラマー板にもあるオブジェクト指向関係のスレもちょっと眺めています。

PHPに的を絞った情報が欲しいので、専用のスレを立ててみました。
もちろん、JavaやRuby、Pythonとかも使えればいいけど、そこまで手を広げる時間がないので、とりあえず今の段階ではPHPで勉強。
PHPを使っていて、オブジェクト指向プログラミングのやり方を勉強したい人がいたら一緒に勉強していきましょう。
よろしく(・∀・)



11 名前:nobodyさん mailto:sage [2007/02/23(金) 21:14:52 ID:???]
>>9
ちげーよ
自分のサイトの宣伝して
「この説明見てなるほどな〜〜〜!と思いました^^」
と書いてるところがだよ

12 名前:nobodyさん mailto:sage [2007/02/23(金) 21:34:47 ID:???]
>>11
OOPのメリット聞かれたから自分で見つけた参考サイト出して自分の所感言っただけだろ。
聞くだけで何もしない厨より、アクティブな>>1に好感が持てたが。

って擁護すると自演って言うのかな?

13 名前:nobodyさん mailto:sage [2007/02/23(金) 22:38:47 ID:???]
まあ、PHPでOOPなんてのは、今までて来たtoku-hiroさん以外にも
書いている人は多そうだから(俺は知らないけど)
他のも出せば、>>1の疑いは晴れるんじゃないかな。

14 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 23:18:48 ID:???]
Googleで「PHP オブジェクト指向」を検索
www.google.co.jp/search?q=PHP+%83I%83u%83W%83F%83N%83g%8Ew%8C%FC

よさげなサイトをピックアップしてみよう!

15 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 23:23:43 ID:???]
PHPのオンラインマニュアルがよくまとまってますねw(当たり前?)

jp2.php.net/zend-engine-2.php
第19章 クラスとオブジェクト (PHP 5)

16 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 23:49:00 ID:???]
www.mogurin.net/index/php.obj.inc.html
PHP4のOOPについて、簡単な説明がありました。

PHP5のOOPは、PHP4のOOPに変更が加えられているので、ちょっと違う部分があります。

17 名前:1 ◆SWtzLesEmM mailto:age [2007/02/24(土) 00:03:56 ID:???]
PHP4のオブジェクト指向、デザインパターンについての説明がありました。
www.aglabo.com/agl/proevo/PHP/objectbrain/4-composite2.html

PHP5のオブジェクト指向について説明がありました。
www.doyouphp.jp/php5/

オブ脳 in PHP
www.aglabo.com/agl/proevo/PHP/objectbrain/
「委譲」などの説明がありました。

今の段階では、ちょっとよく理解できませんでしたがこんな話もあるんですね。

18 名前:nobodyさん mailto:sage [2007/02/24(土) 00:47:36 ID:???]
初心者のおれも学習するから講義すすめてくれ

19 名前:nobodyさん mailto:sage [2007/02/24(土) 01:05:02 ID:???]
>>18
わかった。

オブジェクトの
オブとはすなわち飯富。飯富厩舎所属だということ。

オブジェクトの
ジェクトトはすなわちジェクト。FF10のジェクトだということ。



20 名前:nobodyさん mailto:sage [2007/02/24(土) 13:35:58 ID:???]
オブジェクトを利用すると何がいいのか一言でまとめて



21 名前:nobodyさん mailto:sage [2007/02/24(土) 13:43:25 ID:???]
プロとしての自信が持てるようになります

22 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:26:54 ID:???]
とりあえず簡単なWEBアプリケーションを作りながらOOPの勉強をしてみたいです。
OOPで掲示板を作ってみたいです。

(1)最初はOOPを使わないで掲示板を作ってみる
(2)次にOOPで同じ掲示板を作ってみる
という流れにすると、対比によってOOPが理解しやすくなるでしょうか?
=始めに完成形ありきと。

23 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:34:22 ID:???]
掲示板の機能としては、

(1)名前とタイトルと本文を入力&投稿できる。
(2)投稿の一覧(タイトル+投稿日時)が表示できる。
(3)投稿の詳細内容(1つ1つの投稿を個別に閲覧)が表示できる。

という最低限の機能で作ってみて、
後から徐々に機能を追加して拡張してみましょう。

24 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:45:34 ID:???]
データベースは普段MySQLを使ってます。
文字化け対策が面倒くさいので、文字コードはUTF-8(UTF-8N)にしときます。

テーブル名は、message
カラムは、
message_id (int not null auto_increment) ←主キーにする
name (text)
title (text)
message (text)
create_date (datetime または年月日時分秒の14桁でvarchar(14))
の5個にしてみましょう。

テーブル名やカラム名の付け方は、
複数形(messages)と単数形(message)のセットで命名したりとか、
主キーは単に「id」としておく方が分かりやすいでしょうか?

ラーメンの具でメンマが9切れのっているか10切れのっているかという違い…些細なことはどうでもいいか。


25 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:53:26 ID:???]
MySQL5.0で、phpMyAdminを使って、oop_testというデータベースを1個新設しました。
その中にテーブルを1個作りました。

CREATE TABLE `message` (
`message_id` int(11) NOT NULL,
`name` text,
`title` text,
`message` text,
`create_date` datetime default NULL,
PRIMARY KEY (`message_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

日付はとりあえずdatetime型にしておきました。
MySQL4.0を使っている人は、上記のSQL文から「DEFAULT CHARSET=utf8」という句を削らないとエラーになると思います。

26 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 17:00:26 ID:???]
画面は、>>23の(1)〜(3)の3画面を用意すればOKかな?
画面(ハリボテ)を先に作ってみて、それにプログラムを付けて動くようにしてみます。

(1)入力ページ input.php
(2)一覧ページ list.php
(3)詳細ページ message.php

itpro.nikkeibp.co.jp/article/COLUMN/20070214/261859/
「HTML画面をそのまま仕様書に」,5カ月で1000画面を構築した就職サイトPuffの高速開発手法


27 名前:nobodyさん mailto:sage [2007/02/24(土) 18:52:22 ID:???]
wktk

28 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 20:07:40 ID:???]
>>25
主キーをオートインクリメント(連番の)の設定にしておくのを忘れてました。orz

CREATE TABLE `message` (
`message_id` int(11) NOT NULL auto_increment,
`name` text,
`title` text,
`message` text,
`create_date` datetime default NULL,
PRIMARY KEY (`message_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


29 名前:nobodyさん mailto:sage [2007/02/25(日) 02:57:19 ID:???]
サンプルページ公開して

30 名前:2 mailto:sage [2007/02/25(日) 16:11:09 ID:???]
定番のhelloを表示w
class hello {
var $aisatu = "こんにちは";
}

$re = new hello();
$aisatu = $re->aisatu;
echo $aisatu;

読み図ら買ったら適当に改行して



31 名前:2 mailto:sage [2007/02/25(日) 16:19:08 ID:???]
#オブジェクト学校のhelloクラスを作る
class hello {


#このクラスに生徒である$aisatu君がいる
#彼に「こんにちは」という言葉を覚えさせる
var $aisatu = "こんにちは";


#放課後なので括弧で閉じる
}




#クラスの風景を覗くための魔法
$re = new hello();


#生徒$aisatu君に「こんにちは」を言わせるための魔法を矢で飛ばす。
#魔法で生徒$aisatu君の$は壊れてしまい、以下のような記述になる。。
$aisatu = $re->aisatu;


#魔法にかかった生徒挨拶君をおまえらのディスプレイに召還する。
echo $aisatu;

32 名前:nobodyさん mailto:sage [2007/02/26(月) 16:35:48 ID:???]
コードの解説なんてしなくても見ればわかる。
「なぜOOP」か、だとか、
こういう場合にOOPが役立つ、というのを具体的なコードで示してくれ

33 名前:nobodyさん mailto:sage [2007/02/26(月) 18:41:14 ID:???]
namespace は結局 PHP5 では実装されなかったんだね・・・・
悲しい。悲しすぎる。

34 名前:nobodyさん mailto:sage [2007/02/26(月) 23:07:07 ID:???]
MVCのMをOOPでCは手続きVはテンプレート

35 名前:1 ◆SWtzLesEmM mailto:age [2007/02/27(火) 15:21:07 ID:???]
>>22 (1)最初はOOPを使わないで掲示板を作ってみる
OOPを使わないで作った簡単な掲示板をアップしてみます。

>>26
ファイルは、他に掲示板のトップページと、DB接続関係のデータを入れたファイルを用意しました。
WEBサーバのルート直下にデプロイした場合を想定しています。

/index.html 掲示板のトップページ
/db.php データベースの接続関係のデータのファイル
/input.php メッセージ入力ページ
/list.php メッセージ一覧ページ
/message.php メッセージ詳細ページ

36 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:22:07 ID:???]
index.htmlの内容は以下の通りです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>掲示板メニュー</title>
</head>
<body>
<h1>掲示板メニュー</h1>
<div id="menu">
<ul>
<li><a href="input.php">メッセージ入力</a></li>
<li><a href="list.php">メッセージ一覧</a></li>
</ul>
</div>
</body>
</html>


37 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:24:34 ID:???]
db.phpの内容は以下の通りです。

<?php
/**
* データベース
*/

//本番環境ドメイン名
define("DOMAIN", "xrea.com");//ドメイン名に含まれる文字列を指定

//MySQL設定(本番環境とテスト環境で切替え)
if (ereg(DOMAIN, $_SERVER['SERVER_NAME'])) {
//本番環境
define("DBSERVER", "localhost");
define("DBUSER" , "username");
define("DBPASSWORD", "password");
define("DBNAME", "oop_test");
} else {
//テスト環境
define("DBSERVER", "localhost");
define("DBUSER" , "test_username");
define("DBPASSWORD", "test_password");
define("DBNAME", "oop_test");
}

(以下、続く)

38 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:25:32 ID:???]
db.phpの続きです。

//MySQL接続関数
function db_connect() {
// MySQL 接続
$link = mysql_connect(DBSERVER, DBUSER, DBPASSWORD);
if (!$link) {
die('mysql_connect ERROR: ' . mysql_error());
}

// MySQL DB 選択
$db_selected = mysql_select_db(DBNAME, $link);
if (!$db_selected) {
die ('mysql_select_db ERROR: ' . mysql_error());
}

// MySQL 4.1以上 文字コードセット
mysql_query('SET CHARACTER SET utf8');

return $db_selected;
}

39 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:26:17 ID:???]
db.phpの続き(その2)です。

//MySQLプリペアードステートメント関数(SQLインジェクション対策)
//(参考)www.php.net/manual/ja/function.mysql-query.php#70686
function mysql_prepare($query, $phs = array()) {
$phs = array_map(create_function('$ph', 'return "\'".mysql_real_escape_string($ph)."\'";'), $phs);

$curpos = 0;
$curph = count($phs)-1;

for ($i = strlen($query) - 1; $i > 0; $i--) {
if ($query[$i] !== '?') {
continue;
}
if ($curph < 0 || !isset($phs[$curph])) {
$query = substr_replace($query, 'NULL', $i, 1);
} else {
$query = substr_replace($query, $phs[$curph], $i, 1);
}
$curph--;
}
unset($curpos, $curph, $phs);
return $query;
}
?>

40 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:30:07 ID:???]
input.phpの内容は以下の通りです。

<?php
/**
* メッセージ入力画面
*/

require_once("db.php");
db_connect();

//
$name = $_POST['name'];
$title = $_POST['title'];
$message = $_POST['message'];
$error_msg = "";

(以下、続く)



41 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:30:59 ID:???]
db.phpの続きです。

//入力値バリデート
if (0 < strlen($name) && 0 < strlen($title) && 0 < strlen($message)) {
//DB保存処理
$create_date = date("Y/m/d H:i:s");
$sql = "INSERT message SET
name = ? ,
title = ? ,
message = ? ,
create_date = ? ";
$phs = array($name, $title, $message, $create_date);//プレースホルダーにバインドする変数
$sql_prepare = mysql_prepare($sql, $phs);
$result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error());
//ページ移動
if ($result == TRUE) {
$url = "".$_SERVER['HTTP_HOST']."/test2/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>

42 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:34:29 ID:???]
>>41
間違えました。

>db.phpの続きです。
ではなくて、
「input.phpの続きです。」
でした。(・∀・)

あと、
>$url = "".$_SERVER['HTTP_HOST']."/test2/list.php";//メッセージ一覧
ではなくて、
$url = "".$_SERVER['HTTP_HOST']."/list.php";//メッセージ一覧
になります。

=ローカルでは、/test2というフォルダを作ってその中にいれていたので。
=本番環境では、ドキュメントルート直下を想定しているので、/test2/は不要

もう一回訂正してアップします。

43 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:40:30 ID:???]
>>41の訂正です。

input.phpの続きです。

//入力値バリデート
if (0 < strlen($name) && 0 < strlen($title) && 0 < strlen($message)) {
//DB保存処理
$create_date = date("Y/m/d H:i:s");
$sql = "INSERT message SET
name = ? ,
title = ? ,
message = ? ,
create_date = ? ";
$phs = array($name, $title, $message, $create_date);//プレースホルダーにバインドする変数
$sql_prepare = mysql_prepare($sql, $phs);
$result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error());
//ページ移動
if ($result == TRUE) {
$url = "".$_SERVER['HTTP_HOST']."/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>

(以下、続く)

44 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:42:00 ID:???]
input.phpの続き(その2)です。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>メッセージ入力</title>
</head>
<body>
<h1>メッセージ入力</h1>
<div id="menu">
<ul>
<li><a href="input.php">メッセージ入力</a></li>
<li><a href="list.php">メッセージ一覧</a></li>
</ul>
</div>
<?php echo $error_msg; ?>
<div id="input">
<form name="form_input" method="post" action="input.php">
<div id="name">名前<br>
<input type="text" name="name" value="<?php echo htmlspecialchars($name); ?>">
</div>
<div id="title">タイトル<br>
<input type="text" name="title" value="<?php echo htmlspecialchars($title); ?>">
</div>
<div id="message">メッセージ<br>
<textarea name="message"><?php echo htmlspecialchars($message); ?></textarea>
</div>
<input type="submit" name="submit" value="送信">
</form>
</div>
</body>
</html>

45 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:44:03 ID:???]
list.phpの内容は以下の通りです。

<?php
/**
* メッセージ一覧画面
*/
require_once("db.php");
db_connect();

//
$page = intval($_GET['page']);
$max = 10;//1ページ当たりの最大表示件数

//ページング(ページ数は1から数える)
$sql = "SELECT count(*) AS total FROM message";
$result = mysql_query($sql) or die('SQL Error: ' . mysql_error());
if ($result) $row = mysql_fetch_array($result);
$total = $row['total'];//全メッセージ数
$page_total = ceil($total / $max);//全ページ数
if ($page < 1) $page = 1;
if ($page_total < $page) $page = $page_total;

//メッセージ取得
$sql = "SELECT * FROM message ORDER BY create_date DESC LIMIT ".(($page - 1) * $max) .",".$max;
$result = mysql_query($sql) or die('SQL Error: ' . mysql_error());
?>

46 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:45:25 ID:???]
list.phpの続きです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>メッセージ一覧</title>
</head>
<body>
<h1>メッセージ一覧</h1>
<div id="menu">
<ul>
<li><a href="input.php">メッセージ入力</a></li>
<li><a href="list.php">メッセージ一覧</a></li>
</ul>
</div>
<div id="paging">
<?php
//ページング処理
echo "全".$total."件";
echo "(ページ".$page."目)";
for ($i = 1; $i <= $page_total; $i++) {
echo "<a href='list.php?page=".$i."'>".$i."</a> ";
}
?>
</div>

47 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:46:10 ID:???]
list.phpの続き(その2)です。

<table border="1" cellpadding="5">
<tr bgcolor="#FFFF99">
<td>タイトル</td>
<td>投稿者名</td>
<td>投稿日</td>
</tr>
<?php
//メッセージ一覧
while ($rows = mysql_fetch_array($result)) {
echo "<tr>";
echo "<td><a href='message.php?message_id=".htmlspecialchars($rows['message_id'])."'>".htmlspecialchars($rows['title'])."</a></td>";
echo "<td>".htmlspecialchars($rows['name'])."</td>";
echo "<td>".htmlspecialchars($rows['create_date'])."</td>";
echo "</tr>";
}
?>
</table>
</body>
</html>

48 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:47:39 ID:???]
message.phpの内容は以下の通りです。

<?php
/**
* メッセージ詳細画面
*/
require_once("db.php");
db_connect();

//
$message_id = intval($_GET['message_id']);

//メッセージ取得
$sql = "SELECT * FROM message WHERE message_id = ?";
$phs = array($message_id);//プレースホルダーにバインドする変数
$sql_prepare = mysql_prepare($sql, $phs);
$result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error());
if ($result) {
$row = mysql_fetch_array($result);
}
?>

49 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:49:23 ID:???]
message.phpの続きです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>メッセージ詳細</title>
</head>
<body>
<h1>メッセージ詳細</h1>
<div id="menu">
<ul>
<li><a href="input.php">メッセージ入力</a></li>
<li><a href="list.php">メッセージ一覧</a></li>
</ul>
</div>
<table border="1" cellpadding="5">
<tr>
<td bgcolor="#FFFF99">投稿者名</td>
<td><?php echo htmlspecialchars($row['name']); ?></td>
</tr>

50 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:50:12 ID:???]
message.phpの続き(その2)です。

<tr>
<td bgcolor="#FFFF99">投稿日</td>
<td><?php echo htmlspecialchars($row['create_date']); ?></td>
</tr>
<tr>
<td bgcolor="#FFFF99">タイトル</td>
<td><?php echo htmlspecialchars($row['title']); ?></td>
</tr>
<tr>
<td bgcolor="#FFFF99">メッセージ</td>
<td><?php echo nl2br(htmlspecialchars($row['message'])); ?></td>
</tr>
</table>
</body>
</html>



51 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:59:41 ID:???]
それでは、次行ってみよう!
>>22 (2)次にOOPで同じ掲示板を作ってみる

>>34
PHPコードとHTML表示を一緒にしてありますが、OOPではテンプレートシステムを使って、PHPコードとHTML表示部分を分離して、MVCにしてみたいです。

どういうクラスを作ればいいのか良く分かりません><

(1)コントローラー(+アクション)→input、list、message
(2)モデル→データベース接続処理も1つのクラスにするのでしょうか?
(4)ビュー→テンプレートシステムへの出力
というかんじで3個のクラスが必要でしょうか?
それぞれのクラスに必要なプロパティとメソッドを何にするか?
クラスを考えて、UMLでクラス図を作ってみたいです。

52 名前:nobodyさん mailto:sage [2007/02/27(火) 22:54:58 ID:???]
がんばってるなあ。
おれもがんばろう。

53 名前:nobodyさん mailto:sage [2007/02/28(水) 03:12:15 ID:???]
わかりにくいからWebサイトにまとめてくれ。PHP使いなんだし

54 名前:1 ◆SWtzLesEmM mailto:age [2007/02/28(水) 20:49:38 ID:???]
>>53
まとめサイトを設置しました。
ttp://kameleon.s241.xrea.com/dokuwiki/doku.php


55 名前:nobodyさん mailto:sage [2007/02/28(水) 22:48:34 ID:???]
最終的にMVCな構成を目標に
少しずつリファクタリングしていけばよいと思う

とりあえずDBアクセスを一箇所にまとめるモデルを作ってみるといいんじゃない
・全件取得
・1件取得
・1件追加
できるMessageクラスとかを作ってそこにDBアクセス(SQL)をまとめれ

56 名前:nobodyさん [2007/03/03(土) 13:53:29 ID:Ej/v+KpC]
期待上げ

57 名前:nobodyさん [2007/03/04(日) 04:17:32 ID:xhaosu8B]
期待

58 名前:nobodyさん mailto:sage [2007/03/11(日) 11:30:29 ID:???]
OOP勉強したいなら、実力不足のやつが書いたガラクタ掲示板スクリプトを
読むより、有名なオープンソースのスクリプトを読めばいいじゃん。
そもそも>>1の意味不明な独善なんかに付き合わなくてもOOPに関する情報
はいくらでも手にはいるし。

59 名前:nobodyさん mailto:sage [2007/03/11(日) 23:56:02 ID:???]
ど素人に肥大したコードを読ませて理解できると思ってる思考回路がカコイイ!

60 名前:nobodyさん [2007/03/12(月) 08:27:35 ID:cm9vlrfS]
>>59
ど素人はみんな、自分みたいな学習意欲も向上心もない人間だと思ってる
思考回路がカコイイ!



61 名前:nobodyさん mailto:sage [2007/03/12(月) 09:16:45 ID:???]
>>60 思考回路がカコイイ!

62 名前:nobodyさん mailto:sage [2007/03/12(月) 09:57:59 ID:???]
>>59-61
全員カコワルイ!! 俺はカコイイ!!

63 名前:nobodyさん mailto:sage [2007/03/12(月) 13:37:56 ID:???]
>>1-62
全員カコイイ!!
俺はカコワルイ!!

64 名前:nobodyさん mailto:sage [2007/03/12(月) 14:07:03 ID:???]
で、結局荒れ放題になり>>1の独善は無事終了したのだった。
ちゃんちゃん。

65 名前:1 ◆SWtzLesEmM mailto:age [2007/05/12(土) 03:12:14 ID:???]
>>55
DBにアクセスするためのクラスを作ろうと思って、とりあえずdb.phpをクラスの形に変えてみようと試みました。
だけど、コンストラクタでエラーが出てストップ!
Fatal error: Cannot access empty property in /…/test.php on line 18

なんでエラーになるのか?よく分からなくて、PHP5のコンストラクタについて調査していたら、サンプルになりそうなDBクラスの解説記事がありました。
www.bnote.net/php/php/09_db_class.shtml
↑これをソックリ真似すれば、DBクラスは何とかなるかな?

ところで、このbnoteというサイトのPHP解説記事には、掲示板を作ってみるサンプルがあり、参考になりそうです。
www.bnote.net/php/php_idx.shtml
>PHPでフォーラムを作ろう!


66 名前:nobodyさん mailto:age [2007/05/12(土) 16:09:18 ID:???]
中傷されている>>1だが、
普通に>>1のおかげでだいぶいい情報が手に入った。
曖昧だったクラスがなんとか分かりそうだよ。
ありがとー
PHPでわからない人は情報が足りないのかもな。
似てるJAVAで本格的なものを見てみると分かるのかも。

昔、歴史で年表同士のつながりが薄くて分かりづらかったように、
もっと詳しく高校の歴史くらいのをみれば分かりやすい。

67 名前:nobodyさん [2007/05/12(土) 23:32:04 ID:s118dfiw]
なんていうか「こういうときにはこういう設計をします」っていう
具体的な情報がほしいよな
俺は車なんかプログラミングしないっての

68 名前:nobodyさん [2007/05/14(月) 00:46:15 ID:4QCW9ZwU]
最近ちょっとだけ解ってきた。

なぜOOPなのかと言えば
再利用とメンテナンス、拡張がやりやすい(やりやすく作ることが出来る)ということがすごくて、
そのためにカプセル化とポリモーフィズムがあって
ポリモーフィズムを実現(保証)するために継承や、インターフェイスや抽象クラスがあるって感じなのかな?

PHPによるデザインパターンは読んでみても良いと思う。
あと、ゼンドフレームワーク勉強用にZFで動くブログソフトみたいのあるから、それの仕組みと、ZFのソース(全部はきついけど関係あるところだけ)
を見てみると、結構勉強になると思う。
ttp://www.itmedia.co.jp/enterprise/articles/0702/28/news028.html
ttp://www.itmedia.co.jp/enterprise/articles/0703/05/news013.html
ttp://www.itmedia.co.jp/enterprise/articles/0703/08/news018.html
記事がちょっと古いから最新バージョンと微妙に違うけど。

まあ、このフレームワークが良いか悪いかは別にして(まだベータだし)
OOPバリバリなので、勉強になること間違いなし!

69 名前:nobodyさん mailto:sage [2007/05/15(火) 15:55:34 ID:???]
しかし PHP関連の本でOOPをわかりやすく書いてあるのが



「ない!」 お勧め教えて

70 名前:nobodyさん mailto:sage [2007/05/15(火) 16:01:33 ID:???]
本なんか読むよりPEARやフレームワークのソース読んで
勉強しながら自分なりに書いていけ、金かからないしだしそれが一番の近道
気が付いたらOOPなんて空気のように有って当たり前になるもんだから



71 名前:nobodyさん mailto:sage [2007/05/15(火) 16:06:06 ID:???]
わかりにくいの例として

スコープ演算子(static ::)は2冊読んでもチンプンカンプン
そこでぐぐる先生に聞くと

homepage3.nifty.com/gomi_doji/scopen.htm
PHPではないが、ナルホドナルホドと理解できる

オブジェクト指向の概要も
phpspot.net/php/pg%83I%83u%83W%83F%83N%83g%8Ew%8C%FCPHP.html
を読むとナルホドナルホドだが、本は意味不明になる

糞った本しか読んでいないかもしれないが一応書いておく
「PHP5プログラミング エキスパート編」 //最強の意味不明
「MySQL4/PHP5によるWebデータベース構築」 //わかりやすいがODPの章になると意味不明

72 名前:nobodyさん mailto:sage [2007/05/15(火) 16:08:18 ID:???]
書きながら次第にむかつき度が増加して誤字だらけになった(怒

>>70
それ疲れる

73 名前:nobodyさん mailto:sage [2007/05/15(火) 17:01:49 ID:???]
>>69
独習PHPのクラスらへんの説明は中々分かりやすいよ。
作者があまりいいとはいえんが、ファーストステップにはいい感じ。


74 名前:nobodyさん mailto:sage [2007/05/22(火) 15:14:54 ID:???]
同じ事を色々な言葉で表現するから迷うずら
PHPの本読むよりJAVAの本読んだほうが理解できる罠。

75 名前:nobodyさん mailto:sage [2007/05/28(月) 14:46:00 ID:???]
自分が作るだけなら手続き型でいいけど
人の作ったライブラリ使いたいから
最低限、何が書いてあって何をしているのか読めるようになりたい

76 名前:nobodyさん mailto:sage [2007/05/29(火) 05:34:16 ID:???]
答えが出てるじゃないか。その使いたいライブラリのコードを読め

77 名前:nobodyさん [2007/06/05(火) 12:23:56 ID:/w569Zaf]
OOPS

78 名前:nobodyさん mailto:age [2007/06/05(火) 19:15:58 ID:???]
XOOPS

79 名前:nobodyさん [2007/06/11(月) 22:06:39 ID:2dWIuVC4]
>>65に誰もつっこまないのかよ!!

DBアクセスの為のクラス書くのかw
おそらくPHPインストール時に君のHDDの中にすでに入ってる訳だが…
しかもあらゆるDBに同じ書式でアクセス出来るやつが…


80 名前:nobodyさん mailto:sage [2007/06/11(月) 23:45:37 ID:???]
>>79
なんてやつ?



81 名前:nobodyさん mailto:sage [2007/06/12(火) 00:15:06 ID:???]
PEARのソースは読まない方が身のため

82 名前:nobodyさん [2007/06/12(火) 06:55:41 ID:e4tfCBN5]
79は勘違いしてるが、彼がいいたいのはPearのDBクラスのことだろう

83 名前:nobodyさん mailto:sage [2007/06/12(火) 09:31:07 ID:???]
82が勘違いだろ。
単にPDOだろ

84 名前:1 ◆SWtzLesEmM mailto:age [2007/06/12(火) 10:24:12 ID:???]
>>73
情報提供どうもありがとうございます。
独習PHPは、図書館でかりて読んでみました。
オブジェクト構文の説明は分かりやすいと思いました。

>>79
DBにアクセスするクラスも勉強のため練習で作ってみようと思いました。
その次に、O/Rマッパーの使い方を練習してみることになるでしょうか?

>>82
PHP5に標準で用意されているPDOのことですね。
jp2.php.net/pdo
PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。
PDO は PHP 5.1 以降にバンドルされており、PHP 5.0 では PECL 拡張モジュールとして使用可能です。
PDO は PHP 5 の新機能である オブジェクト指向機能を使用しており、それより前のバージョンの PHP では動作しません。


85 名前:nobodyさん mailto:sage [2007/06/12(火) 10:56:05 ID:???]
mysqliとどっちがいい?

86 名前:nobodyさん mailto:sage [2007/06/12(火) 17:53:32 ID:???]
ふとおもったんだが、>>1はできるんじゃないのか。

87 名前:nobodyさん mailto:sage [2007/06/17(日) 01:20:06 ID:???]
被害者増やさないように書いておく。
「PHPデザインパターン入門」は買うな。

最近買った中で最低レベルの悪書。

どっかの英語ページを機械翻訳したようなトンチンカンな用語説明にまじって
何故かApacheとPHPのインストール方法だけが丁寧な日本語で書かれている。
あとはデザインパターン図が羅列してあるだけ。解説ほぼ無し。
3流大学生のコピペ論文を彷彿とさせる。
こんなの真剣に呼んでも絶対わかるようにはならない。

OOP用語の説明は何故かちゃんとしてないのに
php.iniにページさかれてるけど
網羅して無くて中途半端でページ稼ぎとしか思えない。

中身薄くて有名なヤマダヨウカン本の方がマシに感じるレベル。

88 名前:nobodyさん mailto:sage [2007/06/17(日) 01:28:20 ID:???]
なんか良く読むと、この本は解説の日本語が
オブジェクト指向で書かれてる気がした。

多分最初にパターン名を記載した時点で、作者の頭の中では
記載されてるページを呼び出してるんだろうと思えてきた。

解説するための日本語はプロシージャ指向で書いてくれと
小一時間問い詰めたい。

この本理解するには色んな本を買って、全部理解した後じゃないと
読めない。意味ねえじゃん。

89 名前:nobodyさん mailto:sage [2007/06/17(日) 01:54:28 ID:???]
軽いフレームワークいじって使うのが一番いいオブジェクト指向の勉強だよ

90 名前:nobodyさん mailto:sage [2007/06/17(日) 14:22:50 ID:???]
ウェブアプリにオブジェクト指向なんていらないよ。どうせ文字列を加工してデータベースのテーブルのカラムに並べるだけなんだから。



91 名前:nobodyさん mailto:sage [2007/06/17(日) 18:51:52 ID:???]
じゃどういうときに必須なんよ

92 名前:nobodyさん mailto:sage [2007/06/24(日) 17:09:42 ID:???]
オブジェクト指向と言う言葉にまどわされず、
クラスの勉強をすればいいんだよ。 

単に、呼び出してるだけだから。 

93 名前:nobodyさん mailto:sage [2007/06/24(日) 19:32:38 ID:???]
PEARをサンプルみながら見よう見まねでインスタンス作って
なんだかんだで実際動いてるんだけど何してるかイマイチ理解出来てないんだよね
functionの中でインスタンス作るとその外側ではやっぱアクセスできないのかな
PEARDBのインスタンスがあっちゃこっちゃに散らばっちゃって困る

94 名前:nobodyさん mailto:sage [2007/06/25(月) 12:32:57 ID:???]
>>93
プロパティに入れれ

95 名前:1 ◆SWtzLesEmM mailto:age [2007/07/06(金) 14:33:24 ID:???]
>>68
>拡張がやりやすい(やりやすく作ることが出来る)
そうみたいですね。
www.amazon.co.jp/dp/4822281957/
「オブジェクト指向でなぜつくるのか」
という本にも、クラスを使うメリットが同じように説明されていました。(・∀・)

>>74
Javaの本だと
www.amazon.co.jp/dp/4797331828/
「やさしいJava」をすすめられました。

>>86
(σ・Д・)σプログラミング初心者ですΣ(゚Д゚*)=3

>>89
Zend Frameworkの正式版が出ましたね☆
framework.zend.com/manual/ja/
シンプルなフレームワークを検索したら、CodeIgniterというのがありました。
userguide.cilab.info/


96 名前:nobodyさん [2007/07/08(日) 18:20:46 ID:XFKJF1H9]
最近このスレが怖くて見れん俺ガイル
なんでそんな成長早いんだよ・・・おかしいだろ・・・orz

97 名前:テレビできたよー [2007/07/10(火) 15:53:51 ID:ZIdzImz8]
class TV {
 var $channel;
 var $state;
 var $singleton;
 
 function TV() {
  $this->channel = 1;
  $this->state = false;
 }
 
 function on() {
  if(!$this->state) {
   $this->state = true;
   echo "電源オン<br />";
   $this->reflect();
  } else {
   echo "既に電源はオンになっています<br />";
  }
 }
 
 function off() {
  if($this->state) {
   $this->state = false;
   echo "電源オフ<br />";
  } else {
   echo "既に電源はオフになっています<br />";
  }
 }

98 名前:テレビできたよー [2007/07/10(火) 15:54:22 ID:ZIdzImz8]
 function reflect($c = null) {
  if($this->state) {
   if(!empty($c)) {
    $this->channel = $c;
   }
   
   echo $this->channel . " チャンネルを写します<br />";
  } else {
   echo "電源が入っておりません<br />";
  }
 }
}

$tv = new TV;
$tv->on();
$tv->reflect(8);
$tv->on();
$tv->on();
$tv->off();
$tv->off();
$tv->reflect(5);
$tv->on();


99 名前:nobodyさん mailto:sage [2007/07/11(水) 10:41:20 ID:???]
例外投げるようにすれば?

100 名前:1 ◆SWtzLesEmM mailto:age [2007/07/11(水) 12:59:29 ID:???]
例外処理
www.phppro.jp/word/E4BE8BE5A496E587A6E79086

2. PHPで例外処理
www.phppro.jp/phptips/vol45/eb49e8a31e9132d98a5a7db3df4663e4

PHP5の基本 > 例外処理
www.shigeweb.jp/php/project_p/?section=php5oop&page=exception

phpspot - 例外処理
phpspot.net/php/pg%97%E1%8AO%8F%88%97%9D.html

PHP4ではエラー処理といえば、
if ( ($err = func()) != "" ) {
  die("エラーです");
}
のように戻り値のチェックをしていましたが、エラーというものは、呼び出し側がエラー制御を行うのではなく、呼ばれた側で、どういうエラーがあったか、というものがあった方が自然で、呼ばれた側がエラー処理を行うため、モジュールの場合より再利用性が高くなるでしょう。
更に上記では、どういうエラーが起こってエラーが出ているのかということが想像しにくいですね。
そこで try〜catch です。

■例外処理
www.atmarkit.co.jp/flinux/special/php5/php5d.html
プログラミングにエラー処理は避けて通れない事項だ。
とはいえ、関数やメソッドからの戻り値を毎回エラーチェックするのは煩雑で面倒でもある。
その煩雑さを回避するため、文法として例外処理を持っている言語もある。
PHP5もそれに倣って、言語仕様として例外処理をサポートした。
文法的にはC++やJavaと同様に、try{ }で投げられた例外をcatch{ }で処理するという流れになる。

↑とのことですが、汎用性のある関数やメソッドにしたい場合、エラーが発生したときの処理を書く場所は、関数やメソッドを使う方(呼び出す側)にすることもあるでしょうか?
=戻り値をチェックするというのは、古いやり方なんでしょうか?









[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<227KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef