07/02/23 15:12:49
Webでオブジェクト指向
スレリンク(php板)
こっちじゃ何故駄目なんだ?
8:nobodyさん
07/02/23 16:25:04
>>1
>>5
自作自演乙w
9:nobodyさん
07/02/23 16:52:36
トリップ出してるのに自作自演もくそもあるのかw
10:1 ◆SWtzLesEmM
07/02/23 19:44:43
>>7
>Webでオブジェクト指向
>スレリンク(php板)
>こっちじゃ何故駄目なんだ?
そっちも参考に眺めています。
あと、プログラマー板にもあるオブジェクト指向関係のスレもちょっと眺めています。
PHPに的を絞った情報が欲しいので、専用のスレを立ててみました。
もちろん、JavaやRuby、Pythonとかも使えればいいけど、そこまで手を広げる時間がないので、とりあえず今の段階ではPHPで勉強。
PHPを使っていて、オブジェクト指向プログラミングのやり方を勉強したい人がいたら一緒に勉強していきましょう。
よろしく(・∀・)
11:nobodyさん
07/02/23 21:14:52
>>9
ちげーよ
自分のサイトの宣伝して
「この説明見てなるほどな~~~!と思いました^^」
と書いてるところがだよ
12:nobodyさん
07/02/23 21:34:47
>>11
OOPのメリット聞かれたから自分で見つけた参考サイト出して自分の所感言っただけだろ。
聞くだけで何もしない厨より、アクティブな>>1に好感が持てたが。
って擁護すると自演って言うのかな?
13:nobodyさん
07/02/23 22:38:47
まあ、PHPでOOPなんてのは、今までて来たtoku-hiroさん以外にも
書いている人は多そうだから(俺は知らないけど)
他のも出せば、>>1の疑いは晴れるんじゃないかな。
14:1 ◆SWtzLesEmM
07/02/23 23:18:48
Googleで「PHP オブジェクト指向」を検索
URLリンク(www.google.co.jp)
よさげなサイトをピックアップしてみよう!
15:1 ◆SWtzLesEmM
07/02/23 23:23:43
PHPのオンラインマニュアルがよくまとまってますねw(当たり前?)
URLリンク(jp2.php.net)
第19章 クラスとオブジェクト (PHP 5)
16:1 ◆SWtzLesEmM
07/02/23 23:49:00
URLリンク(www.mogurin.net)
PHP4のOOPについて、簡単な説明がありました。
PHP5のOOPは、PHP4のOOPに変更が加えられているので、ちょっと違う部分があります。
17:1 ◆SWtzLesEmM
07/02/24 00:03:56
PHP4のオブジェクト指向、デザインパターンについての説明がありました。
URLリンク(www.aglabo.com)
PHP5のオブジェクト指向について説明がありました。
URLリンク(www.doyouphp.jp)
オブ脳 in PHP
URLリンク(www.aglabo.com)
「委譲」などの説明がありました。
今の段階では、ちょっとよく理解できませんでしたがこんな話もあるんですね。
18:nobodyさん
07/02/24 00:47:36
初心者のおれも学習するから講義すすめてくれ
19:nobodyさん
07/02/24 01:05:02
>>18
わかった。
オブジェクトの
オブとはすなわち飯富。飯富厩舎所属だということ。
オブジェクトの
ジェクトトはすなわちジェクト。FF10のジェクトだということ。
20:nobodyさん
07/02/24 13:35:58
オブジェクトを利用すると何がいいのか一言でまとめて
21:nobodyさん
07/02/24 13:43:25
プロとしての自信が持てるようになります
22:1 ◆SWtzLesEmM
07/02/24 16:26:54
とりあえず簡単なWEBアプリケーションを作りながらOOPの勉強をしてみたいです。
OOPで掲示板を作ってみたいです。
(1)最初はOOPを使わないで掲示板を作ってみる
(2)次にOOPで同じ掲示板を作ってみる
という流れにすると、対比によってOOPが理解しやすくなるでしょうか?
=始めに完成形ありきと。
23:1 ◆SWtzLesEmM
07/02/24 16:34:22
掲示板の機能としては、
(1)名前とタイトルと本文を入力&投稿できる。
(2)投稿の一覧(タイトル+投稿日時)が表示できる。
(3)投稿の詳細内容(1つ1つの投稿を個別に閲覧)が表示できる。
という最低限の機能で作ってみて、
後から徐々に機能を追加して拡張してみましょう。
24:1 ◆SWtzLesEmM
07/02/24 16:45:34
データベースは普段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
07/02/24 16:53:26
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
07/02/24 17:00:26
画面は、>>23の(1)~(3)の3画面を用意すればOKかな?
画面(ハリボテ)を先に作ってみて、それにプログラムを付けて動くようにしてみます。
(1)入力ページ input.php
(2)一覧ページ list.php
(3)詳細ページ message.php
URLリンク(itpro.nikkeibp.co.jp)
「HTML画面をそのまま仕様書に」,5カ月で1000画面を構築した就職サイトPuffの高速開発手法
27:nobodyさん
07/02/24 18:52:22
wktk
28:1 ◆SWtzLesEmM
07/02/24 20:07:40
>>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さん
07/02/25 02:57:19
サンプルページ公開して
30:2
07/02/25 16:11:09
定番のhelloを表示w
class hello {
var $aisatu = "こんにちは";
}
$re = new hello();
$aisatu = $re->aisatu;
echo $aisatu;
読み図ら買ったら適当に改行して
31:2
07/02/25 16:19:08
#オブジェクト学校のhelloクラスを作る
class hello {
#このクラスに生徒である$aisatu君がいる
#彼に「こんにちは」という言葉を覚えさせる
var $aisatu = "こんにちは";
#放課後なので括弧で閉じる
}
#クラスの風景を覗くための魔法
$re = new hello();
#生徒$aisatu君に「こんにちは」を言わせるための魔法を矢で飛ばす。
#魔法で生徒$aisatu君の$は壊れてしまい、以下のような記述になる。。
$aisatu = $re->aisatu;
#魔法にかかった生徒挨拶君をおまえらのディスプレイに召還する。
echo $aisatu;
32:nobodyさん
07/02/26 16:35:48
コードの解説なんてしなくても見ればわかる。
「なぜOOP」か、だとか、
こういう場合にOOPが役立つ、というのを具体的なコードで示してくれ
33:nobodyさん
07/02/26 18:41:14
namespace は結局 PHP5 では実装されなかったんだね・・・・
悲しい。悲しすぎる。
34:nobodyさん
07/02/26 23:07:07
MVCのMをOOPでCは手続きVはテンプレート
35:1 ◆SWtzLesEmM
07/02/27 15:21:07
>>22 (1)最初はOOPを使わないで掲示板を作ってみる
OOPを使わないで作った簡単な掲示板をアップしてみます。
>>26
ファイルは、他に掲示板のトップページと、DB接続関係のデータを入れたファイルを用意しました。
WEBサーバのルート直下にデプロイした場合を想定しています。
/index.html 掲示板のトップページ
/db.php データベースの接続関係のデータのファイル
/input.php メッセージ入力ページ
/list.php メッセージ一覧ページ
/message.php メッセージ詳細ページ
36:1 ◆SWtzLesEmM
07/02/27 15:22:07
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
07/02/27 15:24:34
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
07/02/27 15:25:32
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
07/02/27 15:26:17
db.phpの続き(その2)です。
//MySQLプリペアードステートメント関数(SQLインジェクション対策)
//(参考)URLリンク(www.php.net)
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
07/02/27 15:30:07
input.phpの内容は以下の通りです。
<?php
/**
* メッセージ入力画面
*/
require_once("db.php");
db_connect();
//
$name = $_POST['name'];
$title = $_POST['title'];
$message = $_POST['message'];
$error_msg = "";
(以下、続く)
41:1 ◆SWtzLesEmM
07/02/27 15:30:59
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 = "URLリンク(".$_SERVER[)'HTTP_HOST']."/test2/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>
42:1 ◆SWtzLesEmM
07/02/27 15:34:29
>>41
間違えました。
>db.phpの続きです。
ではなくて、
「input.phpの続きです。」
でした。(・∀・)
あと、
>$url = "URLリンク(".$_SERVER[)<)'HTTP_HOST']."/list.php";//メッセージ一覧
になります。
=ローカルでは、/test2というフォルダを作ってその中にいれていたので。
=本番環境では、ドキュメントルート直下を想定しているので、/test2/は不要
もう一回訂正してアップします。
43:1 ◆SWtzLesEmM
07/02/27 15:40:30
>>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 = "URLリンク(".$_SERVER[)'HTTP_HOST']."/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>
(以下、続く)
44:1 ◆SWtzLesEmM
07/02/27 15:42:00
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
07/02/27 15:44:03
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
07/02/27 15:45:25
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
07/02/27 15:46:10
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
07/02/27 15:47:39
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
07/02/27 15:49:23
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
07/02/27 15:50:12
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
07/02/27 15:59:41
それでは、次行ってみよう!
>>22 (2)次にOOPで同じ掲示板を作ってみる
>>34
PHPコードとHTML表示を一緒にしてありますが、OOPではテンプレートシステムを使って、PHPコードとHTML表示部分を分離して、MVCにしてみたいです。
どういうクラスを作ればいいのか良く分かりません><
(1)コントローラー(+アクション)→input、list、message
(2)モデル→データベース接続処理も1つのクラスにするのでしょうか?
(4)ビュー→テンプレートシステムへの出力
というかんじで3個のクラスが必要でしょうか?
それぞれのクラスに必要なプロパティとメソッドを何にするか?
クラスを考えて、UMLでクラス図を作ってみたいです。
52:nobodyさん
07/02/27 22:54:58
がんばってるなあ。
おれもがんばろう。
53:nobodyさん
07/02/28 03:12:15
わかりにくいからWebサイトにまとめてくれ。PHP使いなんだし
54:1 ◆SWtzLesEmM
07/02/28 20:49:38
>>53
まとめサイトを設置しました。
URLリンク(kameleon.s241.xrea.com)
55:nobodyさん
07/02/28 22:48:34
最終的にMVCな構成を目標に
少しずつリファクタリングしていけばよいと思う
とりあえずDBアクセスを一箇所にまとめるモデルを作ってみるといいんじゃない
・全件取得
・1件取得
・1件追加
できるMessageクラスとかを作ってそこにDBアクセス(SQL)をまとめれ
56:nobodyさん
07/03/03 13:53:29 Ej/v+KpC
期待上げ
57:nobodyさん
07/03/04 04:17:32 xhaosu8B
期待
58:nobodyさん
07/03/11 11:30:29
OOP勉強したいなら、実力不足のやつが書いたガラクタ掲示板スクリプトを
読むより、有名なオープンソースのスクリプトを読めばいいじゃん。
そもそも>>1の意味不明な独善なんかに付き合わなくてもOOPに関する情報
はいくらでも手にはいるし。
59:nobodyさん
07/03/11 23:56:02
ど素人に肥大したコードを読ませて理解できると思ってる思考回路がカコイイ!
60:nobodyさん
07/03/12 08:27:35 cm9vlrfS
>>59
ど素人はみんな、自分みたいな学習意欲も向上心もない人間だと思ってる
思考回路がカコイイ!
61:nobodyさん
07/03/12 09:16:45
>>60 思考回路がカコイイ!
62:nobodyさん
07/03/12 09:57:59
>>59-61
全員カコワルイ!! 俺はカコイイ!!
63:nobodyさん
07/03/12 13:37:56
>>1-62
全員カコイイ!!
俺はカコワルイ!!
64:nobodyさん
07/03/12 14:07:03
で、結局荒れ放題になり>>1の独善は無事終了したのだった。
ちゃんちゃん。
65:1 ◆SWtzLesEmM
07/05/12 03:12:14
>>55
DBにアクセスするためのクラスを作ろうと思って、とりあえずdb.phpをクラスの形に変えてみようと試みました。
だけど、コンストラクタでエラーが出てストップ!
Fatal error: Cannot access empty property in /…/test.php on line 18
なんでエラーになるのか?よく分からなくて、PHP5のコンストラクタについて調査していたら、サンプルになりそうなDBクラスの解説記事がありました。
URLリンク(www.bnote.net)
↑これをソックリ真似すれば、DBクラスは何とかなるかな?
ところで、このbnoteというサイトのPHP解説記事には、掲示板を作ってみるサンプルがあり、参考になりそうです。
URLリンク(www.bnote.net)
>PHPでフォーラムを作ろう!
66:nobodyさん
07/05/12 16:09:18
中傷されている>>1だが、
普通に>>1のおかげでだいぶいい情報が手に入った。
曖昧だったクラスがなんとか分かりそうだよ。
ありがとー
PHPでわからない人は情報が足りないのかもな。
似てるJAVAで本格的なものを見てみると分かるのかも。
昔、歴史で年表同士のつながりが薄くて分かりづらかったように、
もっと詳しく高校の歴史くらいのをみれば分かりやすい。
67:nobodyさん
07/05/12 23:32:04 s118dfiw
なんていうか「こういうときにはこういう設計をします」っていう
具体的な情報がほしいよな
俺は車なんかプログラミングしないっての
68:nobodyさん
07/05/14 00:46:15 4QCW9ZwU
最近ちょっとだけ解ってきた。
なぜOOPなのかと言えば
再利用とメンテナンス、拡張がやりやすい(やりやすく作ることが出来る)ということがすごくて、
そのためにカプセル化とポリモーフィズムがあって
ポリモーフィズムを実現(保証)するために継承や、インターフェイスや抽象クラスがあるって感じなのかな?
PHPによるデザインパターンは読んでみても良いと思う。
あと、ゼンドフレームワーク勉強用にZFで動くブログソフトみたいのあるから、それの仕組みと、ZFのソース(全部はきついけど関係あるところだけ)
を見てみると、結構勉強になると思う。
URLリンク(www.itmedia.co.jp)
URLリンク(www.itmedia.co.jp)
URLリンク(www.itmedia.co.jp)
記事がちょっと古いから最新バージョンと微妙に違うけど。
まあ、このフレームワークが良いか悪いかは別にして(まだベータだし)
OOPバリバリなので、勉強になること間違いなし!
69:nobodyさん
07/05/15 15:55:34
しかし PHP関連の本でOOPをわかりやすく書いてあるのが
「ない!」 お勧め教えて
70:nobodyさん
07/05/15 16:01:33
本なんか読むよりPEARやフレームワークのソース読んで
勉強しながら自分なりに書いていけ、金かからないしだしそれが一番の近道
気が付いたらOOPなんて空気のように有って当たり前になるもんだから
71:nobodyさん
07/05/15 16:06:06
わかりにくいの例として
スコープ演算子(static ::)は2冊読んでもチンプンカンプン
そこでぐぐる先生に聞くと
URLリンク(homepage3.nifty.com)
PHPではないが、ナルホドナルホドと理解できる
オブジェクト指向の概要も
URLリンク(phpspot.net)
を読むとナルホドナルホドだが、本は意味不明になる
糞った本しか読んでいないかもしれないが一応書いておく
「PHP5プログラミング エキスパート編」 //最強の意味不明
「MySQL4/PHP5によるWebデータベース構築」 //わかりやすいがODPの章になると意味不明
72:nobodyさん
07/05/15 16:08:18
書きながら次第にむかつき度が増加して誤字だらけになった(怒
>>70
それ疲れる
73:nobodyさん
07/05/15 17:01:49
>>69
独習PHPのクラスらへんの説明は中々分かりやすいよ。
作者があまりいいとはいえんが、ファーストステップにはいい感じ。
74:nobodyさん
07/05/22 15:14:54
同じ事を色々な言葉で表現するから迷うずら
PHPの本読むよりJAVAの本読んだほうが理解できる罠。
75:nobodyさん
07/05/28 14:46:00
自分が作るだけなら手続き型でいいけど
人の作ったライブラリ使いたいから
最低限、何が書いてあって何をしているのか読めるようになりたい
76:nobodyさん
07/05/29 05:34:16
答えが出てるじゃないか。その使いたいライブラリのコードを読め
77:nobodyさん
07/06/05 12:23:56 /w569Zaf
OOPS
78:nobodyさん
07/06/05 19:15:58
XOOPS
79:nobodyさん
07/06/11 22:06:39 2dWIuVC4
>>65に誰もつっこまないのかよ!!
DBアクセスの為のクラス書くのかw
おそらくPHPインストール時に君のHDDの中にすでに入ってる訳だが…
しかもあらゆるDBに同じ書式でアクセス出来るやつが…
80:nobodyさん
07/06/11 23:45:37
>>79
なんてやつ?
81:nobodyさん
07/06/12 00:15:06
PEARのソースは読まない方が身のため
82:nobodyさん
07/06/12 06:55:41 e4tfCBN5
79は勘違いしてるが、彼がいいたいのはPearのDBクラスのことだろう
83:nobodyさん
07/06/12 09:31:07
82が勘違いだろ。
単にPDOだろ
84:1 ◆SWtzLesEmM
07/06/12 10:24:12
>>73
情報提供どうもありがとうございます。
独習PHPは、図書館でかりて読んでみました。
オブジェクト構文の説明は分かりやすいと思いました。
>>79
DBにアクセスするクラスも勉強のため練習で作ってみようと思いました。
その次に、O/Rマッパーの使い方を練習してみることになるでしょうか?
>>82
PHP5に標準で用意されているPDOのことですね。
URLリンク(jp2.php.net)
PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。
PDO は PHP 5.1 以降にバンドルされており、PHP 5.0 では PECL 拡張モジュールとして使用可能です。
PDO は PHP 5 の新機能である オブジェクト指向機能を使用しており、それより前のバージョンの PHP では動作しません。
85:nobodyさん
07/06/12 10:56:05
mysqliとどっちがいい?
86:nobodyさん
07/06/12 17:53:32
ふとおもったんだが、>>1はできるんじゃないのか。
87:nobodyさん
07/06/17 01:20:06
被害者増やさないように書いておく。
「PHPデザインパターン入門」は買うな。
最近買った中で最低レベルの悪書。
どっかの英語ページを機械翻訳したようなトンチンカンな用語説明にまじって
何故かApacheとPHPのインストール方法だけが丁寧な日本語で書かれている。
あとはデザインパターン図が羅列してあるだけ。解説ほぼ無し。
3流大学生のコピペ論文を彷彿とさせる。
こんなの真剣に呼んでも絶対わかるようにはならない。
OOP用語の説明は何故かちゃんとしてないのに
php.iniにページさかれてるけど
網羅して無くて中途半端でページ稼ぎとしか思えない。
中身薄くて有名なヤマダヨウカン本の方がマシに感じるレベル。
88:nobodyさん
07/06/17 01:28:20
なんか良く読むと、この本は解説の日本語が
オブジェクト指向で書かれてる気がした。
多分最初にパターン名を記載した時点で、作者の頭の中では
記載されてるページを呼び出してるんだろうと思えてきた。
解説するための日本語はプロシージャ指向で書いてくれと
小一時間問い詰めたい。
この本理解するには色んな本を買って、全部理解した後じゃないと
読めない。意味ねえじゃん。
89:nobodyさん
07/06/17 01:54:28
軽いフレームワークいじって使うのが一番いいオブジェクト指向の勉強だよ
90:nobodyさん
07/06/17 14:22:50
ウェブアプリにオブジェクト指向なんていらないよ。どうせ文字列を加工してデータベースのテーブルのカラムに並べるだけなんだから。
91:nobodyさん
07/06/17 18:51:52
じゃどういうときに必須なんよ
92:nobodyさん
07/06/24 17:09:42
オブジェクト指向と言う言葉にまどわされず、
クラスの勉強をすればいいんだよ。
単に、呼び出してるだけだから。
93:nobodyさん
07/06/24 19:32:38
PEARをサンプルみながら見よう見まねでインスタンス作って
なんだかんだで実際動いてるんだけど何してるかイマイチ理解出来てないんだよね
functionの中でインスタンス作るとその外側ではやっぱアクセスできないのかな
PEARDBのインスタンスがあっちゃこっちゃに散らばっちゃって困る
94:nobodyさん
07/06/25 12:32:57
>>93
プロパティに入れれ
95:1 ◆SWtzLesEmM
07/07/06 14:33:24
>>68
>拡張がやりやすい(やりやすく作ることが出来る)
そうみたいですね。
URLリンク(www.amazon.co.jp)
「オブジェクト指向でなぜつくるのか」
という本にも、クラスを使うメリットが同じように説明されていました。(・∀・)
>>74
Javaの本だと
URLリンク(www.amazon.co.jp)
「やさしいJava」をすすめられました。
>>86
(σ・Д・)σプログラミング初心者ですΣ(゚Д゚*)=3
>>89
Zend Frameworkの正式版が出ましたね☆
URLリンク(framework.zend.com)
シンプルなフレームワークを検索したら、CodeIgniterというのがありました。
URLリンク(userguide.cilab.info)
96:nobodyさん
07/07/08 18:20:46 XFKJF1H9
最近このスレが怖くて見れん俺ガイル
なんでそんな成長早いんだよ・・・おかしいだろ・・・orz
97:テレビできたよー
07/07/10 15:53:51 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:テレビできたよー
07/07/10 15:54:22 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さん
07/07/11 10:41:20
例外投げるようにすれば?
100:1 ◆SWtzLesEmM
07/07/11 12:59:29
例外処理
URLリンク(www.phppro.jp)
2. PHPで例外処理
URLリンク(www.phppro.jp)
PHP5の基本 > 例外処理
URLリンク(www.shigeweb.jp)
phpspot - 例外処理
URLリンク(phpspot.net)
PHP4ではエラー処理といえば、
if ( ($err = func()) != "" ) {
die("エラーです");
}
のように戻り値のチェックをしていましたが、エラーというものは、呼び出し側がエラー制御を行うのではなく、呼ばれた側で、どういうエラーがあったか、というものがあった方が自然で、呼ばれた側がエラー処理を行うため、モジュールの場合より再利用性が高くなるでしょう。
更に上記では、どういうエラーが起こってエラーが出ているのかということが想像しにくいですね。
そこで try~catch です。
■例外処理
URLリンク(www.atmarkit.co.jp)
プログラミングにエラー処理は避けて通れない事項だ。
とはいえ、関数やメソッドからの戻り値を毎回エラーチェックするのは煩雑で面倒でもある。
その煩雑さを回避するため、文法として例外処理を持っている言語もある。
PHP5もそれに倣って、言語仕様として例外処理をサポートした。
文法的にはC++やJavaと同様に、try{ }で投げられた例外をcatch{ }で処理するという流れになる。
↑とのことですが、汎用性のある関数やメソッドにしたい場合、エラーが発生したときの処理を書く場所は、関数やメソッドを使う方(呼び出す側)にすることもあるでしょうか?
=戻り値をチェックするというのは、古いやり方なんでしょうか?
101:1 ◆SWtzLesEmM
07/07/11 13:07:20
>>96
PHPプロのメルマガ読んで、知ったかぶりなだけですw
お互いがんばりましょう☆(・∀・)
102:nobodyさん
07/07/11 14:16:38
いやさ,まず公式マニュアルを読む癖を付けようぜ
103:nobodyさん
07/07/11 14:44:53
MVCじゃないとOOPなんて意味ないですかr
104:nobodyさん
07/07/11 17:30:14
( д) ...。。
105:nobodyさん
07/07/12 02:57:31
MVCもデザインパターンの一種じゃなかったっけ?
106:nobodyさん
07/07/12 08:06:18
>>100
なんかphpspotのその文はおかしいな。
エラー処理は例外を使おうがそうじゃなかろうが変わらない。
呼ばれた側はどういうエラーがあったか返す責任があるし、
呼んだ側は返ってきたエラーをチェックする責任がある。
エラーが起きた時の挙動を自分で決めれるならその場で処理すれば良いし、
そこではまだ決められないならさらに上位へreturnなりthrowすれば良い。
107:nobodyさん
07/07/14 15:28:38 w3CTKtks
OOPってのはアプリケーションをモノに見立てて、それを構成している部品をクラスとして定義する、ってとこまではなんとなく理解した。
例外処理?なにそれうまいの?
108:nobodyさん
07/07/14 18:34:23
ダンボールの味がするお
109:nobodyさん
07/07/14 19:32:25
おまいらオブジェクト指向に騙されてるよ。ただのデータ型に過ぎない。
110:nobodyさん
07/07/14 19:46:31 w3CTKtks
今、習作としてプロフィールスクリプト(っていうのも大袈裟なぐらいショボイやつ)を書いてるんだけど、どうにも悩む。悩む。
とりあえず、
-質問と答え(Entry)
--セッタ(SetQuestion,SetAnswer)
--ゲッタ(GetQuestion,GetAnswer)
-それらのEntryを編集したり、操作したりする(ManageEntry)
--POSTされたデータにEntryの値を変更する(EditEntry)
-プロフィール自体(Profiel)
--質問と答えを出力(ViewProfiel)
こんなクラスたちを作ったんだけどなんかおかしい気がしてならない。
とくにManageEntryのとことか。
ManageEntryでEntryオブジェクトの配列Entriesを作っといてそれをそのクラス内で操作とか?は?え?
OOPムズイ、ナキタイ
スレ汚しスマソ
111:nobodyさん
07/07/14 21:29:40
どんな物を作ってるのかよく分からないけど
ぱっと見で確実に言える事は、個別のクラスが多すぎ。
半分くらい継承とメソッドの追加で済みそう。
今のままだと拡張もやり難そう。
プロフィールが"profiel"なのはつっこんだ方が良いのかな。
CakeとかSynfonyみたいな、ライブラリじゃないフレームワークを
使い込んでソース読んだら、どう設計したらよいか一気に分かるよ。
112:nobodyさん
07/07/14 22:22:33 w3CTKtks
継承とメソッドの追加ってどうやるんですか><;
正直どうやったらいいのか全くわからん。
プロフィール?え?あ?あはあは。
113:nobodyさん
07/07/15 00:13:47
きめぇ
114:nobodyさん
07/07/15 00:19:07
Synfony はつっこんだ方(ry
115:1 ◆SWtzLesEmM
07/07/26 10:21:49
>>106
>呼ばれた側はどういうエラーがあったか返す責任があるし、
>呼んだ側は返ってきたエラーをチェックする責任がある。
なるほど~(・∀・)
呼ぶ側と呼ばれた側のそれぞれでエラーの対処があれば、手堅いですね!
大変参考になりました。
116:1 ◆SWtzLesEmM
07/07/26 10:29:09
掲示板の続きを作りました。
DBにアクセスする機能をクラスにしてみました。
URLリンク(kameleon.s241.xrea.com)
動作サンプル
URLリンク(kameleon.s241.xrea.com)
なんか、>>55さんのアドバイスの形になってませんが…orz
とりあえず、DBアクセスをクラスの形にできたので一歩前進!!!\(^o^)/
117:1 ◆SWtzLesEmM
07/07/26 10:50:37
>>110
おー、ガンバレ~~~☆
>>111
(1) Entryクラス
文章を「書き込む」メソッド、「読む」メソッド、「書き換える(編集)」メソッド、「削除する」メソッドが用意されている。
(2) Entryクラスを継承して、質問用のクラスを用意
=質問のデータだけを操作できる
(3) Entryクラスを継承して、答え用のクラスを用意
=答えのデータだけを操作できる
というかんじになるんでしょうか?
どういうまとまりでクラスにすればいいのか、そこら辺がなんかよく分からないんですよねー(ノ∀`)
118:nobodyさん
07/07/26 10:57:58
どうしてPDOをry
119:nobodyさん
07/07/27 00:44:20
おんにゃにょこの
おっぱい
ぷぴにぷにだにょ~
120:nobodyさん
07/07/28 17:35:02
夏だな
121:nobodyさん
07/07/30 03:51:10
function &foo {
echo "ほげ"
}
こういうやつ、「リファレンスを返す」っていうんですか?
これはどういう処理をしているんでしょうか?
どこかで定義されているfoo()という関数に何かしているんですか?
122:nobodyさん
07/07/31 07:40:25
高機能な参照関数だな
123:nobodyさん
07/08/01 06:30:28 abLVM2kM
>>87
買ってしまっていたよ。Iteratorまで読んだけど、
分かったような分からないような気分。
説明が少ない&下手なのは分かった。
124:nobodyさん
07/08/01 22:18:22
分からない人に分かるように書いてないという意味では同意。
書いてあることを全て理解していこうとするとこんがらがってくるしね。
まぁいい頭の体操になったけど。
あんなサンプルのためのサンプルではなく、具体的な使い方と利点が書いてあるとOOP素人にも理解しやすかったかもね。
125:522
07/08/26 13:53:57 QzPwO1Nh
>>117
なんかCakePHP使ってみたんだけど質問と答えを操作するクラス作って云々みたいになって結局>>110と同じような感じになっちゃいましたとさ・・・
「モノ」に書く機能とか読む機能持たせていーの?おしえてえろいひと><
126:nobodyさん
07/08/26 14:28:30
お前が「モノ」をどう捉えるか次第だよ
127:nobodyさん
07/08/28 02:25:00
結局どうやってデータを保持したら、人間にとって分かりやすいか、コンピュータにとってやさしいかってことだろ。
128:nobodyさん
07/10/03 02:51:35
オブジェクト指向は木構造を再現しようとしているだけ。
インスタンスだのオブジェクトだのは枝、茎、葉、花、果実を作るというだけ。
mainでは結果(果実)だけをとりたいから枝やら茎やらは見えなくしとけってことだろ?
129:nobodyさん
07/10/03 16:27:59
>>128
まあそんな感じだ
130:nobodyさん
07/10/03 23:45:33
まぁ、ファイルの管理方法も木構造だし、インターネットなんていっても網状でなく、
サーバーを経由した木構造になってることから演算機が理解しやすいデータ構造は木構造である。
こういってしまっても過言ではないと思う。
例えば、手続き型は東京の小さなバイク便が地方への配達を頼まれても東京発で請け負うみたいなもの。
それに対して、OODはヤ○ト運輸が東京で頼まれた配達を一旦、地方の配送センターに送るようなもの。
配達する対象が少なければ、バイク便に頼んだ方が早いかもしれないけど、数が多くなるとヤ○ト運輸。
131:nobodyさん
07/10/05 01:16:19
うん、ここ数日でオブジェクト思考勉強してて分かったこと。
ちなみに128==130==漏れです。
・オブジェクト指向は木構造
・目的は種の存続、繁栄
・ここでのフローは一つずつだが、間にどれだけの枝が挟まるかは設計次第
クラス設計
種(プリプロセッサ)から芽が出る(この時点では手続き型でも、OODでもない)
根クラス…main関数、もしくはmainクラスの設計、遺伝子(設計の違いで木になるかどうかが決定)
幹クラス…根から養分を吸い上げる(大まかな工程の分類)
オブジェクト生成
枝クラス…効率的に日光を取得できるよう枝を伸ばす(コンストラクタ)
葉クラス…光合成を行い、自己生産を行う(メソッド)
葉緑素クラス…目立たない頑張り屋さん(ライブラリ)
花クラス…実となるか枯れ落ちるか(オブジェクト)
実行結果
果実クラス…土に還り、新たな種となりました(プロジェクト成功)
132:nobodyさん
07/10/05 20:07:34
なんかすぐ動いて実用的で簡単なサンプルください
133:nobodyさん
07/10/05 20:35:14
package hoge;
my $class=shift;
$ENV{'TZ'} = "JST-9";
my ($sec,$min,$hour,$mday,$mon,$year) = gmtime(time + 9*60*60);
my $obj={'sec'->$sec, 'min'->$min, 'hour'->$hour, 'mday'->$mday, 'mon'->$mon, 'year'->$year};
return bless $obj, $class;
1;
適当に書いてみた。あとは時間をゴニョゴニョするだけ、普通に作ったほうがメリット大きい気もするがキニシナイ!!
ヨウカソマソ参上===[・∀・]ノシ
134:131
07/10/05 23:40:29
実際に設計して、作ってみるとオブジェクト指向の本質は"同じことは出来るだけ"しない。
この論理で動いてるような気がしてきた。何でもかんでもオブジェクトにするのではなく、
運搬の頻度が激しいデータ、プログラム中で何度も使用するデータをオブジェクトにする。
そんな感じで合ってるのかな?あと、変数の受け渡しは原則、参照で行うみたいな。
135:131
07/10/06 13:37:33
何となく掴めてきた。もっかい木構造で表してみる。
根: プリプロセッサ、送信データ(実行役)
幹: main(効率よく栄養=処理を振り分ける)
[クラス]・・・大規模にもなるとこれが幾重にもネストされる。
枝: コンストラクタ(葉に栄養=処理を割り振る、葉で生成された養分=オブジェクトを幹に伝える)
葉: メソッド(オブジェクト=養分を生成する)
花: オブジェクト(実行結果=果実の手前)
果実: 実行結果(主の繁栄=実行結果が真)
ちなみに実行結果が偽となるのは幹から花に至るまででエラーが起こった場合。
漏れルール
mainは基本的にクラスに指示を与える以外しない。
コンストラクタでオブジェクトの用意を行う。
メンバメソッドはオブジェクトの加工を行う。
コンストラクタからオブジェクトを返す。
mainは次に必要なオブジェクトを作るクラスへ処理を回す。
136:nobodyさん
07/10/07 12:52:54
日曜日1GET!
始めまして
まだPHP3ヶ月目ですが早くもオブジェクト指向で挫折><
ちなみに
・「基礎PHP」
・「PHP5であなたもウェブアプリが作れる!」
・「速効!図解プログラミングPHP + MySQL」
を参考書にしています。
分かりやすかったのは基礎PHPです。
掲示版からスケジュール管理に移るところで
Smarty関連を追加するため承継とか出てきてなるほどと思いました。
ただソース理解しても自分では何もできないんですけどねw
137:nobodyさん
07/10/07 19:12:30
掲示板の改良はどうします?
138:nobodyさん
07/10/07 21:04:45
丸投げします
139:nobodyさん
07/10/07 21:09:36
OOPで作ったやつの
ソースとかうpったら
なんか色々言ってもらえるんかな?
このスレでは
140:nobodyさん
07/10/07 21:46:16
>>139
自分も変なソースですけど味見してもらえます?
恥ずかしいです><
141:nobodyさん
07/10/08 09:30:37
>>133
これをどうやって使えばいいんですか
142:nobodyさん
07/10/08 19:27:30
なかなか面白いブログを発見しました。
ぜひ皆さんに見てもらって意見聞きたいな^^
URLリンク(blogs.itmedia.co.jp)
143:nobodyさん
07/10/09 22:34:59
MVCのコントローラについてどこまでクラスにするか迷っています・・・
144:nobodyさん
07/10/10 16:06:50
ハァ?
145:nobodyさん
07/10/12 03:46:51
意味わかんね
どこまでクラス?
146:nobodyさん
07/11/12 13:32:18
まずはモデルでしょ
147:nobodyさん
07/12/13 08:37:25 Q/a8rTy0
SPLって使ってる人実在するの?
URLリンク(jp2.php.net)
148:nobodyさん
07/12/14 02:09:52
例外はよく使う
149:nobodyさん
07/12/19 01:29:29
>>147
読み込んでも八割がた無駄なので使わない
150:nobodyさん
07/12/23 12:51:26
かしゆか誕生日おめでとう!
URLリンク(www.tkma.co.jp)
151:nobodyさん
07/12/24 10:55:41
>>149
つりですか?
152:nobodyさん
07/12/29 00:05:37 4ZpocZiG
MVCのCってどうやって書けばいいのかわからんぜ。
153:nobodyさん
07/12/29 02:00:56
その概念中でコントローラーが理解出来ないってやつ初めてみた
とりあえずView上で必要な操作を徹底的にControllerに切り離すが良い。
そしてModelからデータを引き出して必要があれば書き込み更新してやりなさい。
154:nobodyさん
07/12/31 19:44:35
ユーザークラスで新規登録処理をして、そのときにユーザークラスの中で
プロフィールクラスのオブジェクトを作ってプロフィールの登録もする
これってしいて言えば何パターン?
155:nobodyさん
07/12/31 19:47:57
ワンパターン
156:nobodyさん
08/01/01 00:16:32
パターンというかコンポジションでそ
157:nobodyさん
08/01/29 11:18:04
模範解答は無いけれど、以下の相互変換を行うクラス(ChStr)をみんなで
作ってみるという案はどうかな?
そして、これが出来たら、ログファイルに保存などの機能をつけ、
wikiみたいに編集が出来る機能を追加していくという感じに。
<編集>
-------------------------------------------------------------
= 2ch
'''2ch'''とは、総合掲示板のことである。
link:[URLリンク(www.2ch.net])<)">URLリンク(www.2ch.net<)
-------------------------------------------------------------
158:1 ◆SWtzLesEmM
08/01/29 11:29:32
>>157
OOPの勉強というよりも、どちらかというと正規表現の勉強になるでしょうか?
wikiのパーサーつくるなら、既存のwikiスクリプトや、PEARのText_Wikiが参考になるかもしれませんね。
URLリンク(www.phppro.jp)
PEAR::Text_Wiki 1.2.0RC1 リリース 2006年10月11日
URLリンク(labs.cybozu.co.jp)
Text_PukiWikiリリース
159:nobodyさん
08/01/29 11:43:55
>>158
C++のOOPの勉強として、文字列を簡単に扱うことが出来るクラスを
自作してみるという演習があったので、それをPHPでもやってみようかなと
思ったものです。
Cでは、文字列を結合したり、splitしたりするのが結構大変なので、
この演習が役に立ったなと思っていたのです。
PHPの場合は、関数を使えばそれで終わってしまうので、もう少し
ひねりを入れたものを考えて見ました。
正規表現を練習するというよりも、正規表現とhtmlの相互変換をする
クラスがあると、プログラムをする際、便利だなという事が実感
出来るのでは?という意味合いです。
(例)正規表現を格納し、html出力する過程。
$text に textarea タグの文字列を格納する。
$str = new ChStr($text);
echo "<html><body>";
$str->Write_html();
echo "</body></html>";
ほら、このクラスがあるとレイアウトを変えたりが、やり易い上に
再利用性が高いでしょ?みたいな。
160:1 ◆SWtzLesEmM
08/01/29 11:47:24
OOPの参考になる解説がありました。
PHPのclass、オブジェクト指向プログラミングに関する質問です。
URLリンク(q.hatena.ne.jp)
↑
2番の回答者の解説が分かりやすいと思いました。
6番の回答者のサンプルコードも参考になりましたが、これは「インターフェース」の利用方法ではありませんね。><
インターフェイス
URLリンク(www.phppro.jp)
あるクラスが実装する必要があるメソッドの種類を、これらのメソッドの実体を定義することなく、指定するコードを作成できるようになります。
インターフェイスはキーワードinterfaceにより定義され、通常のクラスと同様に定義することができますが、メソッドの実装は全く定義されません。
161:1 ◆SWtzLesEmM
08/01/29 12:00:16
>>159
なるほど!(・∀・)
文字列を扱う処理は、いろんなところで出番がありそうですね!
wikiの文法(表記方法)が使える掲示板とか作れそう^^
162:nobodyさん
08/01/29 12:04:23
ChStr クラス の設計はこんな感じかな。
メンバ
private $m_str; // 正規表現文字列を格納する。
コンストラクタ
ChStr($str) // 正規表現の文字列を受け取る。
private メソッド
ch_to_html() // 正規表現をhtmlに変換する。
public メソッド
Write_html() // 格納している文字をhtmlで出力する。
Write_text() // 格納している文字を正規表現で出力する。
---------------------------------------------------
本当は、ログファイルへの保存や読み取りなどを機能として
考え、そのあたりまで含めたクラスの設計をした方が
いいんだろうけれど、まずは簡潔にする方向でいきます。
で、後々拡張の方向で。
163:1 ◆SWtzLesEmM
08/01/29 12:04:44
PHPのインターフェースは、Javaとかのインターフェースとはちょっと違っているみたいですねー。><
(…使ったことないので実感がありませんが^^)
PHPでは実装済みのinterfaceを多重に実装できない
URLリンク(blog.xole.net)
URLリンク(blog.xole.net)
164:1 ◆SWtzLesEmM
08/01/29 12:25:09
>>162
こんなかんじのプログラムと似ているかもしれませんねー。
60行で作るPHP用テンプレートエンジン
URLリンク(anond.hatelabo.jp)
>テンプレートの中身を置換する
>function convert_string($s)
↑置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
= 文字サイズ変更、''' 強調、link: リンクとかの記法の置換を担当するprivateメソッド
165:1 ◆SWtzLesEmM
08/01/29 12:34:03
OOPの参考になる解説がありました。
関数、オブジェクト、クロージャ
URLリンク(d.hatena.ne.jp)
>オブジェクトは、データに処理がくっついたものです。
>array.map()のように、後に後に処理を追加していく書き方は、順にコードを追えるため読みやすく、また書きやすいです。
クロージャっていう仕組みは、PHPにはないですね?><
大は小を兼ねる…クロージャの代わりにオブジェクトが使えればとりあえずOKかな?(・∀・)
166:nobodyさん
08/01/29 13:15:31
>>161
>wikiの文法(表記方法)が使える掲示板とか作れそう^^
PEARのText_Wiki使えばよくね?
167:nobodyさん
08/01/29 13:18:38
>>164
> 置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
本来ならば、そうなるでしょうね。それらはすべてprivateで作っておいて、
外部には、一つのインターフェースのみ(この例の場合はWrite_html()がそれに該当)
公開となるでしょう。
記号ごとに別々にメソッドを定義しておけば、記号とhtmlの関係が変わる時は、
どのメソッドを触ればよいかが分かるし、それを変更したことで、
他のメソッドには影響は無かったりします。
(これが構造化プログラムの場合は、目的のソースと目的ではないソースを
見極めるところから始まります。)
-------------------------------------------------------------------------
この ChStr に汎用性を持たせる場合は、Write_html()というよりも、
Get_html()とし、html文字列を return する事になるでしょう。
そうすると、別なプログラムで、「出力結果をファイルに保存する」という
使い方も出来ます。しかし、今回は初回なので、Write_html()とし、
メソッド内部で echo 使うことにします。
168:nobodyさん
08/01/29 13:22:48
>>166
学ぶために具体的に物を作るのと、実用性を考えて物を作るのは
別だと思う。なので、今回はこれでいいと考えている。
現に、初心者向けの書籍に載っているソースの実用性はゼロだ。
169:nobodyさん
08/01/29 13:59:05
とりあえず、全体構成の確認のために書いてみた。
ch_to_html()は、追記の必要性がある。
[chstr.php]
<?php
class ChStr {
// メンバ
var $m_str_reg; // 正規表現文字列を格納する。
var $m_str_html; // html文字列を格納する。
// コンストラクタ
// 正規表現の文字列を受け取る。
function ChStr($regstr) {
$this->m_str_reg = $regstr;
$this->ch_to_html();
}
// private メソッド
// 正規表現をhtmlに変換する。
function ch_to_html() {
// 改行を<BR>に変更する。
// nl2br($this->m_str_reg) 使った方がいいかも
$this->m_str_html = ereg_replace("\n","<BR>",$this->m_str_reg);
}
// public メソッド
// 格納している文字をhtmlで出力する。
function Write_html() {
echo $this->m_str_html;
}
// 格納している文字を正規表現で出力する。
function Write_text() {
echo $this->m_str_reg;
}
}
?>
170:nobodyさん
08/01/29 14:03:31
[index.html] 最初に開くファイル。
<html><body>
<form method="POST" action="./text.php"><textarea name="reg_text" cols=40 rows=4>
あああああ
いいいいい
ううううう
</textarea><br>
<input type=submit value=" 送 信 "></form>
</body></html>
[text.php]
<html><body>
<?php
include("./chstr.php");
$in_text = $_POST["reg_text"];
$chst = new ChStr($in_text);
$chst->Write_html();
?>
</body></html>
171:1 ◆SWtzLesEmM
08/01/29 14:10:04
>>166
確かにそうなんですが、「勉強のため」という目的もあるので、自分で作ってみるというのもありでしょうか?^^
でも、答えが分かっている問題を解くのは楽ですね。>Text_wiki
車輪の再発明 - Wikipedia
URLリンク(ja.wikipedia.org)
車輪の再発明とは、「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまう事」を意味する
ある技術の意味を理解させるために、意図的に車輪の再発明を行わせる場合がある
172:1 ◆SWtzLesEmM
08/01/29 14:19:35
wikiとか文字列を処理する仕組みは、「パーサー」とか「構文解析」っていうみたいですね(´∀`)
構文解析 - Wikipedia
URLリンク(ja.wikipedia.org)
今までにいろんな仕組みが考えられてきたみたい。
…本格的にやると奥が深そうだけど、一度仕組みを勉強しておいたら、いろいろ使えそうな予感!(・∀・)
↓wikiの仕組みを自分で作っている方は結構いるみたいですねー。
PHP用の汎用WikiParser作り中
URLリンク(tdiary.ishinao.net)
RandomNote/PHPについて
URLリンク(tbox.jpn.org)
173:nobodyさん
08/01/29 14:21:38
今後の課題と予定
・ch_to_html() の中身を書く。
・[text.php] の機能を充実(テキストファイルに保存するなど)させ、wikiを作る。
・上記とは別に、 ChStr クラスを使い、BBSを作る。
・ChStr クラスに clear()、SetStr() 等のメソッドをつけ加え、汎用性を持たせる。
174:1 ◆SWtzLesEmM
08/01/29 14:38:20
URLリンク(tbox.jpn.org)
RandomNoteのMain.phpは参考になるでしょうか?
preg_match
preg_replace
array_push
array_pop
などの関数を使って、文字列の切り貼りをしてるんですねー。
175:nobodyさん
08/01/29 14:39:05
OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
メソッドの中でstringをreturnせずにecho使うのは>>167で書いてるように汎用性って面もあるけど
処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
176:nobodyさん
08/01/29 15:39:09
>>175
> OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
OOPについて説明するとなると、具体的なソースコードとは離れた方が
良くなったりしますからね。
(クラスの使い方書いているように見えるとしても、)PHPでclassを
組む場合のメリットみたいな位置づけで学んでいこうと思っています。
> 処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
確かに汎用性以外にそういう目的もありますね。
次のものでstringで返すように書き換えます。
177:nobodyさん
08/01/29 18:16:08
htmlのformのコードもクラス化するのが本当の流れんだろうけれどな。
いきなりそれをやると分かりにくくなるかな・・・
178:に ◆lKs5QMUHoA
08/01/29 19:20:19
ChStrクラスのサンプルソースを投稿してた者ですが、
今までnobodyさんで書いてたけど、分かりにくくなるかと思ったので
酉入れるようにしてみます。
>>5に書いてあるように、オブジェクト指向は「変数を保持できる事」が
メリットだと思うのですが、これがWebアプリだとどうも実感が無かったりします。
リッチクライアントだと、マウスのクリックに合わせて、メソッドが呼び出され、
そのアプリケーションが終了するまでの間、各種オブジェクトの中の変数に
状態が保持されるという構造なので、そのメリットが感じられるのですが、
Webアプリでは、POSTする度にオブジェクトの変数の状態はリセット
されてしまうので、クラスを書いたとしても、結局はグローバル変数から
各種オブジェクトの変数に代入するみたいなコードを書かなくては
ならなくなってしまうので、このメリットがあるのかと思ってしまうのです。
これは、勉強不足だからなのでしょうか。。。
179:nobodyさん
08/01/29 22:51:04
>>160
他の人の話のほうがよっぽど核心を突いてるよ
180:nobodyさん
08/01/29 23:05:47
>>160のはてなのリンクの4番目の話、2chの別の板でも
読んだことがあるけれど、この話本当なの?
具体的に何処でどういう商売をしての話なんだろうか。
アプリケーションを売る話?それとも開発環境用のソフトを売る話?
181:nobodyさん
08/01/30 21:59:22
ピュアな意味でオブジェクトを操作したいなら
ボタンのクリックに関する全ての画面遷移に関してserializeとunserializeを管理する必要があるだろ
<?php
require_once("hiroyuki.class.php");
$hiroyuki = unserialize($_SESSION["hiroyuki"]
182:nobodyさん
08/01/31 07:20:40 NaJ3keB3
>>178
ユーティリティクラスの再実装みたいな事を熱心にやっても
あまり意味が無いと思いますよ。
まさにあなたの言う「いちいち書くのがめんどくさい」のを回避する為に
OOPがあるんだと思います・・・
OOPの勉強なら、簡単なWEBフレームワークを自作するのが一番良いよ。
知識の無い段階でいきなりPHPでOOPって無理だと思いますよ。
背伸びせず、まずjavaやC#を学習する方が近道かもしれないよ。
183:nobodyさん
08/01/31 08:15:31
.NET 以降の VisualBasic ってどうなの?
184:nobodyさん
08/01/31 17:31:43
MVCモデルにそって、ユーザの入力データと、CSVファイルのデータを
読み込んで表示させるというものを作ってみました。
ファイル:全部で5つ。index.phpを実行する。
cfcontrol.php
cfview.php
index.php
cfmodel.php
csv.txt
[csv]
aaa,bbb,ccc
[index.php]
<?php
include("./cfcontrol.php");
$form_str = $_POST["form"];
$in_str = $_POST["key"];
$form = new CFControl($form_str, $in_str);
?>
185:nobodyさん
08/01/31 17:32:35
[cfcontrol.php]
<?php
include("./cfview.php");
include("./cfmodel.php");
class CFControl{
function CFControl($form_str, $in_str){
if( ($form_str == "")or($form_str == "in") ){
$form = new CFView("index.php","in","");
$form->Write_HTML();
}elseif($form_str == "out"){
$da = new CFModel();
$dat = $da->ReadDat($in_str);
$form = new CFView("index.php","out", $dat);
$form->Write_HTML();
}
}
}
?>
186:nobodyさん
08/01/31 17:33:57
[cfmodel.php]
<?php
class CFModel{
var $m_csv_file;
// コンストラクタ
function CFModel(){
// 読み込むCSVファイルを指定
$this->m_csv_file = "csv.txt";
}
// データを取り出す。
function ReadDat($str){
$INFILE = fopen($this->m_csv_file,"r");
$line = fgets($INFILE, 1024);
fclose($INFILE);
$line = $line . ", " . $str;
return $line;
}
}
?>
187:nobodyさん
08/01/31 17:37:50
[cfview.php](1/2)
<?php
class CFView{
var $m_file; // POSTするファイル名
var $m_type; // 表示するフォームの種類。in か out
var $m_line; // 表示するデータ
// コンストラクタ
function CFView($file, $type, $line){
$this->m_file = $file;
$this->m_type = $type;
$this->m_line = $line;
}
// private
function in_html(){
echo "<html><body>";
echo '<form method="POST" action="' . $this->m_file . '">';
echo '<input type="hidden" name="form" value="out">';
echo '<input type="text" name="key"><input type="submit" value="送信">';
echo "</form></body></html>";
}
188:nobodyさん
08/01/31 17:39:35
[cfview.php](2/2)
// private
function out_html(){
echo "<html><body>";
echo '<form method="POST" action="' . $this->m_file . '">';
echo '<input type="hidden" name="form" value="in">';
echo "$this->m_line<br>";
echo '<input type="submit" value="戻る"></form></body></html>';
}
// public
function Write_HTML(){
if($this->m_type == "in"){
$this->in_html();
}elseif($this->m_type == "out"){
$this->out_html();
}
}
}
?>
189:nobodyさん
08/01/31 17:51:38
フレームワーク使えば?
190:に ◆lKs5QMUHoA
08/01/31 19:03:23
とりあえず、MVCに分けて枠組みを作ってみたけれど、
これをより抽象化させていって、「継承して使ってください」という
方向にするのか、それとも最初はクラスの数を増やさないように
しながら簡単なアプリケーションを作る方向にするべきか。
どっちの方向に持っていったほうがいいのか迷うな。。。
ま、そんなことを考える暇があったら手を動かしてみろという
話なのかもしれないが。。
191:nobodyさん
08/01/31 19:08:05
>>190
自分で考えるのも良いが、君が今やっていることを
やってしまっているのが、フレームワークだ。
まず既存のフレームワークがどうなっているのか参考しろ。
192:nobodyさん
08/01/31 19:44:25
俺も初心者だからこれが最善とは言い切れないけど
newするときに全部引数で渡すってのはナシじゃね?
分かりやすいところだけ書き出すと
[index.php]
$form = new CFControll();
[cfcontrol.php]
コンストラクタ()
{
$form_str = $_POST['form'];
$in_str = $_POST['key'];
if(inだったら){
$view = new CFView();
$view->m_type = 'in';
$view->Write_HTML();
}
}
[cfview.php]
メンバ変数
var $m_file = 'index.php';
var $m_type = false;
var $m_line = null;
193:192
08/01/31 19:50:52
フレームワーク使ってみろっていうのは賛成
疎結合にとかDRYにっていうのがだんだんわかってきた
理解したところで戻ってきて~の方が結果的に早そう
俺はまだ勉強中だからそこまで行ってないけど
194:に ◆lKs5QMUHoA
08/01/31 19:56:23
>>192
> $view = new CFView();
> $view->m_type = 'in';
これみたいに、直接メンバにアクセスするのは構造的に良くないと聞いたことが
あるよ。「データをやり取りするのは、インターフェースを通じて」という原則を
守るべきだと。
そうしなければ、CFViewクラスを改変する人は、そのクラスを使っている人の
コードを考慮して、メンバの値や変数名を自由に変える事が出来なくなるから。
なので、私は、コンストラクタで値を渡しても良いし、コンストラクタで値を渡して
いなければ、値を渡すためのインターフェースを使って渡すようにする仕様が
適当かなと思っている。
195:192
08/01/31 20:08:35
汚染されちゃうけどコンストラクタで全部の値渡すよりはましじゃないかなあ
あとコンパイルするときに全部チェックしてくれる言語とそうじゃない言語ってのもある
phpなんだしゆるーくやればいいじゃん なんていうと怒られるかw
196:に ◆lKs5QMUHoA
08/01/31 20:13:09
今調べて知ったのだが、オーバーロードは PHP ではできないらしい。
だったら、コンストラクタで値を渡すよりも、インターフェースで値を
設定するような仕組みになるだろうね。
コンストラクタだと、一度値を設定したら、そのオブジェクトが破棄される
まで、再度設定が出来なくなるから。
197:nobodyさん
08/01/31 20:22:00
メンバ変数へのアクセスはsetter/getterを使う。これは議論の余地なし。
それを用意した上でコンストラクタに引数を渡すなら渡せば良い。
複雑で多くの設定をしなきゃならない時以外、
newした直後に使える状態になっている方が使いやすい。
> $view = new CFView();
> $view->m_type = 'in';
これをセットで書かなきゃならないなら、
> $view = new CFView('in');
と書きたい。
198:に ◆lKs5QMUHoA
08/01/31 20:26:00
私は>>197さんの意見に同意だ。
「このモジュールを使う場合、このように書いてくださいね。」
というコードは、なるべく少ない方がいいからね。
なので、とりあえず設定の値はコンストラクタにいれるという
設計で書いてみた。
199:に ◆lKs5QMUHoA
08/01/31 20:31:34
とりあえず、フレームワークを使ってみろという話が出ているが、
具体的にどのフレームワークを使って、どんなプログラムを書いて
みたらいいのか迷うなぁ。
とりあえずはこのあたりに載ってるものの、「和モノ」あたりからかな。
スレリンク(php板:3番)
フレームワーク自体の自作の話もいくつかあるみたいだ。
URLリンク(codezine.jp)
200:192
08/01/31 20:36:05
viewに渡すデータはセッタで渡したくならない?
あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の仕事なんじゃないかなと思うんだけど違うかな
201:192
08/01/31 20:42:33
いや、見直したらそう書いてた
ごめん気にしないで
202:に ◆lKs5QMUHoA
08/01/31 20:46:31
>>200
> viewに渡すデータはセッタで渡したくならない?
表示させるデータはセッタがいいだろうね。
> あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の
> 仕事なんじゃないかなと思うんだけど違うかな
>>185のソースがそれにあたるものだと思ってたけど。
if( ($form_str == "")or($form_str == "in") ){
省略
}elseif($form_str == "out"){
省略
}
コントローラは、POSTしてきた値を見て、必要なModelやViewを
選択し、実行する役割なので、それを実現したつもり。
203:に ◆lKs5QMUHoA
08/01/31 21:58:27
厳密にMVCを分けることは出来ない場合もあるということだけど、
CFControlクラスで、CFViewを使って表示する内容までもを
指定していする処理を書いていたのは間違いかな?
検索結果の表示や、データの更新の場合は、
Control→Model→View だけど、
ボタンを押した時の画面の展開のみの場合は、
Contol→View という流れとなり、Viewオブジェクトを
生成するクラスが異なるという処理でいいのかな?
204:に ◆lKs5QMUHoA
08/02/01 07:38:53
「とりあえずはフレームワークを使ってみろ」という返事がきそうだけど、
各クラスの役割は以下のような感じでいいかな?
Control
・POSTでデータを受け取り、その値に不正なものが無いかをチェック。
・変なところからのアクセスではないかをチェック。
・$_POST["Form"]の値をみて、それに必要な画面と処理を判断する。
Model
・SQLを発行し、データを受け取る。
・データをViewクラスに渡す。
View
・フォームを表示する。(フォームごとにクラスを分けたほうがいいのかは迷うな)
・データを1件受け取り、tableタグでレイアウトを調整し、表示する。
205:nobodyさん
08/02/01 09:44:17
とりあえずはフレームワークを使ってみろ
206:nobodyさん
08/02/01 11:08:23
自分なりに調べて見つけたPHPのサンプルを使った解説ページも
読むとwebアプリについて学べるのではないかと思っている。
やることが多くなったけれど、とりあえずは以下の3本だてで
勉強してみることになるのかな。
MVCに分けて、簡単なアプリを自作する。
(ログイン、メニュー、検索条件指定、検索結果、データ編集などの画面があるもの)
和モノフレームワークを使って学ぶ。
簡単なアプリを自作する。
スレリンク(php板:3番)
サンプルで理解! フォームデータの受け渡し
URLリンク(www.atmarkit.co.jp)
207:nobodyさん
08/02/01 12:06:10
ちいたんのソース見てみたけれど、
class CObject ってあって、必ずそれが継承されて作られてるよね。
これの都合って何なんだろう。(メリットは何?)
javaも.NETもこういう基本クラスがあるよね。
208:nobodyさん
08/02/01 12:19:15
全部のクラスに共通するメソッド等が実装できる
209:nobodyさん
08/02/01 13:06:22
>>208
サンクス。
でも、オーバーロードが出来ない場合は逆に足かせになる可能性もあるね。
例えば、継承されているクラスが沢山ある状況でObjectクラスに
メソッドを追加する場合とか。
210:nobodyさん
08/02/01 16:28:22
喋るのはコントローラとモデル
コントローラとビュー
基本的にはね
211:nobodyさん
08/02/01 16:49:11
少ない数のクラスを書いたり読んだりする程度であれば、すぐに分かるのだが、
フレームワークレベルのクラス構造となると、その構成が全く分からなくなって
来るんだよなぁ。何かコツのようなものはあるのかな?
処理の内容を追いかけると、次々に別のクラスに処理を渡す構造になっていて、
最後はあっけない、みたいな感じだ。
フレームワークを作る場合のクラスの設計手法を身につけるなどしないと
いけないのかも。
メンバに定義はしていないけれど、メソッドではその変数をエラーが
出ないように処理が書かれているっていう書き方は多いようだ。
そうしておけば、そのフレームワークを使う人は、クラスを継承して
メンバに値を代入するだけで良い。
212:nobodyさん
08/02/01 18:37:23
このサイト、説明は分かるのだが、具体的に作っているコードは
MVCのうちどれにあたるのかがいまいちです。
URLリンク(www.stackasterisk.jp)
Result.php は、Viewにあたるものという解釈でいいんですよね?
213:nobodyさん
08/02/01 18:47:22
PHPでMVC関連のサイトを紹介で貼っておきます。
特集:第3回 PHPを思うままに操れるようになる「MVC」と「Smarty」 (1/4)
URLリンク(www.itmedia.co.jp)
214:nobodyさん
08/02/01 18:50:51
2004年って・・・・・・・
215:nobodyさん
08/02/01 20:08:38
OOPに取り付かれている人のブログ
ハタさんのブログ : : php
URLリンク(blog.xole.net)
216:nobodyさん
08/02/02 07:42:39
PHPでね、イベントドリブンなWEBフレームワークとか自作してみるといいかも。
例えば、サブミットボタンの処理ハンドラがオーバーライドで記述可能で
そこでフォーム値をモデルに渡して処理させるみたいなやつ・・
「POST」や「GET」とかローレベルの概念は全て隠蔽されてて
フレームワークにイベント発生時のロジックだけ記述して終わりみたいなの・・・
そしてPHPであれこれ試行錯誤したあと、ASP.NETとか参考にするとね
PHPでOOPするバカらしさに気付くかもしれない・・・OTL
217:に ◆lKs5QMUHoA
08/02/02 08:25:40
ASP.NET は、ちょっとだけやってみたことあるけど、概念的に違和感が
あって、やらなくなったな。
ある程度Webアプリを学んだ事のある人には便利なんだろうけれど、
初めて学ぶ人には、ドキュメントが少なすぎだし、いきなりイベントドリブンで
やるのはどうかと思った。
で、まずは、Webアプリの基礎をやるという意味合いでPerlをやってみた。
で、今はPHPをやっている。PHPそのものがOOPに完全な対応をしていない
ので、これで大規模なアプリを組むことも無いかなと思っている。
対応したとしても、それからノウハウが出てくるので、さらに数年先になる。
でも、学ぶ時は、既存のモジュールを使って早くやるのよりも、モジュール
なしの状態で、モジュールを作ってみる方がいいので、とりあえず今は
PHPでOOPです。
218:nobodyさん
08/02/02 09:56:37
>>217
多分、その違和感のある概念がOOPの本質だと思うよ。
そしてその概念は、洗礼された実装に触れることでしか
身につかないとも思うんだ。
初心者こそイベントドリブンを真っ先に学習したほうがいいよ。
最終的に、理解し易く安全な実装方法に結びつくと思うからね。
PHPでOOPで実装ってケースはありだとは思うけど、
概念は別で学習した方が効率的だと思うんだ。
219:nobodyさん
08/02/02 13:32:52
OOPに取り付かれているとか良くわからんw
普通にプログラミングしていると使うだろ?
switchに取り付かれているとかそういうレベルに聞こえるんだが。
220:nobodyさん
08/02/02 15:21:16
MVCモデルでプログラミングする場合、Model から View へ処理を渡す経緯は、
どっちが正しいのかな?
・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
Control クラスが、Model からデータを受け取り、View クラスへデータを渡し、
描画指示を出す。
・Model クラスのメソッド内で、View クラスのインスタンスを生成する。
Model クラスが、Viewクラスへデータを渡し、描画指示を出す。
Control クラスは、View クラスを一切操作しない。
それとも、こういうところまでは理論的には定めていないので、
ケースバイケースであり、どちらがよいというものは無いということかな?
221:nobodyさん
08/02/02 15:36:53
お前は何を言ってるんだ
222:1 ◆SWtzLesEmM
08/02/02 16:44:49
PHPでイベントドリブンですか?(・∀・)
…こんなのありました。^^
PHP イベントドリブン に一致する日本語のページ 約 10,600 件
●PRADO
URLリンク(www.pradoframework.com)
>PRADO はコンポーネントベースかつイベントドリブンなウェブアプリケーションを開発するためのPHP5フレームワークです。
●S2Prado.PHP5
URLリンク(labs.s2php5.jp)
URLリンク(blog.xole.net)
>S2Baseの方は待望のPRADO対応。
●Piece Framework
URLリンク(trac.piece-framework.com)
>Piece_Unityは、Visual BasicやDelphiのようなイベントドリブンなフレームワークです。
●Delphi for PHP
URLリンク(www.codegear.com)
URLリンク(orz.qzlab.com)
>イベントドリブンなロジックの実装が容易に実現する。
●Pharon
URLリンク(pharon.lolipop.jp)
>最大の特徴は、wizard によりイベントドリブン型のスケルトンを自動作成することです。
223:1 ◆SWtzLesEmM
08/02/02 17:00:36
インターネット越しにイベント処理をさせるのが、WEBプログラミングの特徴ですね。
イベントドリブンは、PHPよりもむしろFlash/Flexとかで使われる仕組みなのでしょうか?
レガシーの中心でのOOP
URLリンク(kaede.to)
>Webプログラミングにおいて、ブラウザとのやり取りがレガシー(古典的)なデータ交換に過ぎず、これがWebプログラミングを難しくしている
>Webは1ページごとに毎回セッションが起動し、ドキュメントを表示するとすぐ終了する。
>オブジェクト指向プログラミングにおける利点の1つであるイベントドリブンなプログラミングは不可能だ。
>何しろ1セッションに1イベントしか発生しないのだから。
>と同時にセッション状態を保存する必要も出てくる。
URLリンク(www.adobe.com)
>インタラクティブ性に優れたイベントドリブンなインタフェイス
URLリンク(www.atmarkit.co.jp)
>イベント処理によってアプリケーションを構築する手法はイベント駆動型(イベントドリブン)と呼ばれます。
URLリンク(www.azul.systems-noel.jp)
>Flex2はイベントドリブンなので、ビューに起こったイベントをコントローラのリスナでキャッチするように意識すれば、MVCの分離はきれいにできるようになっています。
>なんかほんとにJavaのSwingを使ってるような気分になりますね。
URLリンク(bitmap.dyndns.org)
>イベントドリブンモデルには、主に以下の 4 つのオブジェクトが登場する。
224:1 ◆SWtzLesEmM
08/02/02 17:05:16
>>220
>・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
こっちの方が、Controlにまとまっている分だけスッキリしており、分かりやすいコードになるんじゃないでしょうか?
225:nobodyさん
08/02/02 17:24:12
>>224
レスありがとうございます。
1番目の方にすると、Modelクラスから取得したデータを
Viewクラスに渡すことになるので、その分余計にメモリや
CPUを消費してしまうのでは、と心配になって聞いてみましたが、
考えてみると、コードの見易さなどを優先するのがOOPですので、
そちらの方がいいですね。
でも、フレームワークのソースなどを見ていると、
各クラスが、メンバに、別のクラスへのリファレンスを持ってたり
するので、もっと理論に従った組み方があるのかも、と思っています。
226:nobodyさん
08/02/02 17:36:37
>>184
ファイル:全部で8つ。index.phpを実行する。
抽象クラスと具象クラスに実装を分けてみました。
csv.txt(※前回と同じ)
index.php
cfcontrol.php
アブストラクトとして実装
cfview.php
cfmodel.php
コンクリートとして実装
data_model.php
index_view.php
output_view.php
227:nobodyさん
08/02/02 17:38:02
[config.php]
<?php
// 実際の処理を行うスクリプトをインクルード
include("./index_view.php");
include("./output_view.php");
include("./data_model.php");
// 最初に呼ばれるビューのプレフィックス設定
define ('INDEX_VIEW_PREFIX', "Index");
// モデルクラスのプレフィックス設定
define ('MODEL_PREFIX', "Data");
?>
[index.php]
<?php
include("./cfcontrol.php");
$view_key = $_POST["view_key"];
$data = $_POST["data"];
$app = new CFControl($view_key, $data);
$app->Execute();
?>
228:nobodyさん
08/02/02 17:39:03
[cfmodel.php]
<?php
class CFModel
{
var $file_name; // 読み込むファイル名
function CFModel() {}// コンストラクタ
function Execute($param) // パブリックメソッド
{
return $this->_OnExecute($param);
}
function _OnExecute($param) // 仮想メソッド
{
trigger_error('オーバーライドしてね。', E_USER_ERROR);
}
}
?>
[cfview.php]
<?php
class CFView
{
var $file_name; // POSTするファイル名
function CFView() {} // コンストラクタ
function Execute($param) // パブリックメソッド
{
return $this->_OnExecute($param);
}
function _OnExecute($param) // 仮想メソッド
{
trigger_error('オーバーライドしてね。', E_USER_ERROR);
}
}
?>
229:nobodyさん
08/02/02 17:39:58
[cfcontrol.php]
<?php
include("./cfview.php");
include("./cfmodel.php");
include("./config.php");
class CFControl
{
var $_view_key; // 呼び出すビューのプレフィックス
var $_data; // モデルに渡すデータ
function CFControl($view_key, $data) // コンストラクタ
{
$this->_view_key = $view_key;
$this->_data = $data;
}
function Execute() // パブリックメソッド
{
// モデルオブジェクト動的生成
$model_class_name = MODEL_PREFIX . 'Model';
$model = new $model_class_name();
$param = $model->Execute($this->_data);
// ビューオブジェクト動的生成
$view_key = $this->_view_key;
if ($view_key == "") $view_key = INDEX_VIEW_PREFIX;
$view_class_name = $view_key . 'View';
$form = new $view_class_name();
$form->Execute($param);
}
}
?>
230:nobodyさん
08/02/02 17:40:48
[data_model.php]
<?php
class DataModel extends CFModel
{
function DataModel() // コンストラクタで取得先のファイル設定
{
$this->file_name = 'csv.txt';
}
function _OnExecute($param) // オーバーライドメソッド
{
$INFILE = fopen($this->file_name,"r");
$data = fgets($INFILE, 1024);
fclose($INFILE);
$data = $data . ", " . $param;
return $data;
}
}
?>
231:nobodyさん
08/02/02 17:41:48
[index_view.php]
<?php
class IndexView extends CFView
{
function IndexView() // コンストラクタでPOST先のファイル設定
{
$this->file_name = 'index.php';
}
function _OnExecute($param) // オーバーライドメソッド
{
echo "<html><body>";
echo '<form method="POST" action="' . $this->file_name . '">';
echo '<input type="hidden" name="view_key" value="Output">';
echo '<input type="text" name="data"><input type="submit" value="送信">';
echo "</form></body></html>";
}
}
?>
232:nobodyさん
08/02/02 17:42:29
[output_view.php]
<?php
class OutputView extends CFView
{
function OutputView() // コンストラクタでPOST先のファイル設定
{
$this->file_name = 'index.php';
}
function _OnExecute($param) // オーバーライドメソッド
{
echo "<html><body>";
echo '<form method="POST" action="' . $this->file_name . '">';
echo '<input type="hidden" name="form" value="Index">';
echo "$param<br>";
echo '<input type="submit" value="戻る"></form></body></html>';
}
}
?>
233:に ◆lKs5QMUHoA
08/02/02 19:04:13
>>226-232
サンプルソースありがとうございます。
抽象クラスの書き方に慣れてますね。私はこのあたりを
しっかりとやってなかったのでちょっと苦手です。
ま、しっかりと勉強していきたいと思います。(^^;
ソースを読んでいて、1点気になったので質問をしたいのですが、
class CFView と class CFModel において、以下のように
パブリックメソッドと仮想メソッドを作り、パブリックメソッドから
仮想メソッドを実行する形式にソースを書いた理由は何でしょうか?
出来ましたら、この設計にした意図を教えていただきたいと思います。
function Execute($param) // パブリックメソッド
{
return $this->_OnExecute($param);
}
function _OnExecute($param) // 仮想メソッド
{
trigger_error('オーバーライドしてね。', E_USER_ERROR);
}
234:に ◆lKs5QMUHoA
08/02/02 19:24:37
>>218
レスありがとうございます。
イベントドリブンそのものは、VBでWindowsアプリを組んでやったことがあるので
すぐに入れたのですが、Webアプリを作る際、イベントドリブンでしかやった事が
無いというのは致命的だと思ったので、PerlやPHPでやってみています。
(ASP.NETは、便利ではあるが、IISを使えとか、.NET Frameworkを使えとか
非常に限定される。)
構造化プログラミングで、あまり命名規則を考えずにプログラムをしていると、
グローバル変数や関数が多くなった時、その把握が出来なくなったりする
わけなのですが、そういう苦労する体験をした後、OOPを習うと、その便利な部分が
見えてくるわけです。OOPは経験による結論的な理論だな、と理解できるわけです。
その理解のために、とりあえず、苦労をする方法(PHP で 0 から OOP)で
やってみているのです。
今は、このように考えています。
235:nobodyさん
08/02/02 19:59:40
人間て暖かいにゃぁ
ポカ・ポカ テンキュー
236:nobodyさん
08/02/02 21:30:36
>>233
PHP4では全てパブリックだけど例えばC#では以下の実装になるんだ
public object Execute(object parpam)
protected virtual object _OnExecute(object parpam)
CFControlから_OnExecuteメソッドを隠蔽する意図なんだよ。
_OnExecuteはCFViewやCFModelのサブクラスにだけ見えれば十分なんだ。
237:に ◆lKs5QMUHoA
08/02/03 11:17:44
>>235
暖かいですねぇ。
>>236
なるほど。ありがとう。
238:に ◆lKs5QMUHoA
08/02/03 14:47:56
ソースを読んでいて気になった点がありますので、質問させていただきます。
includeの構成についてです。まず、各ファイルに書かれているincludeの部分をまとめます。
[index.php]
include("./cfcontrol.php");
[cfcontrol.php]
include("./cfview.php");
include("./cfmodel.php");
include("./config.php");
[config.php]
// 実際の処理を行うスクリプトをインクルード
include("./index_view.php");
include("./output_view.php");
include("./data_model.php");
これは、MVCフレームワークは、以下の3つのファイルであり、
[cfcontrol.php][cfmodel.php][cfview.php]
それを拡張する形で、残りの6つのファイルを付け加えた形
なので、このようなincludeの構成ということでよろしいのでしょうか。
239:に ◆lKs5QMUHoA
08/02/03 14:50:55
includeをばらばらとさせるよりも、以下のように整理したほうが
となんとなく思ったりもしたのです。
[index.php]
include("./config.php");
[config.php]
include("./cfcontrol.php");
include("./cfview.php");
include("./cfmodel.php");
include("./index_view.php");
include("./output_view.php");
include("./data_model.php");
240:nobodyさん
08/02/03 15:27:26
MVC?な俺にはここが一番わかりやすかった
実例コードが載ってるのがいい
PHPでMVC第1回:前編
URLリンク(www.stackasterisk.jp)
241:nobodyさん
08/02/03 15:52:25
javaのサイト見ろよ
242:nobodyさん
08/02/03 16:56:56
やけに伸びるな
243:に ◆lKs5QMUHoA
08/02/03 19:47:22
ソースコードをちょっとだけ改変したものを作ってみた。
メモとかを残していく都合もあると思ったから、HP解説してみた。
URLリンク(www.geocities.jp)
本当は、>>1さんがソースの管理とかもしてくれたりしたら、うれしいw
244:nobodyさん
08/02/04 01:44:33
いちいちzipを解凍する気にならない
245:nobodyさん
08/02/04 09:02:58
>>243
CFViewクラスに具体的な実装をしちゃダメなんだよ。
そもそもHTMLのフォーム処理とかは、あとでPEARとか使えばいい。
サブクラスをうまく呼び出す仕組みだけを実装していくんだ。
246:nobodyさん
08/02/04 14:12:44
>>244
> サブクラスをうまく呼び出す仕組みだけを実装していくんだ。
kwsk
247:nobodyさん
08/02/04 23:36:13
>>246
構造化プログラミングはルーチンを呼ぶ方向で実装すると思うけど
OOPではルーチンに呼ばれる方向で実装して行く感じだよ。
大枠の骨組みだけを抽象クラスで作成して、処理は具象クラスで行うんだ。
インターフェイスさえ同じならあとで個別にパーツを交換出来たりするからね。
だったら基底クラスのメソッドなんて数個で十分じゃないかと思うんだ。
やたら複雑でよくばりな機能のクラスなんて、再利用の価値がないからね。
248:に ◆lKs5QMUHoA
08/02/05 01:28:01
>>247
レスありがとうございます。
> 構造化プログラミングはルーチンを呼ぶ方向で実装すると思うけど
> OOPではルーチンに呼ばれる方向で実装して行く感じだよ。
私は、継承を活かした設計をした事が無かったので、ちょっと方向性を
誤ってしまったようですね。
Viewは、表示をつかさどるのだから、html表示を請け負うのでは、と
思っていたのですが、それよりも抽象的な枠組みを定義するという
ことですね。
となると、html表示は(PEARを使わないのであれば、)htmlタグの
記述を行うCF_HTMLクラスを作り、Viewの具象クラス内で
インスタンスを生成ということですよね?
249:nobodyさん
08/02/05 08:55:19
>>248
HTML処理のヘルパクラス作成はあまりOOPの勉強にならないとも思うんだ。
もう既に頭の中で実装出来ているだろうし、引数を関数で処理するだけでしょ?
それよりも例えばPEARのHTML_QuickFormやテンプレートレンダラのSmartyを
Viewと連携させる仕組みとかを考えたりした方がよっぽど面白いよ。
すべてをフルスクラッチするプログラミングの方向性は必ずしも得策じゃないよ
既存のライブラリやコンポーネントを上手く利用するのもOOPの要素なんだよ。
250:nobodyさん
08/02/05 11:06:34
OOPで継承を用いた設計について調べてみた。(OOP理論の入門ではなく、
継承を用いた設計などが入った解説)
この連載は良いかもしれない。
オブジェクト指向プログラミング超入門
.NETでオブジェクト指向プログラミングを始めよう
URLリンク(www.atmarkit.co.jp)
特に第6回は、今まで出てきていた話題だと思う。
Objectクラスで仮想メソッドToStringをもち、それから派生したクラスは、
オーバーロードをする仕組みを図説していて分かりやすい。
第6回 階層の頂点に立つクラス
URLリンク(www.atmarkit.co.jp)
251:nobodyさん
08/02/05 11:52:25
>>250
PHPのプログラマにも非常に参考になると思いますよ。
.NETの世界はクラスベースなので初めからOOPの思考で実装します。
関数が作れないので構造化思考のVB6プログラマとか、クラスをnewせずに
引数を大量に渡すスタティックメソッドを呼んだりしてしまいます・・・
PHPはC言語での関数モジュールを呼び出す実装スタイルに近いので
やはりクラスを使って構造化プログラミングをしちゃいがちですね。
普及しているPHP4がOOP対応不十分なのと、開発環境が貧弱であることも
PHPでOOPがなかなか利用されない原因になってたりしますよね。
プロテクテッドメソッドの概念とかIDEがないと、なんでそうするのか
なかなか理解出来ないとも思いますしね。
252:nobodyさん
08/02/05 11:56:50
いくらかのデータを登録し、その内容を検索するWebシステムで使用する
クラス構成で、Viewに絞った構成を考えてみた。
[View]
├[認証]
├[個人情報入力]
├[メニュー]
├[検索指定]
├[検索結果]
別の案として、[View]から[Input View]と[Output View]の
二つを継承し、さらに以下のような継承も浮かんだけれど、
継承して分ける必要性は無さそうなので、上記の方が良いように思う。
[Input View]
├[認証]
├[個人情報入力]
[Output View]
├[メニュー]
├[検索指定]
├[検索結果]
253:nobodyさん
08/02/05 12:16:06
>>252
[View]
├[LoginView]
├[InsertView]
├[MenuView]
├[SelectView]
├[ResultView]
こんな感じ?
254:nobodyさん
08/02/05 13:28:44
Debug用出力のメソッドをView(基底クラス)に追加するといいだろうね。
各画面([LoginView] [InsertView] [MenuView] ・・・)で
エラー確認用のメソッドをオーバーロードする形で。
開発中はPOSTで受け取ったデータとかを画面上部に表示しながら動作確認する
っていうのは、よくやるからね。
Objectクラスを継承する形にするのは、このスレでは共通したメソッドの
実装という理由だ。という話だったけど、リファレンス関係の処理で
便利だという話がサイトに載っているようだね。
このあたりの考え方も活かすと良いかもしれない。
ただ、PHPのOOPだとうまく実装出来ないかもしれないが。
>>207-209 >>250
255:nobodyさん
08/02/05 13:44:31
Modelクラスも以下のメソッドを追加するという感じで設計すると良いのかな。
Select // データ取り出し
Delete // 削除
Insert // 新規追加
Update // 既存データの更新
>>228に載ってる既存のクラスには Execute があるけれど、
これも残しておくべきかな?
256:に ◆lKs5QMUHoA
08/02/05 19:03:57
案がいくつか出てきたので、前回の駄目なソースを破棄して
またソースコードをリニューアルしようかと思ったが、
いざやり始めてみると、データベースを管理する基底クラスの
設計を具体的にどうするかをきめないといけなくなり、それを
どうするかで迷っている。。。
概ね以下のような感じにしたいと思ってるんだけどね。
DB格納の基底クラス:CFDB
テキストファイルに保存するクラス:Text_DB extend CFDB
PostgreSQLに保存するクラス:PostgreSQL_DB extend CFDB
MySQLに保存するクラス:MySQL_DB extend CFDB
で、この3つのいずれかのインスタンスを Model のメンバに持たせる。
現在のコード(CFModelのメンバ)
var $file_name; // 読み込むファイル名
更新案のコード
var $m_db; // データベースを格納。
257:nobodyさん
08/02/05 20:33:23
>>255
普通は機能をメソッドに振り分けると思うけど
コントローラのメソッド内で以下の様に
操作出来たら面白くない?
// モデルにフォーム値を渡してデータ書き込み
$insert = $this->models['InsertModel'];
$insert->setItem('name', $_POST['name']);
$insert->setItem('title', $_POST['title']);
$insert->setItem('body', $_POST['body']);
$insert->execute();
// ビュー表示用にデータをロードする
$select = $this->models['SelectModel'];
$data = $select->execute();
>>256
自分なりに試行錯誤で機能を実装してみるのも楽しいかもね。
誰か>>252のアプリ作成に必要な要求仕様作ってよ。