PHPでOOP
■ このスレッドは過去ログ倉庫に格納されています
00011 ◆SWtzLesEmM
2007/02/23(金) 13:35:52ID:???プロシージャ指向(手続き型、構造化プログラミング)でもできますが、
オブジェクト指向を使った場合の恩恵を享受するために、
PHPでオブジェクト指向プログラミングの勉強をしてみましょう。
<目的>
PHP5でオブジェクト指向プログラミングを行なうための知識を習得する。
(PHP4のOOPもOK、このスレが1000に行く前にPHP6が出たらPHP6のOOPもOK)
<方向性>
・このスレは、プログラミング初心者、PHP初心者の勉強の場として利用することを前提にします。
・PHPのOOPの話題に限定します。
(Ruby、Python、Javaなど他言語のOOPについては、その言語のスレッドでお願いします。)
・PHPのOOP学習に役立つ本、WEBサイトの紹介をお願いします。
<その他>
・略記は、「OO」=「オブジェクト指向」、「OOP」=「オブジェクト指向プログラミング」でお願いします。
・質問をする人はなるべくトリップを付けましょう。
・荒らし、煽り、叩き、気違いは無視・無干渉でお願いします。
このスレで、今日から貴方もOOP!!!\(^o^)/
0002nobodyさん
2007/02/23(金) 13:38:15ID:???0003nobodyさん
2007/02/23(金) 13:41:55ID:???00041 ◆SWtzLesEmM
2007/02/23(金) 13:42:26ID:???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
00051 ◆SWtzLesEmM
2007/02/23(金) 13:51:33ID:???ttp://d.hatena.ne.jp/toku-hiro/20060826
この説明見てなるほどな〜〜〜!と思いました^^
>(1) オブジェクトと関数の本質的な違いと使い分け
>コーディング上の本質的な違いは「変数を保持できるか否か」に尽きます!
>関数を定義するときには、(グローバル変数を除き)引数として関数の外部から渡し、return で返すことしかできませんが、クラスは内部で変数を定義でき、クラスの実体のオブジェクトはどこからでも内部変数を引き出すことができます。
>定義関数の return であれもこれも返したいのにうまく返せず、煩雑な配列に格納して返す…といったことが減ると思います。
>あれもこれも引数として渡したいとき、または、あれもこれもreturnしたいときは、関数よりクラスの方が遥かに簡単です。
「クラス」という仕組は便利そうですね。クラスを考えた奴、偉い!
00061 ◆SWtzLesEmM
2007/02/23(金) 13:54:53ID:???なんかプログラミングって、カタカナ用語がたくさん登場しますよね><
クラスって聞いたら学校の「教室」を連想しちゃう><
0007nobodyさん
2007/02/23(金) 15:12:49ID:???http://pc10.2ch.net/test/read.cgi/php/1133489897/
こっちじゃ何故駄目なんだ?
0009nobodyさん
2007/02/23(金) 16:52:36ID:???00101 ◆SWtzLesEmM
2007/02/23(金) 19:44:43ID:???>Webでオブジェクト指向
>http://pc10.2ch.net/test/read.cgi/php/1133489897/
>こっちじゃ何故駄目なんだ?
そっちも参考に眺めています。
あと、プログラマー板にもあるオブジェクト指向関係のスレもちょっと眺めています。
PHPに的を絞った情報が欲しいので、専用のスレを立ててみました。
もちろん、JavaやRuby、Pythonとかも使えればいいけど、そこまで手を広げる時間がないので、とりあえず今の段階ではPHPで勉強。
PHPを使っていて、オブジェクト指向プログラミングのやり方を勉強したい人がいたら一緒に勉強していきましょう。
よろしく(・∀・)
0012nobodyさん
2007/02/23(金) 21:34:47ID:???OOPのメリット聞かれたから自分で見つけた参考サイト出して自分の所感言っただけだろ。
聞くだけで何もしない厨より、アクティブな>>1に好感が持てたが。
って擁護すると自演って言うのかな?
0013nobodyさん
2007/02/23(金) 22:38:47ID:???書いている人は多そうだから(俺は知らないけど)
他のも出せば、>>1の疑いは晴れるんじゃないかな。
00141 ◆SWtzLesEmM
2007/02/23(金) 23:18:48ID:???http://www.google.co.jp/search?q=PHP+%83I%83u%83W%83F%83N%83g%8Ew%8C%FC
よさげなサイトをピックアップしてみよう!
00151 ◆SWtzLesEmM
2007/02/23(金) 23:23:43ID:???http://jp2.php.net/zend-engine-2.php
第19章 クラスとオブジェクト (PHP 5)
00161 ◆SWtzLesEmM
2007/02/23(金) 23:49:00ID:???PHP4のOOPについて、簡単な説明がありました。
PHP5のOOPは、PHP4のOOPに変更が加えられているので、ちょっと違う部分があります。
00171 ◆SWtzLesEmM
2007/02/24(土) 00:03:56ID:???http://www.aglabo.com/agl/proevo/PHP/objectbrain/4-composite2.html
PHP5のオブジェクト指向について説明がありました。
http://www.doyouphp.jp/php5/
オブ脳 in PHP
http://www.aglabo.com/agl/proevo/PHP/objectbrain/
「委譲」などの説明がありました。
今の段階では、ちょっとよく理解できませんでしたがこんな話もあるんですね。
0018nobodyさん
2007/02/24(土) 00:47:36ID:???0019nobodyさん
2007/02/24(土) 01:05:02ID:???わかった。
オブジェクトの
オブとはすなわち飯富。飯富厩舎所属だということ。
オブジェクトの
ジェクトトはすなわちジェクト。FF10のジェクトだということ。
0020nobodyさん
2007/02/24(土) 13:35:58ID:???0021nobodyさん
2007/02/24(土) 13:43:25ID:???00221 ◆SWtzLesEmM
2007/02/24(土) 16:26:54ID:???OOPで掲示板を作ってみたいです。
(1)最初はOOPを使わないで掲示板を作ってみる
(2)次にOOPで同じ掲示板を作ってみる
という流れにすると、対比によってOOPが理解しやすくなるでしょうか?
=始めに完成形ありきと。
00231 ◆SWtzLesEmM
2007/02/24(土) 16:34:22ID:???(1)名前とタイトルと本文を入力&投稿できる。
(2)投稿の一覧(タイトル+投稿日時)が表示できる。
(3)投稿の詳細内容(1つ1つの投稿を個別に閲覧)が表示できる。
という最低限の機能で作ってみて、
後から徐々に機能を追加して拡張してみましょう。
00241 ◆SWtzLesEmM
2007/02/24(土) 16:45:34ID:???文字化け対策が面倒くさいので、文字コードは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切れのっているかという違い…些細なことはどうでもいいか。
00251 ◆SWtzLesEmM
2007/02/24(土) 16:53:26ID:???その中にテーブルを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」という句を削らないとエラーになると思います。
00261 ◆SWtzLesEmM
2007/02/24(土) 17:00:26ID:???画面(ハリボテ)を先に作ってみて、それにプログラムを付けて動くようにしてみます。
(1)入力ページ input.php
(2)一覧ページ list.php
(3)詳細ページ message.php
http://itpro.nikkeibp.co.jp/article/COLUMN/20070214/261859/
「HTML画面をそのまま仕様書に」,5カ月で1000画面を構築した就職サイトPuffの高速開発手法
0027nobodyさん
2007/02/24(土) 18:52:22ID:???00281 ◆SWtzLesEmM
2007/02/24(土) 20:07:40ID:???主キーをオートインクリメント(連番の)の設定にしておくのを忘れてました。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 ;
0029nobodyさん
2007/02/25(日) 02:57:19ID:???00302
2007/02/25(日) 16:11:09ID:???class hello {
var $aisatu = "こんにちは";
}
$re = new hello();
$aisatu = $re->aisatu;
echo $aisatu;
読み図ら買ったら適当に改行して
00312
2007/02/25(日) 16:19:08ID:???class hello {
#このクラスに生徒である$aisatu君がいる
#彼に「こんにちは」という言葉を覚えさせる
var $aisatu = "こんにちは";
#放課後なので括弧で閉じる
}
#クラスの風景を覗くための魔法
$re = new hello();
#生徒$aisatu君に「こんにちは」を言わせるための魔法を矢で飛ばす。
#魔法で生徒$aisatu君の$は壊れてしまい、以下のような記述になる。。
$aisatu = $re->aisatu;
#魔法にかかった生徒挨拶君をおまえらのディスプレイに召還する。
echo $aisatu;
0032nobodyさん
2007/02/26(月) 16:35:48ID:???「なぜOOP」か、だとか、
こういう場合にOOPが役立つ、というのを具体的なコードで示してくれ
0033nobodyさん
2007/02/26(月) 18:41:14ID:???悲しい。悲しすぎる。
0034nobodyさん
2007/02/26(月) 23:07:07ID:???00351 ◆SWtzLesEmM
2007/02/27(火) 15:21:07ID:???OOPを使わないで作った簡単な掲示板をアップしてみます。
>>26
ファイルは、他に掲示板のトップページと、DB接続関係のデータを入れたファイルを用意しました。
WEBサーバのルート直下にデプロイした場合を想定しています。
/index.html 掲示板のトップページ
/db.php データベースの接続関係のデータのファイル
/input.php メッセージ入力ページ
/list.php メッセージ一覧ページ
/message.php メッセージ詳細ページ
00361 ◆SWtzLesEmM
2007/02/27(火) 15:22:07ID:???<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>
00371 ◆SWtzLesEmM
2007/02/27(火) 15:24:34ID:???<?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");
}
(以下、続く)
00381 ◆SWtzLesEmM
2007/02/27(火) 15:25:32ID:???//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;
}
00391 ◆SWtzLesEmM
2007/02/27(火) 15:26:17ID:???//MySQLプリペアードステートメント関数(SQLインジェクション対策)
//(参考)http://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;
}
?>
00401 ◆SWtzLesEmM
2007/02/27(火) 15:30:07ID:???<?php
/**
* メッセージ入力画面
*/
require_once("db.php");
db_connect();
//
$name = $_POST['name'];
$title = $_POST['title'];
$message = $_POST['message'];
$error_msg = "";
(以下、続く)
00411 ◆SWtzLesEmM
2007/02/27(火) 15:30:59ID:???//入力値バリデート
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 = "http://".$_SERVER['HTTP_HOST']."/test2/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>
00421 ◆SWtzLesEmM
2007/02/27(火) 15:34:29ID:???間違えました。
>db.phpの続きです。
ではなくて、
「input.phpの続きです。」
でした。(・∀・)
あと、
>$url = "http://".$_SERVER['HTTP_HOST']."/test2/list.php";//メッセージ一覧
ではなくて、
$url = "http://".$_SERVER['HTTP_HOST']."/list.php";//メッセージ一覧
になります。
=ローカルでは、/test2というフォルダを作ってその中にいれていたので。
=本番環境では、ドキュメントルート直下を想定しているので、/test2/は不要
もう一回訂正してアップします。
00431 ◆SWtzLesEmM
2007/02/27(火) 15:40:30ID:???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 = "http://".$_SERVER['HTTP_HOST']."/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>
(以下、続く)
00441 ◆SWtzLesEmM
2007/02/27(火) 15:42:00ID:???<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>
00451 ◆SWtzLesEmM
2007/02/27(火) 15:44:03ID:???<?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());
?>
00461 ◆SWtzLesEmM
2007/02/27(火) 15:45:25ID:???<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>
00471 ◆SWtzLesEmM
2007/02/27(火) 15:46:10ID:???<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>
00481 ◆SWtzLesEmM
2007/02/27(火) 15:47:39ID:???<?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);
}
?>
00491 ◆SWtzLesEmM
2007/02/27(火) 15:49:23ID:???<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>
00501 ◆SWtzLesEmM
2007/02/27(火) 15:50:12ID:???<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>
00511 ◆SWtzLesEmM
2007/02/27(火) 15:59:41ID:???>>22 (2)次にOOPで同じ掲示板を作ってみる
>>34
PHPコードとHTML表示を一緒にしてありますが、OOPではテンプレートシステムを使って、PHPコードとHTML表示部分を分離して、MVCにしてみたいです。
どういうクラスを作ればいいのか良く分かりません><
(1)コントローラー(+アクション)→input、list、message
(2)モデル→データベース接続処理も1つのクラスにするのでしょうか?
(4)ビュー→テンプレートシステムへの出力
というかんじで3個のクラスが必要でしょうか?
それぞれのクラスに必要なプロパティとメソッドを何にするか?
クラスを考えて、UMLでクラス図を作ってみたいです。
0052nobodyさん
2007/02/27(火) 22:54:58ID:???おれもがんばろう。
0053nobodyさん
2007/02/28(水) 03:12:15ID:???00541 ◆SWtzLesEmM
2007/02/28(水) 20:49:38ID:???まとめサイトを設置しました。
ttp://kameleon.s241.xrea.com/dokuwiki/doku.php
0055nobodyさん
2007/02/28(水) 22:48:34ID:???少しずつリファクタリングしていけばよいと思う
とりあえずDBアクセスを一箇所にまとめるモデルを作ってみるといいんじゃない
・全件取得
・1件取得
・1件追加
できるMessageクラスとかを作ってそこにDBアクセス(SQL)をまとめれ
0056nobodyさん
2007/03/03(土) 13:53:29ID:Ej/v+KpC0057nobodyさん
2007/03/04(日) 04:17:32ID:xhaosu8B0058nobodyさん
2007/03/11(日) 11:30:29ID:???読むより、有名なオープンソースのスクリプトを読めばいいじゃん。
そもそも>>1の意味不明な独善なんかに付き合わなくてもOOPに関する情報
はいくらでも手にはいるし。
0059nobodyさん
2007/03/11(日) 23:56:02ID:???0060nobodyさん
2007/03/12(月) 08:27:35ID:cm9vlrfSど素人はみんな、自分みたいな学習意欲も向上心もない人間だと思ってる
思考回路がカコイイ!
00651 ◆SWtzLesEmM
2007/05/12(土) 03:12:14ID:???DBにアクセスするためのクラスを作ろうと思って、とりあえずdb.phpをクラスの形に変えてみようと試みました。
だけど、コンストラクタでエラーが出てストップ!
Fatal error: Cannot access empty property in /…/test.php on line 18
なんでエラーになるのか?よく分からなくて、PHP5のコンストラクタについて調査していたら、サンプルになりそうなDBクラスの解説記事がありました。
http://www.bnote.net/php/php/09_db_class.shtml
↑これをソックリ真似すれば、DBクラスは何とかなるかな?
ところで、このbnoteというサイトのPHP解説記事には、掲示板を作ってみるサンプルがあり、参考になりそうです。
http://www.bnote.net/php/php_idx.shtml
>PHPでフォーラムを作ろう!
0066nobodyさん
2007/05/12(土) 16:09:18ID:???普通に>>1のおかげでだいぶいい情報が手に入った。
曖昧だったクラスがなんとか分かりそうだよ。
ありがとー
PHPでわからない人は情報が足りないのかもな。
似てるJAVAで本格的なものを見てみると分かるのかも。
昔、歴史で年表同士のつながりが薄くて分かりづらかったように、
もっと詳しく高校の歴史くらいのをみれば分かりやすい。
0067nobodyさん
2007/05/12(土) 23:32:04ID:s118dfiw具体的な情報がほしいよな
俺は車なんかプログラミングしないっての
0068nobodyさん
2007/05/14(月) 00:46:15ID: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バリバリなので、勉強になること間違いなし!
0069nobodyさん
2007/05/15(火) 15:55:34ID:???「ない!」 お勧め教えて
0070nobodyさん
2007/05/15(火) 16:01:33ID:???勉強しながら自分なりに書いていけ、金かからないしだしそれが一番の近道
気が付いたらOOPなんて空気のように有って当たり前になるもんだから
0071nobodyさん
2007/05/15(火) 16:06:06ID:???スコープ演算子(static ::)は2冊読んでもチンプンカンプン
そこでぐぐる先生に聞くと
http://homepage3.nifty.com/gomi_doji/scopen.htm
PHPではないが、ナルホドナルホドと理解できる
オブジェクト指向の概要も
http://phpspot.net/php/pg%83I%83u%83W%83F%83N%83g%8Ew%8C%FCPHP.html
を読むとナルホドナルホドだが、本は意味不明になる
糞った本しか読んでいないかもしれないが一応書いておく
「PHP5プログラミング エキスパート編」 //最強の意味不明
「MySQL4/PHP5によるWebデータベース構築」 //わかりやすいがODPの章になると意味不明
0073nobodyさん
2007/05/15(火) 17:01:49ID:???独習PHPのクラスらへんの説明は中々分かりやすいよ。
作者があまりいいとはいえんが、ファーストステップにはいい感じ。
0074nobodyさん
2007/05/22(火) 15:14:54ID:???PHPの本読むよりJAVAの本読んだほうが理解できる罠。
0075nobodyさん
2007/05/28(月) 14:46:00ID:???人の作ったライブラリ使いたいから
最低限、何が書いてあって何をしているのか読めるようになりたい
0076nobodyさん
2007/05/29(火) 05:34:16ID:???0077nobodyさん
2007/06/05(火) 12:23:56ID:/w569Zaf0078nobodyさん
2007/06/05(火) 19:15:58ID:???0079nobodyさん
2007/06/11(月) 22:06:39ID:2dWIuVC4DBアクセスの為のクラス書くのかw
おそらくPHPインストール時に君のHDDの中にすでに入ってる訳だが…
しかもあらゆるDBに同じ書式でアクセス出来るやつが…
0081nobodyさん
2007/06/12(火) 00:15:06ID:???0082nobodyさん
2007/06/12(火) 06:55:41ID:e4tfCBN50083nobodyさん
2007/06/12(火) 09:31:07ID:???単にPDOだろ
00841 ◆SWtzLesEmM
2007/06/12(火) 10:24:12ID:???情報提供どうもありがとうございます。
独習PHPは、図書館でかりて読んでみました。
オブジェクト構文の説明は分かりやすいと思いました。
>>79
DBにアクセスするクラスも勉強のため練習で作ってみようと思いました。
その次に、O/Rマッパーの使い方を練習してみることになるでしょうか?
>>82
PHP5に標準で用意されているPDOのことですね。
http://jp2.php.net/pdo
PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。
PDO は PHP 5.1 以降にバンドルされており、PHP 5.0 では PECL 拡張モジュールとして使用可能です。
PDO は PHP 5 の新機能である オブジェクト指向機能を使用しており、それより前のバージョンの PHP では動作しません。
0085nobodyさん
2007/06/12(火) 10:56:05ID:???0087nobodyさん
2007/06/17(日) 01:20:06ID:???「PHPデザインパターン入門」は買うな。
最近買った中で最低レベルの悪書。
どっかの英語ページを機械翻訳したようなトンチンカンな用語説明にまじって
何故かApacheとPHPのインストール方法だけが丁寧な日本語で書かれている。
あとはデザインパターン図が羅列してあるだけ。解説ほぼ無し。
3流大学生のコピペ論文を彷彿とさせる。
こんなの真剣に呼んでも絶対わかるようにはならない。
OOP用語の説明は何故かちゃんとしてないのに
php.iniにページさかれてるけど
網羅して無くて中途半端でページ稼ぎとしか思えない。
中身薄くて有名なヤマダヨウカン本の方がマシに感じるレベル。
0088nobodyさん
2007/06/17(日) 01:28:20ID:???オブジェクト指向で書かれてる気がした。
多分最初にパターン名を記載した時点で、作者の頭の中では
記載されてるページを呼び出してるんだろうと思えてきた。
解説するための日本語はプロシージャ指向で書いてくれと
小一時間問い詰めたい。
この本理解するには色んな本を買って、全部理解した後じゃないと
読めない。意味ねえじゃん。
0089nobodyさん
2007/06/17(日) 01:54:28ID:???0090nobodyさん
2007/06/17(日) 14:22:50ID:???0091nobodyさん
2007/06/17(日) 18:51:52ID:???0092nobodyさん
2007/06/24(日) 17:09:42ID:???クラスの勉強をすればいいんだよ。
単に、呼び出してるだけだから。
0093nobodyさん
2007/06/24(日) 19:32:38ID:???なんだかんだで実際動いてるんだけど何してるかイマイチ理解出来てないんだよね
functionの中でインスタンス作るとその外側ではやっぱアクセスできないのかな
PEARDBのインスタンスがあっちゃこっちゃに散らばっちゃって困る
00951 ◆SWtzLesEmM
2007/07/06(金) 14:33:24ID:???>拡張がやりやすい(やりやすく作ることが出来る)
そうみたいですね。
http://www.amazon.co.jp/dp/4822281957/
「オブジェクト指向でなぜつくるのか」
という本にも、クラスを使うメリットが同じように説明されていました。(・∀・)
>>74
Javaの本だと
http://www.amazon.co.jp/dp/4797331828/
「やさしいJava」をすすめられました。
>>86
(σ・Д・)σプログラミング初心者ですΣ(゚Д゚*)=3
>>89
Zend Frameworkの正式版が出ましたね☆
http://framework.zend.com/manual/ja/
シンプルなフレームワークを検索したら、CodeIgniterというのがありました。
http://userguide.cilab.info/
0096nobodyさん
2007/07/08(日) 18:20:46ID:XFKJF1H9なんでそんな成長早いんだよ・・・おかしいだろ・・・orz
0097テレビできたよー
2007/07/10(火) 15:53:51ID:ZIdzImz8var $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 />";
}
}
0098テレビできたよー
2007/07/10(火) 15:54:22ID:ZIdzImz8if($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();
0099nobodyさん
2007/07/11(水) 10:41:20ID:???01001 ◆SWtzLesEmM
2007/07/11(水) 12:59:29ID:???http://www.phppro.jp/word/E4BE8BE5A496E587A6E79086
2. PHPで例外処理
http://www.phppro.jp/phptips/vol45/eb49e8a31e9132d98a5a7db3df4663e4
PHP5の基本 > 例外処理
http://www.shigeweb.jp/php/project_p/?section=php5oop&page=exception
phpspot - 例外処理
http://phpspot.net/php/pg%97%E1%8AO%8F%88%97%9D.html
PHP4ではエラー処理といえば、
if ( ($err = func()) != "" ) {
die("エラーです");
}
のように戻り値のチェックをしていましたが、エラーというものは、呼び出し側がエラー制御を行うのではなく、呼ばれた側で、どういうエラーがあったか、というものがあった方が自然で、呼ばれた側がエラー処理を行うため、モジュールの場合より再利用性が高くなるでしょう。
更に上記では、どういうエラーが起こってエラーが出ているのかということが想像しにくいですね。
そこで try〜catch です。
■例外処理
http://www.atmarkit.co.jp/flinux/special/php5/php5d.html
プログラミングにエラー処理は避けて通れない事項だ。
とはいえ、関数やメソッドからの戻り値を毎回エラーチェックするのは煩雑で面倒でもある。
その煩雑さを回避するため、文法として例外処理を持っている言語もある。
PHP5もそれに倣って、言語仕様として例外処理をサポートした。
文法的にはC++やJavaと同様に、try{ }で投げられた例外をcatch{ }で処理するという流れになる。
↑とのことですが、汎用性のある関数やメソッドにしたい場合、エラーが発生したときの処理を書く場所は、関数やメソッドを使う方(呼び出す側)にすることもあるでしょうか?
=戻り値をチェックするというのは、古いやり方なんでしょうか?
0102nobodyさん
2007/07/11(水) 14:16:38ID:???0103nobodyさん
2007/07/11(水) 14:44:53ID:???0104nobodyさん
2007/07/11(水) 17:30:14ID:???0105nobodyさん
2007/07/12(木) 02:57:31ID:???0106nobodyさん
2007/07/12(木) 08:06:18ID:???なんかphpspotのその文はおかしいな。
エラー処理は例外を使おうがそうじゃなかろうが変わらない。
呼ばれた側はどういうエラーがあったか返す責任があるし、
呼んだ側は返ってきたエラーをチェックする責任がある。
エラーが起きた時の挙動を自分で決めれるならその場で処理すれば良いし、
そこではまだ決められないならさらに上位へreturnなりthrowすれば良い。
0107nobodyさん
2007/07/14(土) 15:28:38ID:w3CTKtks例外処理?なにそれうまいの?
0108nobodyさん
2007/07/14(土) 18:34:23ID:???0109nobodyさん
2007/07/14(土) 19:32:25ID:???0110nobodyさん
2007/07/14(土) 19:46:31ID:w3CTKtksとりあえず、
-質問と答え(Entry)
--セッタ(SetQuestion,SetAnswer)
--ゲッタ(GetQuestion,GetAnswer)
-それらのEntryを編集したり、操作したりする(ManageEntry)
--POSTされたデータにEntryの値を変更する(EditEntry)
-プロフィール自体(Profiel)
--質問と答えを出力(ViewProfiel)
こんなクラスたちを作ったんだけどなんかおかしい気がしてならない。
とくにManageEntryのとことか。
ManageEntryでEntryオブジェクトの配列Entriesを作っといてそれをそのクラス内で操作とか?は?え?
OOPムズイ、ナキタイ
スレ汚しスマソ
0111nobodyさん
2007/07/14(土) 21:29:40ID:???ぱっと見で確実に言える事は、個別のクラスが多すぎ。
半分くらい継承とメソッドの追加で済みそう。
今のままだと拡張もやり難そう。
プロフィールが"profiel"なのはつっこんだ方が良いのかな。
CakeとかSynfonyみたいな、ライブラリじゃないフレームワークを
使い込んでソース読んだら、どう設計したらよいか一気に分かるよ。
0112nobodyさん
2007/07/14(土) 22:22:33ID:w3CTKtks正直どうやったらいいのか全くわからん。
プロフィール?え?あ?あはあは。
0113nobodyさん
2007/07/15(日) 00:13:47ID:???0114nobodyさん
2007/07/15(日) 00:19:07ID:???01151 ◆SWtzLesEmM
2007/07/26(木) 10:21:49ID:???>呼ばれた側はどういうエラーがあったか返す責任があるし、
>呼んだ側は返ってきたエラーをチェックする責任がある。
なるほど〜(・∀・)
呼ぶ側と呼ばれた側のそれぞれでエラーの対処があれば、手堅いですね!
大変参考になりました。
01161 ◆SWtzLesEmM
2007/07/26(木) 10:29:09ID:???DBにアクセスする機能をクラスにしてみました。
http://kameleon.s241.xrea.com/dokuwiki/doku.php?id=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B
動作サンプル
http://kameleon.s241.xrea.com/oop/bbs2/index.php
なんか、>>55さんのアドバイスの形になってませんが…orz
とりあえず、DBアクセスをクラスの形にできたので一歩前進!!!\(^o^)/
01171 ◆SWtzLesEmM
2007/07/26(木) 10:50:37ID:???おー、ガンバレ〜〜〜☆
>>111
(1) Entryクラス
文章を「書き込む」メソッド、「読む」メソッド、「書き換える(編集)」メソッド、「削除する」メソッドが用意されている。
(2) Entryクラスを継承して、質問用のクラスを用意
=質問のデータだけを操作できる
(3) Entryクラスを継承して、答え用のクラスを用意
=答えのデータだけを操作できる
というかんじになるんでしょうか?
どういうまとまりでクラスにすればいいのか、そこら辺がなんかよく分からないんですよねー(ノ∀`)
0118nobodyさん
2007/07/26(木) 10:57:58ID:???0119nobodyさん
2007/07/27(金) 00:44:20ID:???おっぱい
ぷぴにぷにだにょ〜
0120nobodyさん
2007/07/28(土) 17:35:02ID:???0121nobodyさん
2007/07/30(月) 03:51:10ID:???echo "ほげ"
}
こういうやつ、「リファレンスを返す」っていうんですか?
これはどういう処理をしているんでしょうか?
どこかで定義されているfoo()という関数に何かしているんですか?
0122nobodyさん
2007/07/31(火) 07:40:25ID:???0123nobodyさん
2007/08/01(水) 06:30:28ID:abLVM2kM買ってしまっていたよ。Iteratorまで読んだけど、
分かったような分からないような気分。
説明が少ない&下手なのは分かった。
0124nobodyさん
2007/08/01(水) 22:18:22ID:???書いてあることを全て理解していこうとするとこんがらがってくるしね。
まぁいい頭の体操になったけど。
あんなサンプルのためのサンプルではなく、具体的な使い方と利点が書いてあるとOOP素人にも理解しやすかったかもね。
0125522
2007/08/26(日) 13:53:57ID:QzPwO1NhなんかCakePHP使ってみたんだけど質問と答えを操作するクラス作って云々みたいになって結局>>110と同じような感じになっちゃいましたとさ・・・
「モノ」に書く機能とか読む機能持たせていーの?おしえてえろいひと><
0126nobodyさん
2007/08/26(日) 14:28:30ID:???0127nobodyさん
2007/08/28(火) 02:25:00ID:???0128nobodyさん
2007/10/03(水) 02:51:35ID:???インスタンスだのオブジェクトだのは枝、茎、葉、花、果実を作るというだけ。
mainでは結果(果実)だけをとりたいから枝やら茎やらは見えなくしとけってことだろ?
0130nobodyさん
2007/10/03(水) 23:45:33ID:???サーバーを経由した木構造になってることから演算機が理解しやすいデータ構造は木構造である。
こういってしまっても過言ではないと思う。
例えば、手続き型は東京の小さなバイク便が地方への配達を頼まれても東京発で請け負うみたいなもの。
それに対して、OODはヤ○ト運輸が東京で頼まれた配達を一旦、地方の配送センターに送るようなもの。
配達する対象が少なければ、バイク便に頼んだ方が早いかもしれないけど、数が多くなるとヤ○ト運輸。
0131nobodyさん
2007/10/05(金) 01:16:19ID:???ちなみに128==130==漏れです。
・オブジェクト指向は木構造
・目的は種の存続、繁栄
・ここでのフローは一つずつだが、間にどれだけの枝が挟まるかは設計次第
クラス設計
種(プリプロセッサ)から芽が出る(この時点では手続き型でも、OODでもない)
根クラス…main関数、もしくはmainクラスの設計、遺伝子(設計の違いで木になるかどうかが決定)
幹クラス…根から養分を吸い上げる(大まかな工程の分類)
オブジェクト生成
枝クラス…効率的に日光を取得できるよう枝を伸ばす(コンストラクタ)
葉クラス…光合成を行い、自己生産を行う(メソッド)
葉緑素クラス…目立たない頑張り屋さん(ライブラリ)
花クラス…実となるか枯れ落ちるか(オブジェクト)
実行結果
果実クラス…土に還り、新たな種となりました(プロジェクト成功)
0132nobodyさん
2007/10/05(金) 20:07:34ID:???0133nobodyさん
2007/10/05(金) 20:35:14ID:???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;
適当に書いてみた。あとは時間をゴニョゴニョするだけ、普通に作ったほうがメリット大きい気もするがキニシナイ!!
ヨウカソマソ参上===[・∀・]ノシ
0134131
2007/10/05(金) 23:40:29ID:???この論理で動いてるような気がしてきた。何でもかんでもオブジェクトにするのではなく、
運搬の頻度が激しいデータ、プログラム中で何度も使用するデータをオブジェクトにする。
そんな感じで合ってるのかな?あと、変数の受け渡しは原則、参照で行うみたいな。
0135131
2007/10/06(土) 13:37:33ID:???根: プリプロセッサ、送信データ(実行役)
幹: main(効率よく栄養=処理を振り分ける)
[クラス]・・・大規模にもなるとこれが幾重にもネストされる。
枝: コンストラクタ(葉に栄養=処理を割り振る、葉で生成された養分=オブジェクトを幹に伝える)
葉: メソッド(オブジェクト=養分を生成する)
花: オブジェクト(実行結果=果実の手前)
果実: 実行結果(主の繁栄=実行結果が真)
ちなみに実行結果が偽となるのは幹から花に至るまででエラーが起こった場合。
漏れルール
mainは基本的にクラスに指示を与える以外しない。
コンストラクタでオブジェクトの用意を行う。
メンバメソッドはオブジェクトの加工を行う。
コンストラクタからオブジェクトを返す。
mainは次に必要なオブジェクトを作るクラスへ処理を回す。
0136nobodyさん
2007/10/07(日) 12:52:54ID:???始めまして
まだPHP3ヶ月目ですが早くもオブジェクト指向で挫折><
ちなみに
・「基礎PHP」
・「PHP5であなたもウェブアプリが作れる!」
・「速効!図解プログラミングPHP + MySQL」
を参考書にしています。
分かりやすかったのは基礎PHPです。
掲示版からスケジュール管理に移るところで
Smarty関連を追加するため承継とか出てきてなるほどと思いました。
ただソース理解しても自分では何もできないんですけどねw
0137nobodyさん
2007/10/07(日) 19:12:30ID:???0138nobodyさん
2007/10/07(日) 21:04:45ID:???0139nobodyさん
2007/10/07(日) 21:09:36ID:???ソースとかうpったら
なんか色々言ってもらえるんかな?
このスレでは
0142nobodyさん
2007/10/08(月) 19:27:30ID:???ぜひ皆さんに見てもらって意見聞きたいな^^
http://blogs.itmedia.co.jp/tamaki/2006/06/post_57ab.html
0143nobodyさん
2007/10/09(火) 22:34:59ID:???0144nobodyさん
2007/10/10(水) 16:06:50ID:???0145nobodyさん
2007/10/12(金) 03:46:51ID:???どこまでクラス?
0146nobodyさん
2007/11/12(月) 13:32:18ID:???0147nobodyさん
2007/12/13(木) 08:37:25ID:Q/a8rTy0http://jp2.php.net/manual/ja/ref.spl.php
0148nobodyさん
2007/12/14(金) 02:09:52ID:???0150nobodyさん
2007/12/23(日) 12:51:26ID:???http://www.tkma.co.jp/tjc/j_pop/perfume/profile.html
0152nobodyさん
2007/12/29(土) 00:05:37ID:4ZpocZiG0153nobodyさん
2007/12/29(土) 02:00:56ID:???とりあえずView上で必要な操作を徹底的にControllerに切り離すが良い。
そしてModelからデータを引き出して必要があれば書き込み更新してやりなさい。
0154nobodyさん
2007/12/31(月) 19:44:35ID:???プロフィールクラスのオブジェクトを作ってプロフィールの登録もする
これってしいて言えば何パターン?
0155nobodyさん
2007/12/31(月) 19:47:57ID:???0156nobodyさん
2008/01/01(火) 00:16:32ID:???0157nobodyさん
2008/01/29(火) 11:18:04ID:???作ってみるという案はどうかな?
そして、これが出来たら、ログファイルに保存などの機能をつけ、
wikiみたいに編集が出来る機能を追加していくという感じに。
<編集>
-------------------------------------------------------------
= 2ch
'''2ch'''とは、総合掲示板のことである。
link:[http://www.2ch.net]
-------------------------------------------------------------
<出力>
-------------------------------------------------------------
<b><font size="+1">2ch</font></b><br>
<b>2ch</b>とは、総合掲示板のことである。<br>
link:<a href="http://www.2ch.net">http://www.2ch.net</a><br>
-------------------------------------------------------------
01581 ◆SWtzLesEmM
2008/01/29(火) 11:29:32ID:???OOPの勉強というよりも、どちらかというと正規表現の勉強になるでしょうか?
wikiのパーサーつくるなら、既存のwikiスクリプトや、PEARのText_Wikiが参考になるかもしれませんね。
http://www.phppro.jp/news/172
PEAR::Text_Wiki 1.2.0RC1 リリース 2006年10月11日
http://labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/18
Text_PukiWikiリリース
0159nobodyさん
2008/01/29(火) 11:43:55ID:???C++のOOPの勉強として、文字列を簡単に扱うことが出来るクラスを
自作してみるという演習があったので、それをPHPでもやってみようかなと
思ったものです。
Cでは、文字列を結合したり、splitしたりするのが結構大変なので、
この演習が役に立ったなと思っていたのです。
PHPの場合は、関数を使えばそれで終わってしまうので、もう少し
ひねりを入れたものを考えて見ました。
正規表現を練習するというよりも、正規表現とhtmlの相互変換をする
クラスがあると、プログラムをする際、便利だなという事が実感
出来るのでは?という意味合いです。
(例)正規表現を格納し、html出力する過程。
$text に textarea タグの文字列を格納する。
$str = new ChStr($text);
echo "<html><body>";
$str->Write_html();
echo "</body></html>";
ほら、このクラスがあるとレイアウトを変えたりが、やり易い上に
再利用性が高いでしょ?みたいな。
01601 ◆SWtzLesEmM
2008/01/29(火) 11:47:24ID:???PHPのclass、オブジェクト指向プログラミングに関する質問です。
http://q.hatena.ne.jp/1187962431
↑
2番の回答者の解説が分かりやすいと思いました。
6番の回答者のサンプルコードも参考になりましたが、これは「インターフェース」の利用方法ではありませんね。><
インターフェイス
http://www.phppro.jp/phpmanual/php/language.oop5.interfaces.html
あるクラスが実装する必要があるメソッドの種類を、これらのメソッドの実体を定義することなく、指定するコードを作成できるようになります。
インターフェイスはキーワードinterfaceにより定義され、通常のクラスと同様に定義することができますが、メソッドの実装は全く定義されません。
01611 ◆SWtzLesEmM
2008/01/29(火) 12:00:16ID:???なるほど!(・∀・)
文字列を扱う処理は、いろんなところで出番がありそうですね!
wikiの文法(表記方法)が使える掲示板とか作れそう^^
0162nobodyさん
2008/01/29(火) 12:04:23ID:???メンバ
private $m_str; // 正規表現文字列を格納する。
コンストラクタ
ChStr($str) // 正規表現の文字列を受け取る。
private メソッド
ch_to_html() // 正規表現をhtmlに変換する。
public メソッド
Write_html() // 格納している文字をhtmlで出力する。
Write_text() // 格納している文字を正規表現で出力する。
---------------------------------------------------
本当は、ログファイルへの保存や読み取りなどを機能として
考え、そのあたりまで含めたクラスの設計をした方が
いいんだろうけれど、まずは簡潔にする方向でいきます。
で、後々拡張の方向で。
01631 ◆SWtzLesEmM
2008/01/29(火) 12:04:44ID:???(…使ったことないので実感がありませんが^^)
PHPでは実装済みのinterfaceを多重に実装できない
http://blog.xole.net/article.php?id=589
http://blog.xole.net/article.php?id=597
01641 ◆SWtzLesEmM
2008/01/29(火) 12:25:09ID:???こんなかんじのプログラムと似ているかもしれませんねー。
60行で作るPHP用テンプレートエンジン
http://anond.hatelabo.jp/20071030034313
>テンプレートの中身を置換する
>function convert_string($s)
↑置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
= 文字サイズ変更、''' 強調、link: リンクとかの記法の置換を担当するprivateメソッド
01651 ◆SWtzLesEmM
2008/01/29(火) 12:34:03ID:???関数、オブジェクト、クロージャ
http://d.hatena.ne.jp/brazil/20060131/1138692196
>オブジェクトは、データに処理がくっついたものです。
>array.map()のように、後に後に処理を追加していく書き方は、順にコードを追えるため読みやすく、また書きやすいです。
クロージャっていう仕組みは、PHPにはないですね?><
大は小を兼ねる…クロージャの代わりにオブジェクトが使えればとりあえずOKかな?(・∀・)
0167nobodyさん
2008/01/29(火) 13:18:38ID:???> 置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
本来ならば、そうなるでしょうね。それらはすべてprivateで作っておいて、
外部には、一つのインターフェースのみ(この例の場合はWrite_html()がそれに該当)
公開となるでしょう。
記号ごとに別々にメソッドを定義しておけば、記号とhtmlの関係が変わる時は、
どのメソッドを触ればよいかが分かるし、それを変更したことで、
他のメソッドには影響は無かったりします。
(これが構造化プログラムの場合は、目的のソースと目的ではないソースを
見極めるところから始まります。)
-------------------------------------------------------------------------
この ChStr に汎用性を持たせる場合は、Write_html()というよりも、
Get_html()とし、html文字列を return する事になるでしょう。
そうすると、別なプログラムで、「出力結果をファイルに保存する」という
使い方も出来ます。しかし、今回は初回なので、Write_html()とし、
メソッド内部で echo 使うことにします。
0168nobodyさん
2008/01/29(火) 13:22:48ID:???学ぶために具体的に物を作るのと、実用性を考えて物を作るのは
別だと思う。なので、今回はこれでいいと考えている。
現に、初心者向けの書籍に載っているソースの実用性はゼロだ。
0169nobodyさん
2008/01/29(火) 13:59:05ID:???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;
}
}
?>
0170nobodyさん
2008/01/29(火) 14:03:31ID:???<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>
01711 ◆SWtzLesEmM
2008/01/29(火) 14:10:04ID:???確かにそうなんですが、「勉強のため」という目的もあるので、自分で作ってみるというのもありでしょうか?^^
でも、答えが分かっている問題を解くのは楽ですね。>Text_wiki
車輪の再発明 - Wikipedia
http://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E
車輪の再発明とは、「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまう事」を意味する
ある技術の意味を理解させるために、意図的に車輪の再発明を行わせる場合がある
01721 ◆SWtzLesEmM
2008/01/29(火) 14:19:35ID:???構文解析 - Wikipedia
http://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90%E5%99%A8
今までにいろんな仕組みが考えられてきたみたい。
…本格的にやると奥が深そうだけど、一度仕組みを勉強しておいたら、いろいろ使えそうな予感!(・∀・)
↓wikiの仕組みを自分で作っている方は結構いるみたいですねー。
PHP用の汎用WikiParser作り中
http://tdiary.ishinao.net/20050323.html
RandomNote/PHPについて
http://tbox.jpn.org/wiki/rnh/index.php?AboutPage.txt
0173nobodyさん
2008/01/29(火) 14:21:38ID:???・ch_to_html() の中身を書く。
・[text.php] の機能を充実(テキストファイルに保存するなど)させ、wikiを作る。
・上記とは別に、 ChStr クラスを使い、BBSを作る。
・ChStr クラスに clear()、SetStr() 等のメソッドをつけ加え、汎用性を持たせる。
01741 ◆SWtzLesEmM
2008/01/29(火) 14:38:20ID:???RandomNoteのMain.phpは参考になるでしょうか?
preg_match
preg_replace
array_push
array_pop
などの関数を使って、文字列の切り貼りをしてるんですねー。
0175nobodyさん
2008/01/29(火) 14:39:05ID:???メソッドの中でstringをreturnせずにecho使うのは>>167で書いてるように汎用性って面もあるけど
処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
0176nobodyさん
2008/01/29(火) 15:39:09ID:???> OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
OOPについて説明するとなると、具体的なソースコードとは離れた方が
良くなったりしますからね。
(クラスの使い方書いているように見えるとしても、)PHPでclassを
組む場合のメリットみたいな位置づけで学んでいこうと思っています。
> 処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
確かに汎用性以外にそういう目的もありますね。
次のものでstringで返すように書き換えます。
0177nobodyさん
2008/01/29(火) 18:16:08ID:???いきなりそれをやると分かりにくくなるかな・・・
0178に ◆lKs5QMUHoA
2008/01/29(火) 19:20:19ID:???今までnobodyさんで書いてたけど、分かりにくくなるかと思ったので
酉入れるようにしてみます。
>>5に書いてあるように、オブジェクト指向は「変数を保持できる事」が
メリットだと思うのですが、これがWebアプリだとどうも実感が無かったりします。
リッチクライアントだと、マウスのクリックに合わせて、メソッドが呼び出され、
そのアプリケーションが終了するまでの間、各種オブジェクトの中の変数に
状態が保持されるという構造なので、そのメリットが感じられるのですが、
Webアプリでは、POSTする度にオブジェクトの変数の状態はリセット
されてしまうので、クラスを書いたとしても、結局はグローバル変数から
各種オブジェクトの変数に代入するみたいなコードを書かなくては
ならなくなってしまうので、このメリットがあるのかと思ってしまうのです。
これは、勉強不足だからなのでしょうか。。。
0180nobodyさん
2008/01/29(火) 23:05:47ID:???読んだことがあるけれど、この話本当なの?
具体的に何処でどういう商売をしての話なんだろうか。
アプリケーションを売る話?それとも開発環境用のソフトを売る話?
0181nobodyさん
2008/01/30(水) 21:59:22ID:???ボタンのクリックに関する全ての画面遷移に関してserializeとunserializeを管理する必要があるだろ
<?php
require_once("hiroyuki.class.php");
$hiroyuki = unserialize($_SESSION["hiroyuki"]
0182nobodyさん
2008/01/31(木) 07:20:40ID:NaJ3keB3ユーティリティクラスの再実装みたいな事を熱心にやっても
あまり意味が無いと思いますよ。
まさにあなたの言う「いちいち書くのがめんどくさい」のを回避する為に
OOPがあるんだと思います・・・
OOPの勉強なら、簡単なWEBフレームワークを自作するのが一番良いよ。
知識の無い段階でいきなりPHPでOOPって無理だと思いますよ。
背伸びせず、まずjavaやC#を学習する方が近道かもしれないよ。
0183nobodyさん
2008/01/31(木) 08:15:31ID:???0184nobodyさん
2008/01/31(木) 17:31:43ID:???読み込んで表示させるというものを作ってみました。
ファイル:全部で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);
?>
0185nobodyさん
2008/01/31(木) 17:32:35ID:???<?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();
}
}
}
?>
0186nobodyさん
2008/01/31(木) 17:33:57ID:???<?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;
}
}
?>
0187nobodyさん
2008/01/31(木) 17:37:50ID:???<?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>";
}
0188nobodyさん
2008/01/31(木) 17:39:35ID:???// 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();
}
}
}
?>
0189nobodyさん
2008/01/31(木) 17:51:38ID:???0190に ◆lKs5QMUHoA
2008/01/31(木) 19:03:23ID:???これをより抽象化させていって、「継承して使ってください」という
方向にするのか、それとも最初はクラスの数を増やさないように
しながら簡単なアプリケーションを作る方向にするべきか。
どっちの方向に持っていったほうがいいのか迷うな。。。
ま、そんなことを考える暇があったら手を動かしてみろという
話なのかもしれないが。。
0191nobodyさん
2008/01/31(木) 19:08:05ID:???自分で考えるのも良いが、君が今やっていることを
やってしまっているのが、フレームワークだ。
まず既存のフレームワークがどうなっているのか参考しろ。
0192nobodyさん
2008/01/31(木) 19:44:25ID:???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;
0193192
2008/01/31(木) 19:50:52ID:???疎結合にとかDRYにっていうのがだんだんわかってきた
理解したところで戻ってきて〜の方が結果的に早そう
俺はまだ勉強中だからそこまで行ってないけど
0194に ◆lKs5QMUHoA
2008/01/31(木) 19:56:23ID:???> $view = new CFView();
> $view->m_type = 'in';
これみたいに、直接メンバにアクセスするのは構造的に良くないと聞いたことが
あるよ。「データをやり取りするのは、インターフェースを通じて」という原則を
守るべきだと。
そうしなければ、CFViewクラスを改変する人は、そのクラスを使っている人の
コードを考慮して、メンバの値や変数名を自由に変える事が出来なくなるから。
なので、私は、コンストラクタで値を渡しても良いし、コンストラクタで値を渡して
いなければ、値を渡すためのインターフェースを使って渡すようにする仕様が
適当かなと思っている。
0195192
2008/01/31(木) 20:08:35ID:???あとコンパイルするときに全部チェックしてくれる言語とそうじゃない言語ってのもある
phpなんだしゆるーくやればいいじゃん なんていうと怒られるかw
0196に ◆lKs5QMUHoA
2008/01/31(木) 20:13:09ID:???だったら、コンストラクタで値を渡すよりも、インターフェースで値を
設定するような仕組みになるだろうね。
コンストラクタだと、一度値を設定したら、そのオブジェクトが破棄される
まで、再度設定が出来なくなるから。
0197nobodyさん
2008/01/31(木) 20:22:00ID:???それを用意した上でコンストラクタに引数を渡すなら渡せば良い。
複雑で多くの設定をしなきゃならない時以外、
newした直後に使える状態になっている方が使いやすい。
> $view = new CFView();
> $view->m_type = 'in';
これをセットで書かなきゃならないなら、
> $view = new CFView('in');
と書きたい。
0198に ◆lKs5QMUHoA
2008/01/31(木) 20:26:00ID:???「このモジュールを使う場合、このように書いてくださいね。」
というコードは、なるべく少ない方がいいからね。
なので、とりあえず設定の値はコンストラクタにいれるという
設計で書いてみた。
0199に ◆lKs5QMUHoA
2008/01/31(木) 20:31:34ID:???具体的にどのフレームワークを使って、どんなプログラムを書いて
みたらいいのか迷うなぁ。
とりあえずはこのあたりに載ってるものの、「和モノ」あたりからかな。
http://pc11.2ch.net/test/read.cgi/php/1197383840/3
フレームワーク自体の自作の話もいくつかあるみたいだ。
ttp://codezine.jp/a/article.aspx?aid=104
0200192
2008/01/31(木) 20:36:05ID:???あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の仕事なんじゃないかなと思うんだけど違うかな
0201192
2008/01/31(木) 20:42:33ID:???ごめん気にしないで
0202に ◆lKs5QMUHoA
2008/01/31(木) 20:46:31ID:???> viewに渡すデータはセッタで渡したくならない?
表示させるデータはセッタがいいだろうね。
> あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の
> 仕事なんじゃないかなと思うんだけど違うかな
>>185のソースがそれにあたるものだと思ってたけど。
if( ($form_str == "")or($form_str == "in") ){
省略
}elseif($form_str == "out"){
省略
}
コントローラは、POSTしてきた値を見て、必要なModelやViewを
選択し、実行する役割なので、それを実現したつもり。
0203に ◆lKs5QMUHoA
2008/01/31(木) 21:58:27ID:???CFControlクラスで、CFViewを使って表示する内容までもを
指定していする処理を書いていたのは間違いかな?
検索結果の表示や、データの更新の場合は、
Control→Model→View だけど、
ボタンを押した時の画面の展開のみの場合は、
Contol→View という流れとなり、Viewオブジェクトを
生成するクラスが異なるという処理でいいのかな?
0204に ◆lKs5QMUHoA
2008/02/01(金) 07:38:53ID:???各クラスの役割は以下のような感じでいいかな?
Control
・POSTでデータを受け取り、その値に不正なものが無いかをチェック。
・変なところからのアクセスではないかをチェック。
・$_POST["Form"]の値をみて、それに必要な画面と処理を判断する。
Model
・SQLを発行し、データを受け取る。
・データをViewクラスに渡す。
View
・フォームを表示する。(フォームごとにクラスを分けたほうがいいのかは迷うな)
・データを1件受け取り、tableタグでレイアウトを調整し、表示する。
0205nobodyさん
2008/02/01(金) 09:44:17ID:???0206nobodyさん
2008/02/01(金) 11:08:23ID:???読むとwebアプリについて学べるのではないかと思っている。
やることが多くなったけれど、とりあえずは以下の3本だてで
勉強してみることになるのかな。
MVCに分けて、簡単なアプリを自作する。
(ログイン、メニュー、検索条件指定、検索結果、データ編集などの画面があるもの)
和モノフレームワークを使って学ぶ。
簡単なアプリを自作する。
http://pc11.2ch.net/test/read.cgi/php/1197383840/3
サンプルで理解! フォームデータの受け渡し
ttp://www.atmarkit.co.jp/flinux/rensai/mysql5_03/mysql5_03a.html
0207nobodyさん
2008/02/01(金) 12:06:10ID:???class CObject ってあって、必ずそれが継承されて作られてるよね。
これの都合って何なんだろう。(メリットは何?)
javaも.NETもこういう基本クラスがあるよね。
0208nobodyさん
2008/02/01(金) 12:19:15ID:???0209nobodyさん
2008/02/01(金) 13:06:22ID:???サンクス。
でも、オーバーロードが出来ない場合は逆に足かせになる可能性もあるね。
例えば、継承されているクラスが沢山ある状況でObjectクラスに
メソッドを追加する場合とか。
0210nobodyさん
2008/02/01(金) 16:28:22ID:???コントローラとビュー
基本的にはね
0211nobodyさん
2008/02/01(金) 16:49:11ID:???フレームワークレベルのクラス構造となると、その構成が全く分からなくなって
来るんだよなぁ。何かコツのようなものはあるのかな?
処理の内容を追いかけると、次々に別のクラスに処理を渡す構造になっていて、
最後はあっけない、みたいな感じだ。
フレームワークを作る場合のクラスの設計手法を身につけるなどしないと
いけないのかも。
メンバに定義はしていないけれど、メソッドではその変数をエラーが
出ないように処理が書かれているっていう書き方は多いようだ。
そうしておけば、そのフレームワークを使う人は、クラスを継承して
メンバに値を代入するだけで良い。
0212nobodyさん
2008/02/01(金) 18:37:23ID:???MVCのうちどれにあたるのかがいまいちです。
ttp://www.stackasterisk.jp/tech/php/phpMvc01_01.jsp
Result.php は、Viewにあたるものという解釈でいいんですよね?
0213nobodyさん
2008/02/01(金) 18:47:22ID:???特集:第3回 PHPを思うままに操れるようになる「MVC」と「Smarty」 (1/4)
ttp://www.itmedia.co.jp/enterprise/0402/19/epn01.html
0214nobodyさん
2008/02/01(金) 18:50:51ID:???0215nobodyさん
2008/02/01(金) 20:08:38ID:???ハタさんのブログ : : php
http://blog.xole.net/category.php?k=php
0216nobodyさん
2008/02/02(土) 07:42:39ID:???例えば、サブミットボタンの処理ハンドラがオーバーライドで記述可能で
そこでフォーム値をモデルに渡して処理させるみたいなやつ・・
「POST」や「GET」とかローレベルの概念は全て隠蔽されてて
フレームワークにイベント発生時のロジックだけ記述して終わりみたいなの・・・
そしてPHPであれこれ試行錯誤したあと、ASP.NETとか参考にするとね
PHPでOOPするバカらしさに気付くかもしれない・・・OTL
0217に ◆lKs5QMUHoA
2008/02/02(土) 08:25:40ID:???あって、やらなくなったな。
ある程度Webアプリを学んだ事のある人には便利なんだろうけれど、
初めて学ぶ人には、ドキュメントが少なすぎだし、いきなりイベントドリブンで
やるのはどうかと思った。
で、まずは、Webアプリの基礎をやるという意味合いでPerlをやってみた。
で、今はPHPをやっている。PHPそのものがOOPに完全な対応をしていない
ので、これで大規模なアプリを組むことも無いかなと思っている。
対応したとしても、それからノウハウが出てくるので、さらに数年先になる。
でも、学ぶ時は、既存のモジュールを使って早くやるのよりも、モジュール
なしの状態で、モジュールを作ってみる方がいいので、とりあえず今は
PHPでOOPです。
0218nobodyさん
2008/02/02(土) 09:56:37ID:???多分、その違和感のある概念がOOPの本質だと思うよ。
そしてその概念は、洗礼された実装に触れることでしか
身につかないとも思うんだ。
初心者こそイベントドリブンを真っ先に学習したほうがいいよ。
最終的に、理解し易く安全な実装方法に結びつくと思うからね。
PHPでOOPで実装ってケースはありだとは思うけど、
概念は別で学習した方が効率的だと思うんだ。
0219nobodyさん
2008/02/02(土) 13:32:52ID:???普通にプログラミングしていると使うだろ?
switchに取り付かれているとかそういうレベルに聞こえるんだが。
0220nobodyさん
2008/02/02(土) 15:21:16ID:???どっちが正しいのかな?
・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
Control クラスが、Model からデータを受け取り、View クラスへデータを渡し、
描画指示を出す。
・Model クラスのメソッド内で、View クラスのインスタンスを生成する。
Model クラスが、Viewクラスへデータを渡し、描画指示を出す。
Control クラスは、View クラスを一切操作しない。
それとも、こういうところまでは理論的には定めていないので、
ケースバイケースであり、どちらがよいというものは無いということかな?
0221nobodyさん
2008/02/02(土) 15:36:53ID:???02221 ◆SWtzLesEmM
2008/02/02(土) 16:44:49ID:???…こんなのありました。^^
PHP イベントドリブン に一致する日本語のページ 約 10,600 件
●PRADO
http://www.pradoframework.com/wiki/index.php/Ja:What_is_PRADO
>PRADO はコンポーネントベースかつイベントドリブンなウェブアプリケーションを開発するためのPHP5フレームワークです。
●S2Prado.PHP5
http://labs.s2php5.jp/s2prado.php5
http://blog.xole.net/article.php?id=553
>S2Baseの方は待望のPRADO対応。
●Piece Framework
http://trac.piece-framework.com/piece-unity/wiki/ja/Start
>Piece_Unityは、Visual BasicやDelphiのようなイベントドリブンなフレームワークです。
●Delphi for PHP
http://www.codegear.com/jp/products/delphi/php
http://orz.qzlab.com/yamagw/index.php?Delphi%20for%20PHP%A4%CE%BB%C8%A4%A4%CA%FD
>イベントドリブンなロジックの実装が容易に実現する。
●Pharon
http://pharon.lolipop.jp/
>最大の特徴は、wizard によりイベントドリブン型のスケルトンを自動作成することです。
02231 ◆SWtzLesEmM
2008/02/02(土) 17:00:36ID:???イベントドリブンは、PHPよりもむしろFlash/Flexとかで使われる仕組みなのでしょうか?
レガシーの中心でのOOP
http://kaede.to/~canada/doc/2005/07/06/
>Webプログラミングにおいて、ブラウザとのやり取りがレガシー(古典的)なデータ交換に過ぎず、これがWebプログラミングを難しくしている
>Webは1ページごとに毎回セッションが起動し、ドキュメントを表示するとすぐ終了する。
>オブジェクト指向プログラミングにおける利点の1つであるイベントドリブンなプログラミングは不可能だ。
>何しろ1セッションに1イベントしか発生しないのだから。
>と同時にセッション状態を保存する必要も出てくる。
http://www.adobe.com/jp/devnet/flex/articles/framework_beta_print.html
>インタラクティブ性に優れたイベントドリブンなインタフェイス
http://www.atmarkit.co.jp/fwcr/rensai/flex203/01.html
>イベント処理によってアプリケーションを構築する手法はイベント駆動型(イベントドリブン)と呼ばれます。
http://www.azul.systems-noel.jp/item_9.html
>Flex2はイベントドリブンなので、ビューに起こったイベントをコントローラのリスナでキャッチするように意識すれば、MVCの分離はきれいにできるようになっています。
>なんかほんとにJavaのSwingを使ってるような気分になりますね。
http://bitmap.dyndns.org/blog/archives/001215.html
>イベントドリブンモデルには、主に以下の 4 つのオブジェクトが登場する。
02241 ◆SWtzLesEmM
2008/02/02(土) 17:05:16ID:???>・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
こっちの方が、Controlにまとまっている分だけスッキリしており、分かりやすいコードになるんじゃないでしょうか?
0225nobodyさん
2008/02/02(土) 17:24:12ID:???レスありがとうございます。
1番目の方にすると、Modelクラスから取得したデータを
Viewクラスに渡すことになるので、その分余計にメモリや
CPUを消費してしまうのでは、と心配になって聞いてみましたが、
考えてみると、コードの見易さなどを優先するのがOOPですので、
そちらの方がいいですね。
でも、フレームワークのソースなどを見ていると、
各クラスが、メンバに、別のクラスへのリファレンスを持ってたり
するので、もっと理論に従った組み方があるのかも、と思っています。
0226nobodyさん
2008/02/02(土) 17:36:37ID:???ファイル:全部で8つ。index.phpを実行する。
抽象クラスと具象クラスに実装を分けてみました。
csv.txt(※前回と同じ)
index.php
cfcontrol.php
アブストラクトとして実装
cfview.php
cfmodel.php
コンクリートとして実装
data_model.php
index_view.php
output_view.php
0227nobodyさん
2008/02/02(土) 17:38:02ID:???<?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();
?>
0228nobodyさん
2008/02/02(土) 17:39:03ID:???<?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);
}
}
?>
0229nobodyさん
2008/02/02(土) 17:39:58ID:???<?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);
}
}
?>
0230nobodyさん
2008/02/02(土) 17:40:48ID:???<?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;
}
}
?>
0231nobodyさん
2008/02/02(土) 17:41:48ID:???<?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>";
}
}
?>
0232nobodyさん
2008/02/02(土) 17:42:29ID:???<?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>';
}
}
?>
0233に ◆lKs5QMUHoA
2008/02/02(土) 19:04:13ID:???サンプルソースありがとうございます。
抽象クラスの書き方に慣れてますね。私はこのあたりを
しっかりとやってなかったのでちょっと苦手です。
ま、しっかりと勉強していきたいと思います。(^^;
ソースを読んでいて、1点気になったので質問をしたいのですが、
class CFView と class CFModel において、以下のように
パブリックメソッドと仮想メソッドを作り、パブリックメソッドから
仮想メソッドを実行する形式にソースを書いた理由は何でしょうか?
出来ましたら、この設計にした意図を教えていただきたいと思います。
function Execute($param) // パブリックメソッド
{
return $this->_OnExecute($param);
}
function _OnExecute($param) // 仮想メソッド
{
trigger_error('オーバーライドしてね。', E_USER_ERROR);
}
0234に ◆lKs5QMUHoA
2008/02/02(土) 19:24:37ID:???レスありがとうございます。
イベントドリブンそのものは、VBでWindowsアプリを組んでやったことがあるので
すぐに入れたのですが、Webアプリを作る際、イベントドリブンでしかやった事が
無いというのは致命的だと思ったので、PerlやPHPでやってみています。
(ASP.NETは、便利ではあるが、IISを使えとか、.NET Frameworkを使えとか
非常に限定される。)
構造化プログラミングで、あまり命名規則を考えずにプログラムをしていると、
グローバル変数や関数が多くなった時、その把握が出来なくなったりする
わけなのですが、そういう苦労する体験をした後、OOPを習うと、その便利な部分が
見えてくるわけです。OOPは経験による結論的な理論だな、と理解できるわけです。
その理解のために、とりあえず、苦労をする方法(PHP で 0 から OOP)で
やってみているのです。
今は、このように考えています。
0235nobodyさん
2008/02/02(土) 19:59:40ID:???ポカ・ポカ テンキュー
0236nobodyさん
2008/02/02(土) 21:30:36ID:???PHP4では全てパブリックだけど例えばC#では以下の実装になるんだ
public object Execute(object parpam)
protected virtual object _OnExecute(object parpam)
CFControlから_OnExecuteメソッドを隠蔽する意図なんだよ。
_OnExecuteはCFViewやCFModelのサブクラスにだけ見えれば十分なんだ。
0238に ◆lKs5QMUHoA
2008/02/03(日) 14:47:56ID:???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の構成ということでよろしいのでしょうか。
0239に ◆lKs5QMUHoA
2008/02/03(日) 14:50:55ID:???となんとなく思ったりもしたのです。
[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");
0240nobodyさん
2008/02/03(日) 15:27:26ID:???実例コードが載ってるのがいい
PHPでMVC第1回:前編
ttp://www.stackasterisk.jp/tech/php/phpMvc01_01.jsp
0241nobodyさん
2008/02/03(日) 15:52:25ID:???0242nobodyさん
2008/02/03(日) 16:56:56ID:???0243に ◆lKs5QMUHoA
2008/02/03(日) 19:47:22ID:???メモとかを残していく都合もあると思ったから、HP解説してみた。
ttp://www.geocities.jp/narutobakijp2/
本当は、>>1さんがソースの管理とかもしてくれたりしたら、うれしいw
0244nobodyさん
2008/02/04(月) 01:44:33ID:???いちいちzipを解凍する気にならない
0245nobodyさん
2008/02/04(月) 09:02:58ID:???CFViewクラスに具体的な実装をしちゃダメなんだよ。
そもそもHTMLのフォーム処理とかは、あとでPEARとか使えばいい。
サブクラスをうまく呼び出す仕組みだけを実装していくんだ。
0247nobodyさん
2008/02/04(月) 23:36:13ID:???構造化プログラミングはルーチンを呼ぶ方向で実装すると思うけど
OOPではルーチンに呼ばれる方向で実装して行く感じだよ。
大枠の骨組みだけを抽象クラスで作成して、処理は具象クラスで行うんだ。
インターフェイスさえ同じならあとで個別にパーツを交換出来たりするからね。
だったら基底クラスのメソッドなんて数個で十分じゃないかと思うんだ。
やたら複雑でよくばりな機能のクラスなんて、再利用の価値がないからね。
0248に ◆lKs5QMUHoA
2008/02/05(火) 01:28:01ID:???レスありがとうございます。
> 構造化プログラミングはルーチンを呼ぶ方向で実装すると思うけど
> OOPではルーチンに呼ばれる方向で実装して行く感じだよ。
私は、継承を活かした設計をした事が無かったので、ちょっと方向性を
誤ってしまったようですね。
Viewは、表示をつかさどるのだから、html表示を請け負うのでは、と
思っていたのですが、それよりも抽象的な枠組みを定義するという
ことですね。
となると、html表示は(PEARを使わないのであれば、)htmlタグの
記述を行うCF_HTMLクラスを作り、Viewの具象クラス内で
インスタンスを生成ということですよね?
0249nobodyさん
2008/02/05(火) 08:55:19ID:???HTML処理のヘルパクラス作成はあまりOOPの勉強にならないとも思うんだ。
もう既に頭の中で実装出来ているだろうし、引数を関数で処理するだけでしょ?
それよりも例えばPEARのHTML_QuickFormやテンプレートレンダラのSmartyを
Viewと連携させる仕組みとかを考えたりした方がよっぽど面白いよ。
すべてをフルスクラッチするプログラミングの方向性は必ずしも得策じゃないよ
既存のライブラリやコンポーネントを上手く利用するのもOOPの要素なんだよ。
0250nobodyさん
2008/02/05(火) 11:06:34ID:???継承を用いた設計などが入った解説)
この連載は良いかもしれない。
オブジェクト指向プログラミング超入門
.NETでオブジェクト指向プログラミングを始めよう
http://www.atmarkit.co.jp/fdotnet/basics/oop_index/index.html
特に第6回は、今まで出てきていた話題だと思う。
Objectクラスで仮想メソッドToStringをもち、それから派生したクラスは、
オーバーロードをする仕組みを図説していて分かりやすい。
第6回 階層の頂点に立つクラス
http://www.atmarkit.co.jp/fdotnet/basics/oop06/oop06_01.html
0251nobodyさん
2008/02/05(火) 11:52:25ID:???PHPのプログラマにも非常に参考になると思いますよ。
.NETの世界はクラスベースなので初めからOOPの思考で実装します。
関数が作れないので構造化思考のVB6プログラマとか、クラスをnewせずに
引数を大量に渡すスタティックメソッドを呼んだりしてしまいます・・・
PHPはC言語での関数モジュールを呼び出す実装スタイルに近いので
やはりクラスを使って構造化プログラミングをしちゃいがちですね。
普及しているPHP4がOOP対応不十分なのと、開発環境が貧弱であることも
PHPでOOPがなかなか利用されない原因になってたりしますよね。
プロテクテッドメソッドの概念とかIDEがないと、なんでそうするのか
なかなか理解出来ないとも思いますしね。
0252nobodyさん
2008/02/05(火) 11:56:50ID:???クラス構成で、Viewに絞った構成を考えてみた。
[View]
├[認証]
├[個人情報入力]
├[メニュー]
├[検索指定]
├[検索結果]
別の案として、[View]から[Input View]と[Output View]の
二つを継承し、さらに以下のような継承も浮かんだけれど、
継承して分ける必要性は無さそうなので、上記の方が良いように思う。
[Input View]
├[認証]
├[個人情報入力]
[Output View]
├[メニュー]
├[検索指定]
├[検索結果]
0253nobodyさん
2008/02/05(火) 12:16:06ID:???[View]
├[LoginView]
├[InsertView]
├[MenuView]
├[SelectView]
├[ResultView]
こんな感じ?
0254nobodyさん
2008/02/05(火) 13:28:44ID:???各画面([LoginView] [InsertView] [MenuView] ・・・)で
エラー確認用のメソッドをオーバーロードする形で。
開発中はPOSTで受け取ったデータとかを画面上部に表示しながら動作確認する
っていうのは、よくやるからね。
Objectクラスを継承する形にするのは、このスレでは共通したメソッドの
実装という理由だ。という話だったけど、リファレンス関係の処理で
便利だという話がサイトに載っているようだね。
このあたりの考え方も活かすと良いかもしれない。
ただ、PHPのOOPだとうまく実装出来ないかもしれないが。
>>207-209 >>250
0255nobodyさん
2008/02/05(火) 13:44:31ID:???Select // データ取り出し
Delete // 削除
Insert // 新規追加
Update // 既存データの更新
>>228に載ってる既存のクラスには Execute があるけれど、
これも残しておくべきかな?
0256に ◆lKs5QMUHoA
2008/02/05(火) 19:03:57ID:???またソースコードをリニューアルしようかと思ったが、
いざやり始めてみると、データベースを管理する基底クラスの
設計を具体的にどうするかをきめないといけなくなり、それを
どうするかで迷っている。。。
概ね以下のような感じにしたいと思ってるんだけどね。
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; // データベースを格納。
0257nobodyさん
2008/02/05(火) 20:33:23ID:???普通は機能をメソッドに振り分けると思うけど
コントローラのメソッド内で以下の様に
操作出来たら面白くない?
// モデルにフォーム値を渡してデータ書き込み
$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のアプリ作成に必要な要求仕様作ってよ。
0258に ◆lKs5QMUHoA
2008/02/05(火) 23:02:08ID:???要求仕様案
私は眼鏡屋(○○支店の店長)をやっている。
顧客の情報(名前、住所、性別、生年月日、・・・)を管理したい。
・眼鏡を購入した顧客の情報を登録しておき、ある一定期間経つと
新しい眼鏡を購入する案内のDMを発送したい。
→条件検索をしたい。
・登録した情報を検索し、どんなお客様かをすぐに確認出来るようにする。
→例えば、苗字を聞いて、詳細が分かるようにする。
・眼鏡の定期的なメンテナンスで、訪問してきたら、その対応履歴を
登録しておきたい。
→眼鏡のクリーニング、シリコンパッド(鼻にあてるやつ)の交換など
・定期的なメンテナンスは無料であるので、全く店に来ない客には、
その無料案内のDMを発送したい。
→今回は、複数の店舗にまたがった処理はいらない。
・他の社員に勝手に情報を触られないように、認証を通すようにする。
眼鏡の在庫管理は、このシステムとは別。
これは、プログラムの規模が大きくなりすぎるようであれば、
もちろん内容を変えてもいいです。「顧客の情報を登録し、
それを検索する」という流れだと、勉強用サンプルとして非常に
良いのでは、と思いました。
0259に ◆lKs5QMUHoA
2008/02/05(火) 23:21:24ID:???氏名:茂名
フリガナ:モナー
性別:男性
生年月日:H1/3/3
住所:東京都・・・
コメント:ふちなしタイプを希望している。
眼鏡購入日:2007/1/5
眼鏡の型番:2ch
[2007/1/5に購入した2ch]のメンテナンス履歴
2007/2/5:クリーニング
2007/3/15:ネジの交換
2007/5/1:クリーニング、曲がったフレームの修正
顧客のデータ1件に、眼鏡の購入日がつながり、さらに、メンテナンス履歴が
つながる構成になるけれど、今回は勉強用なので、「顧客のデータ1件=眼鏡の購入日1件」
としてもいいかもね。
再度購入したら、顧客の個人情報を0から入力しなおすみたいな。
0260に ◆lKs5QMUHoA
2008/02/06(水) 01:36:05ID:???Execute($param)したあと、Debugとか、もしくは、
Debugの中でExecute($param)を呼び出す処理だと、
<html>タグのそとに確認データが出力されてしまう。
Debug モードを on にすれば、<body>タグの上部に
テーブルで区切ってデータが表示されるとかかな。
だったら、メンバにDebugモードを追加かな。
という感じに考えてる。
みんなどう思う?
0261nobodyさん
2008/02/06(水) 09:30:01ID:???ちょっとしたシステムじゃん・・ (´・ω・)
それこそ既存のフレームワーク使用する案件だよ。
>>260
ディレクティブ付けたechoやvar_dump埋め込みで十分だと思うよ。
むしろその機能を実装するより、デバッガ環境構築した方がいい・・・
OOPに対する基本的概念への理解があまりにも無さ過ぎると思うんだ。
>>255にしても、Executeメソッドに呼ばれる仕組み作ってんのに、
なんで新しいメソッド実装して直接呼びたがるんだろう?
あれほどインタフェイスだけで実装するんだと(ry
それよりコントローラの実装仕様どうするの?
02621 ◆SWtzLesEmM
2008/02/06(水) 10:44:17ID:???>ttp://www.geocities.jp/narutobakijp2/
↓動作サンプルを設置しました。
http://ssurl.net/so2o
↓コードに関するコメントのまとめ(>>184-226辺り)
http://ssurl.net/h8bu
0263nobodyさん
2008/02/06(水) 11:45:05ID:???非常に乙です。m(_ _)m
>>226だけど >>1さんにここまでやって貰っちゃって申し訳ないし
これぞOOPってサンプルを必死に実装してアップするんでしばしお待ちを・・
0265に ◆lKs5QMUHoA
2008/02/06(水) 16:04:09ID:???動作サンプルまでつけていただいて、ありがとうございます。
過去ログも、そのままコピペするんじゃなくて、色をつけたり
分類したりすると非常に分かり易いですね。
ShiftJISだったりとか、スペース2個というのは標準じゃないとかは
気づいてたのですが、そこまで治していただいて申し訳ないです。
0266nobodyさん
2008/02/06(水) 16:34:44ID:???0268に ◆lKs5QMUHoA
2008/02/06(水) 20:19:07ID:???ここで概要をつかんだ後、実際に触れてみるといいかもしれない。
ASP.NET vs. Struts
フレームワーク徹底比較[前編]
http://www.atmarkit.co.jp/fdotnet/special/aspstruts01/aspstruts01_04.html
この文章書いてる人、ネットワーク関連の書籍でよく見かけるよね。
0269nobodyさん
2008/02/07(木) 10:03:39ID:???> OOPに対する基本的概念への理解があまりにも無さ過ぎると思うんだ。
> >>255にしても、Executeメソッドに呼ばれる仕組み作ってんのに、
> なんで新しいメソッド実装して直接呼びたがるんだろう?
> あれほどインタフェイスだけで実装するんだと(ry
ちいたんのフレームワークは、Modelにinsertやdelを持ってるからそれを
参考に設計してみたんだけど。
ttp://php.cheetan.net/manual/model.php
俺はこれから勉強していくところなので理解がないのは認めるが、
このあたりはどういう見解なのかを教えて欲しい。
今回作るMVCフレームワークは、学習用なのでもっと簡潔な
レベルなのを想定しているとか、ちいたん作っている人がOOPに
関する理解が無いだけだとか。
0270nobodyさん
2008/02/07(木) 10:24:36ID:???フレームワーク実装に正解も不正解も無いと思うけどね・・
例えば
・クラスを使った構造化的メソッド呼び出し
$model->insert();
$model->del();
よりも
・ポリモーフィズム
$insert->execute();
$del->execute();
のほうがインターフェイスが規定されていて
簡潔で安全だと説明したかったんだよ。
insertメソッドやdelメソッドを呼ぶ文脈が規定されていたらどう?
insertオブジェクトのexecuteメソッドならオブジェクトが
文脈をコントロール出来るでしょ? どうかな?
学習用だからこそ『呼ばれる仕組み』で実装しようとしているんだよ。
0271nobodyさん
2008/02/07(木) 10:55:50ID:???レスサンクス。となると、
class CInsert extend CView、class CDel extend CView、・・・
みたいな設計にするということ?
ちょっと大雑把になってるけど、CInsertはこんな感じに実装するとか。
(テーブルのフィールドは、a,b,cという場合。)
class CInsert extend CView{
var $field_a;
var $field_b;
var $field_c;
function setItem($field, $data){
if($field == "a"){
$field_a = $data;
}
if($field == "b"){
$field_b = $data;
}
if($field == "c"){
$field_c = $data;
}
}
function _OnExecute($param){
$fp = fopen($file_name,"a");
$write_line = $field_a . "," . $field_b . "," . $field_c;
fwrite($fp,$write_line);
fclose($fp);
}
}
0272nobodyさん
2008/02/07(木) 11:32:07ID:???[認証]
→・ID、パスワードにて認証
・認証成功で[メニュー]へ移動
[メニュー]
→・(新規)[個人情報入力]、[検索指定]画面へ移動するボタンがある
[個人情報入力]
→・名前、性別 を登録
[検索指定]
→・氏名のキーワードを含む検索、性別指定が出来る。
[検索結果]
→・条件に一致するデータを一覧で出す。
・個人情報を修正したい場合は、ここから[個人情報入力]へ移動する。
・個人情報を削除したい場合は、ここで削除ボタンを押す。
0273nobodyさん
2008/02/07(木) 12:35:22ID:???[DataModel.php]
<?php
/**
* データModel抽象クラスです。
*/
class DataModel extends Model
{
# @access private
var $_items;
# @access public
var $file_name;
# @access public
function setItem($key, $value)
{
$this->_items[$key] = $value;
}
# @access public
function getItem($key)
{
return $this->_items[$key];
}
}
?>
0274nobodyさん
2008/02/07(木) 12:36:19ID:???<?php
/**
* データ追加Model抽象クラスです。
*/
class InsertModel extends DataModel
{
# @access sealed
function & _onExecute(&$param)
{
return $this->_OnInsert(&$param);
}
# @access protected
function & _onInsert(&$param)
{
trigger_error('オーバーライドして下さい。', E_USER_ERROR);
}
}
0275nobodyさん
2008/02/07(木) 12:37:26ID:???<?php
/**
* データ追加 サンプルクラスです。
*/
class SampleInsertModel extends InsertModel
{
# @access protected
function & _onInsert(&$param)
{
// ここで初めてユーザ定義のメソッドを実行する。
// FWからここが呼ばれるまで待ってるのがポイント!
// INSERTイベントの処理ハンドラに記述するともとれるね。
return $this->_saveData();
}
/**
* ユーザ定義のプライベートメソッド
*/
# @access private
function _saveData()
{
// リクエストは以下のインターフェイスで取得。
$value = $this->getItem('hoge_data');
// ここで初めてHogeHogeする。
// DBオブジェクト呼ぶなりご自由に!
return $data;
}
}
?>
0276nobodyさん
2008/02/07(木) 13:59:04ID:???[InsertModel.php]
class InsertModel extends DataModel
function & _onExecute(&$param) のところは、
return $this->_OnInsert(&$param); となっているけれど、
return $this->_onInsert(&$param); が正しいという解釈で良いのですよね?
0277nobodyさん
2008/02/07(木) 14:16:55ID:???ソースのサンプルサンクス。
イメージしてたよりも継承が多いですね。
全体ソースコードの可読性よりも、クラス単位での
再利用性を考えた場合は、このような構成になる
のでしょうね。早く慣れないといけません。
0278nobodyさん
2008/02/07(木) 15:36:22ID:???こんな感じでドキュメントもまとめていくと、分かりやすくなるだろうね。
■SampleInsertModelクラス[SampleInsertModel.php]
Model - DataModel - InsertModel - SampleInsertModel
◎概要
DBへのデータの記録、読み取りを行うクラス。
◎メンバ一覧
[publicコンストラクタ]
SampleInsertModel()
[publicメソッド]
setItem($key, $value):setter。フィールド名を指定し、データを登録する。
getItem($key):getter。フィールド名を指定し、データを取得する。
Execute($param):setItemでセットしたデータをDBに記録する。
◎使用例
$model = new SampleInsertModel(); // クラスのインスタンスを生成する。
$model->setItem('Name', 'Tarou'); // [Name]フィールドに[Tarou]を登録する。
$model->setItem('Sex', 'man'); // [Name]フィールドに[man]を登録する。
$model->Execute(); // setItemで登録したデータをDBに書き込む。
0279nobodyさん
2008/02/07(木) 23:22:51ID:???ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/PHP%a5%d5%a5%ec%a1%bc%a5%e0%a5%ef%a1%bc%a5%af.zip?BCUjxqHB4brtVvJJ
0281に ◆lKs5QMUHoA
2008/02/08(金) 08:04:01ID:???例えば、こんな感じでhtmlで書いておいて、ファイル名をクリックすると、その詳細の説明のページに飛ぶとか。
[abstract]
[controls]
空
[models]
DataModel.php、DeleteModel.php、InsertModel.php、SelectModel.php、UpdateModel.php
[views]
HtmlQuickFormSmartyView.php、RenderView.php
[controls]
MainControl.php、SkeletonControl.php
[data]
空
[framework]
Base.php、Control.php、Model.php、View.php
[lib]
Request.php
[models]
SampleInsertModel.php、SampleSelectModel.php、SkeletonSelectModel.php
[smarty]
[cashe]
空
[templates]
index_tmple.html、output_tmple.html
[templates_c]
空
[views]
HtmlQuickFormSmartyIndexView.php、HtmlQuickFormSmartyOutputView.php
IndexView.php、OutputView.php、SkeletonView.php
app.log、appconf.php、csv.txt、hoge.txt、index.php、Main.php、userconf.php
0283nobodyさん
2008/02/08(金) 08:52:15ID:???ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/PHP_FW_DOC_01.zip?BCKv5qHBVNsncE.h
フォルダ内のindex.htmlです、荒いですがご容赦を。
とりあえずトライアルなんでまだリファクタ出来そうだけど・・
[コントローラの処理]
_form_onLoad
_buttonHoge_onClick
[モデルの処理]
_onSelect
_onInsert
[ビューの処理]
_onRender
上記のイベントハンドラにユーザ処理を記述して
フレームワークに呼んでもらう構造になってます。
>>216を実装したつもりです・・・
有名なハリウッドの法則です。
[カプセル化]は良いとして、やはり[継承]と[ポリモーフィズム]を
うまく使うのは最初難しいかもしれない・・
これらの実装もデザパタとしてライブラリ化されたものに過ぎないけどね。
0284nobodyさん
2008/02/08(金) 09:26:17ID:???0285nobodyさん
2008/02/08(金) 11:03:39ID:???ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/OOP_FW_02.zip?BCE07qHBz_6Z6R84
OOP FW ドキュメント
ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/OOP_FW_DOC_02.zip?BCE07qHB2C3Z36pC
すいません再アップしました、ドキュメントにControlが反映されてませんでした。
0286nobodyさん
2008/02/08(金) 11:20:06ID:???0287nobodyさん
2008/02/08(金) 11:51:38ID:???いちゃもんつけるつもりじゃないけれど、気になった点を2つ。
Control.phpのPOSTされたSubmitボタン名取得のところは
クラス化されてないのはどうしてなのでしょうか?
さらに非常にクラスが多くなって面倒になるから?
class Control extends Base
var \$_view_calss;
このメンバはあえてclassにしてない理由はあるのでしょうか。
0288nobodyさん
2008/02/08(金) 12:39:56ID:???POSTされたサブミットボタン名取得部分は説明の通りです・・
今その部分をC#でのデリゲートで実装しようと思ってます。
Viewクラスexecuteのところもこのままでは$eパラメータが
コントローラから任意に渡せないので検討中です。
オブジェクトにexecute以外のパブリックメソッドを
実装しないのが目標です・・(※アクセサ以外)
0289nobodyさん
2008/02/08(金) 13:12:48ID:???Documentsいただいても、追いかけていって、全体構造を把握するのが結構大変。
例えば、SampleInsertModelからその元を追っていくと、以下のような継承構造。
Base - Model - DataModel - InsertModel - SampleInsertModel
俺のメモとして、SampleInsertModelを追いかけていった様子をまとめておく。
■Base(抽象)クラス[fw/framework/Base.php]
●パブリックメソッド
& execute(&$param, $e) →アプリのログを記録する。_onExecute(&$param, $e)を実行
●プロテクテッドメソッド
_onExecute(&$param, $e) →サブクラスでオーバーライドして使用。
■Model(抽象)クラス[fw/framework/Mode.php]
●プロパティ
$src_file_name; // 読み込むファイル名
$dst_file_name; // 書き込むファイル名
0290nobodyさん
2008/02/08(金) 13:15:33ID:???●フィールド
$_items; // コントロール値のハッシュを保存
●パブリックメソッド
setItem($key, $value) // コントロール値を受け取り、$_itemsに代入
getItem($key) // $_itemsの値を返す。
■InsertModel(抽象)クラス[fw/abstract/models/InsertDataModel.php]
●シールドメソッド
& _onExecute(&$sender, $e) →onInsert(&$sender, $e)
●プロテクテッドメソッド
& _onInsert(&$sender, $e) →オーバーライドして使用する。
■SampleInsertModelクラス[fw/models/SampleInsertModel.php]
●プロテクテッドメソッド
$ _onInsert(&$sender, $e) →ここにユーザ定義のコードを記述する。_saveData()を実行
●プライベートメソッド
_saveData() →現在未実装。
0291nobodyさん
2008/02/08(金) 13:32:42ID:???どの段階で実装を替えるかを考えた場合、どのクラスを置き換えれば良いかも分かる。
しかし、俺はこれまでフレームワークの構成などをじっくり読んだりしたことが無いので、
つい、ここまでクラスを継承させるメリットがあるのかなとか思ってしまう。
なんか、1つのメソッドを実装するのに、1回継承してるって感じだよね。
例えば、Model(抽象)クラスの $src_file_name を別のものにする場合、
それ以降のクラスが全部影響するかの確認が必要なわけだから、
Model(抽象)クラス以降のものをすべて一つのクラスにまとめて書いても
同じなんじゃないかと思えてしまう。
こういうのとは別な場面で、継承しているメリットがあるってことかな?
0292nobodyさん
2008/02/08(金) 13:51:09ID:???フレームワークを使った開発のメリット、デメリットを教えてください
http://q.hatena.ne.jp/1188498291
特集:第1回 フレームワーク「Struts」の基礎を知る (3/8)
フレームワークのメリットとデメリット
http://www.itmedia.co.jp/enterprise/0310/06/epn03_3.html
0293nobodyさん
2008/02/08(金) 15:31:59ID:???\$this->_view_calss = \$view_calss;
というコードがあるけれど、右辺の \$view_calss って、
何処でも定義されてないですよね?
このまま動かすと、nullが入るだけのように思えるんだけど。
0294nobodyさん
2008/02/08(金) 16:04:40ID:???個別にはDocに書いてはあるけれど、こういう書き方みると分かりやすくない?
Base - View - RenderView - IndexView
■Base(抽象)クラス[fw/framework/Base.php]
(省略)
■View(抽象)クラス[fw/framework/View.php]
●プロパティ
$post_file; // POSTするファイル名
■RenderView(抽象)クラス[fw/abstract/views/RenderView.php]
●プロテクテッドメソッド
& _onExecute(&$sender, $e) // _onRender(&$sender, $e)を呼ぶ
& _onRender(&$sender, $e) // サブクラスにてオーバーラードする。
■IndexViewクラス[fw/views/IndexView.php]
●コンストラクタ
$this->post_file = 'index.php';
●プロテクテッドメソッド
& _onRender(&$sender, $e) // オーバーライド
→html出力する。テキストボックスと送信ボタン
0296nobodyさん
2008/02/08(金) 16:41:04ID:???無い場合に呼ばれるメソッド)呼ばれるまでの経緯をたどってみたが、非常に複雑だ。。。
[fw/index.php]が実行される。
Mainクラスのインスタンスが生成され、execute(&$app, $e)が実行される。
Base:: & execute(&$param, $e) にて、 Base:: & _onExecute(&$param, $e)が実行される。
これは、Main::execute(&$app, $e)にてオーバーライドされている。
Controlクラスのインスタンスが生成され、execute(&$app, $e)が実行される。
Base:: & execute(&$param, $e) にて、 Base:: & _onExecute(&$param, $e)が実行される。
これはControl:: & _ onExecute(&$param, $e)にてオーバーライドされている。
Control:: & _onExecute(&$param, \$e) にて、Control::_hookedUpControler(&\$sender, \$e)を呼び出す。
Control::_hookedUpControler(&\$sender, \$e) にて、Control::_form_onLoad(&$sender, $e)を呼ぶ。
これはMainControl::_form_onLoad(&$sender, $e)にてオーバーライドされている。
MainControl::_form_onLoad(&$sender, $e) が実行される。
継承関係
Base - Control - MainControl
Base - Main
0297nobodyさん
2008/02/08(金) 17:33:12ID:???symfony入門(1):symfonyで始めるPHPフレームワーク
http://codezine.jp/a/article/aid/704.aspx?p=1
Zend Framework入門(1):フレームワークの全体像とインストール
http://codezine.jp/a/article/aid/1824.aspx?p=1
0299nobodyさん
2008/02/08(金) 19:33:52ID:???Eclipceでのデバッグ画面です
ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/OOPFW_DEBUG.jpg?BC3YDrHBI.a6ljXl
0301nobodyさん
2008/02/08(金) 22:24:55ID:???0303に ◆lKs5QMUHoA
2008/02/09(土) 01:49:09ID:???別で、「フレームワークを作ってみる」の演習という位置づけにした
方がいいかもしれないね。
これからの流れとしては、上のほうにあるように、このソースを
解読・改変していくための補助ドキュメント作成の方向と、
このフレームワークを使ってみる人のためのドキュメント作成
(チュートリアルみたいなもの)になるだろうね。
出来る範囲でみんなで手伝っていってみましょう。
このフレームワークは、MFCみたく、あらかじめ準備された
クラスのメソッド中に書き加えていくスタイルなのかな?
それとも、VBみたいにそういうソースコードを全部隠蔽
してしまう方向でいくのかな?ちょっと気になった。
0304に ◆lKs5QMUHoA
2008/02/09(土) 02:12:22ID:???フレームワークを使ったプログラミングのメリットとデメリットが実感できるね。
今まで、システムを組む際はOOPやフレームワークを使う方向にするべきだと
思ってたけれど、そうでもなく、状況や目的に合わせて選択する
というのが良い事が分かってきたような気がする。
小規模で全体概要を把握したいとか、移植性を考える場合は、フレームワークよりも、
クラスライブラリを使うスタイルの方が良い場合もありそうだ。
0305に ◆lKs5QMUHoA
2008/02/09(土) 08:12:13ID:???2つの方向をやってみて、それぞれのメリットとデメリットを確認していけば、
システムを作る場合の検討材料に出来ると思う。
何でもフルスクラッチしていき、なるべく依存性は無いようにし、(言語の
バージョンくらいに収めるとか)その組み合わせでアプリを作る、みたいな。
0306nobodyさん
2008/02/09(土) 09:45:19ID:???ttp://briefcase.yahoo.co.jp/bc/oopfw
[Controlクラス]
・リクエストオブジェクトの参照の重複の削除
・サブクラスでのフックハンドラ処理修正
・Viewオブジェクトの実行方法修正
※これはViewオブジェクトハンドリングの自由度をました反面、
ユーザからの取り回しが煩雑になったかもしれませんね・・
[Modelクラス]
・継承関係の見直し、ItemBaseクラスの導入などです・・
MVCの継承関係が美しくないですが・・
>>291
リファクタしながら構成を練っていってますが
継承クラスでの責任が小さい単位で分割されていると
大きく修正が入った時も楽だと思います。
>>303
MFCもVB6もフックハンドラに処理を記述していく方式なので
それを参考にしています、サンプルFWも自由にいじってもらって
参考にしてもらえたら良いと思います。
>>305クラスライブラリ方式もいいかもしれないですね。
0307nobodyさん
2008/02/09(土) 10:20:45ID:???【メリット】
1.ビューとロジックの切り分けが出来る。(共同作業時に便利)
http://www.atmarkit.co.jp/fdotnet/aspandvs/aspandvs01/aspandvs01_01.html
2.定型的なコードを何度も書かなくてよくなる。
例えば、ASP.NETでは、POSTの値を取得して・・・などの事を考えなくて良い。
テキストボックスやボタンも、画面にドラッグするだけ。
3.ソースコードが自動的にフレームワークの規約に従った記述方法となり、
全体的な処理構成が把握しやすく、メンテナンスが楽になる。
例えば、構造化プログラミングならば、まず全体構成(どの関数がどんな役割を
持っているかなど)を把握し、そこから問題部分を探すことになる。
フレームワークの場合は、まずはこのイベントハンドラの部分を見れば良いなという事が分かる。
【デメリット】
1.フレームワーク自体の使い方を学ばなければならない。
・言語の基本ルールとは異なった、フレームワーク特有の記述方法があるため、すぐに組めない。
ASP.NETでは、IsPostBack の概念を学ばなければならない。
http://www.atmarkit.co.jp/fdotnet/dotnettips/043postback/postback.html
ちいたんでは、function action( &$c )とか、$c->という書き方と機能を把握しなければならない。
http://php.cheetan.net/manual/tutorial.php
・フレームワーク自体にも得手・不得手など特徴があり、それを把握しなければならない。
ASP.NETはIISが必要な為、自動的にサーバOSはWindowsが必須となり、依存性がある。
ASP.NETとStrutsの比較は、以下のサイトを参照
http://www.atmarkit.co.jp/fdotnet/special/aspstruts01/aspstruts01_01.html
2.フレームワーク自体に問題があると対処が困難。
例えば.NET Framework のバグは、開発元の不具合修正を待つしかない。
オープンソースのフレームワークであっても、ソースコードが大量な為、把握が出来ない。
0308nobodyさん
2008/02/09(土) 11:01:52ID:???Q:どんな時にフレームワークを使った方がいいの?
・短期間で仕上げなければならない時(この場合はフレームワークの使い方を把握しているのが前提)
・チームで分担してシステムを組む時
・バージョンアップを行うなど、長期的な運用が想定される時
Q:フレームワークがあまり向かない場合は?
・個人で小規模アプリを組む時。(一度組んで終わりの場合など)
・そのアプリの全体構成をすみずみまで把握しておきたい場合
・サーバの移植を想定しなければならないなど、環境があまり固定出来ない場合
このような状況の場合は、クラスライブラリの使用を検討すると良い。
0309nobodyさん
2008/02/09(土) 11:18:48ID:???判らないことを考えると、バージョンアップをするようなアプリの開発に向いていると
いえるかどうかは、かなり怪しいと思う。
0310nobodyさん
2008/02/09(土) 11:25:52ID:???そういうケースもあるから入れるか迷ったんだよね・・・
だけど、現在の比較的規模の大きなアプリは何らかのフレームワークで
組まれている事実があるということで、書いてみた。
フレームワークのメンテが突然打ち切られるケースは無いと見ても
良いと思うけどね。事前に何らかのアナウンスがあるはず。
で、フレームワークそのものを入替える必要が生じた時は、もちろん
全部作り直しになるが、この労力は、フレームワークを使わない場合に
比べて楽だよね。という意見です。
0311nobodyさん
2008/02/09(土) 12:20:07ID:???0312nobodyさん
2008/02/09(土) 12:23:25ID:???適当だの無責任だのいうのなら、このスレに来なくて良いと思う。
0313nobodyさん
2008/02/09(土) 12:32:04ID:???0314nobodyさん
2008/02/09(土) 15:20:46ID:???0315nobodyさん
2008/02/09(土) 15:25:19ID:???> Q:フレームワークがあまり向かない場合は?
> ・そのアプリの全体構成をすみずみまで把握しておきたい場合
全体構成を隅々まで把握してなんの意味があるのだろうか?
どうせ数日たったら忘れるんだし。
> ・サーバの移植を想定しなければならないなど、環境があまり固定出来ない場合
> このような状況の場合は、クラスライブラリの使用を検討すると良い。
PHP4、PHP5両対応のフレームワークもあるし、
いろんなデータベースに対応している場合もある。
フレームワークの開発というのは、そもそもが環境が固定されていないので
そういう場合にはなおさらフレームワークを使ったほうが良い。
0316nobodyさん
2008/02/09(土) 15:29:20ID:???0317nobodyさん
2008/02/09(土) 16:52:42ID:???> 全体構成を隅々まで把握してなんの意味があるのだろうか?
> どうせ数日たったら忘れるんだし。
じゃ、この項目は消しておきます。
> PHP4、PHP5両対応のフレームワークもあるし、
> いろんなデータベースに対応している場合もある。
> フレームワークの開発というのは、そもそもが環境が固定されていないので
> そういう場合にはなおさらフレームワークを使ったほうが良い。
PHPスレで言うのもなんだけど、ASP.NETなども含めた総論という考えだったんだけどね。
Windowsサーバなのかなどを気にするとか、PHP5のみ対応のフレームワークで
開発していて、PHP4しか対応していないサーバで動かすことになる場合を
という意味で、環境が固定されない書きました。
0318nobodyさん
2008/02/09(土) 17:04:40ID:???Q:どんな時にフレームワークを使った方がいいの?
・短期間で仕上げなければならない時(この場合はフレームワークの使い方を把握しているのが前提)
・チームで分担してシステムを組む時
・バージョンアップや不具合修正など、納品後もメンテナンスが想定される時
Q:フレームワークがあまり向かない場合は?
・個人で小規模アプリを組む時。(一度組んで終わりの場合など)
・サーバの移植を想定しなければならないなど、環境があまり固定出来ない場合
このような状況の場合は、クラスライブラリの使用を検討すると良い。
0319nobodyさん
2008/02/09(土) 22:32:17ID:???PHP5でやっちゃうと、PHP4の環境で動かなくなるから。
0320に ◆lKs5QMUHoA
2008/02/10(日) 03:19:14ID:???03211 ◆SWtzLesEmM
2008/02/10(日) 18:45:04ID:???>ttp://briefcase.yahoo.co.jp/bc/oopfw
ソースコードを見てビックリ!(・∀・)
コメントが丁寧に書いてあり、OOPを学習する上でとても助かります!
貴重なサンプルを提供していただき、どうもありがとうございました。m(_~_)m
現時点で、バージョンがOOP_FW_02とOOP_FW_03の2つあるみたいですが、とりあえずOOP_FW_02の方をまとめページに掲載させていただきました。
http://ssurl.net/8vyv
>>281
http://ssurl.net/cp7a
ちょっとずつ読んでますが、全部はまだ理解できないです。(´;ω;`)
レスも参考にしてみます。
(=分からないことでも、検索で調べるときのヒント・手掛かりになるので)
0322nobodyさん
2008/02/10(日) 22:19:07ID:???乙です。m(_ _)m
>>306ですが今後は
・認証の仕組み
・ロギングの仕組み
・エラーハンドリングの仕組み
・バリデイトの仕組み
・トークンの仕組み
・リダイレクトの仕組み
・入力→確認→完了の仕組み
・コアオブジェクトの実行権限の仕組み
など実装していく予定です・・
でも、こればっかりやってるわけにいかないので
気長に見守ってやって下さい。
0323に ◆lKs5QMUHoA
2008/02/11(月) 02:31:35ID:???乙です。分かりやすくまとまっていますね。
私も少しずつ読んでいって理解しようと思っています。
他のものに比べ、コメントが多いのが助かりますよね。
>>322
読むほうも時間がかかると思いますので、
一気にやらなくていいと思います。(^^;
0324に ◆lKs5QMUHoA
2008/02/11(月) 02:35:18ID:???>>1さんのOOPで掲示板を作るところは、もう少しクラスを分けたほうが
いいと思ったので、自分なりに作ってみました。
index.phpに、いろいろと処理を詰め込んでいるような感があったので、
それを分ける考え方です。
しかし、DBはテキストベースにしているとか、書き込み欄と表示欄を
同じページにしているなど、基本構成から大幅に変えています。(^^;
http://www.geocities.jp/narutobakijp2/
OOPの勉強として、簡易なBBSを作ってみました。
BBS Version1(2008.2.11)
0325に ◆lKs5QMUHoA
2008/02/11(月) 08:27:05ID:???PHPの場合はハッシュでよかったような気がする件。
まだまだ未熟だな・・・
今後は、これを構造化指向へ変換したプログラムを作り、うpする予定です。
この両方のプログラムを見比べてみることで、OOPのメリットとデメリットが
見えてくるかもしれません。
0326nobodyさん
2008/02/11(月) 10:26:11ID:???ついては分かったけれど、その設計方法のノウハウの文章はぐぐっても
なかなか見当たらない。
「設計というのはそれぞれで目的次第」といってしまえばそうだけど、
hiroxpepeさんのソースや、.NET Framework や java の各クラスの
継承関係の設計を見ていると、何か共通したものを感じる。
その具体的な方針と、それを取る理由がはっきりとは分からない・・・
何か良い文章を見かけた、もしくは知っている方は、お願いします。
0327nobodyさん
2008/02/11(月) 10:50:14ID:???【構造化指向の場合】
ソースコードに書かれている関数とグローバル変数が、どういう階層で組まれているか
(どの関数でどの関数が使われているか。また、どのグローバル変数を使っているのか)
は、その関数の処理内容と、その関係などを把握してからでないと、手をつけられない。
新しくグローバル変数や、関数を追加する場合。また、ローカル変数を宣言する場合は、
その名前がソースコード内で使われているかを都度チェックしなければならないので、
面倒である。
【オブジェクト指向の場合】
ソースコードそのものがクラス単位で分けられているため、手をつける場所がすぐに
分かる。他のクラスに影響するのは、そのクラスとのインターフェースを変更した場合のみ。
新しくメンバやメソッドを追加する場合は、そのクラスの中で使われているメンバや
メソッドを確認するだけなので、対象となる範囲が狭く、チェックが楽。
また、プログラムそのものがクラスで部品化されるため、チームを組んで、分担作業で
プログラミングがやり易い。
【注意】
構造化プログラミングであっても、関数やグローバル変数の名前の付け方を工夫すれば、
もちろん対応は可能である。そのため、メンテナンスを想定する場合は、
オブジェクト指向でなければならないわけでもない。
オブジェクト指向は、構造化指向に比べて特別に「これが出来る」というものではなく、
構造化指向で不便に感じる部分の便利機能である。
0328nobodyさん
2008/02/11(月) 10:57:47ID:???なかなか参考になりました、ありがとう。
326さんのおっしゃる通り、"設計"は経験なんかも必要になってくるので、
考えるよりも手を動かして、簡単なスクリプトを組んでみるのが最良でしょうか。
0329nobodyさん
2008/02/11(月) 12:43:38ID:???・リファクタリング―プログラムの体質改善テクニック
マーチン ファウラー著
高いけどOOPに興味のある方には絶対お勧めですよ。
ポリモーフィズム適用の具体例がコードで解説されていますよ。
構造化プログラミングではGOTO構文を使うのはNGだけど
同様にOOPではswitch構文を使用しません。
ここの部分をポリモーフィズムで実装するのです。
あなたのプログラムにswitch構文がありますか?
その部分はポリモーフィズムで置き換えられますよ。
0330nobodyさん
2008/02/11(月) 12:53:28ID:???>ここの部分をポリモーフィズムで実装するのです。
これは言いすぎ。
OOの基本はモデリングであって、コーディングのスタイルじゃない。
0331nobodyさん
2008/02/11(月) 13:07:00ID:???情報ありがとうございます。
> 構造化プログラミングではGOTO構文を使うのはNGだけど
> 同様にOOPではswitch構文を使用しません。
> ここの部分をポリモーフィズムで実装するのです。
> あなたのプログラムにswitch構文がありますか?
> その部分はポリモーフィズムで置き換えられますよ。
この表現はすごく分かりやすかったです。
こういう感じの具体的なノウハウがあると分かりやすいですね。
>>330
「言いすぎ」というご指摘もごもっともだと思います。
しかし、OOPは、構造化指向に比べてダントツで良い所があるわけでも
ないので、(このため、すべてがOOPに移項してはいない。)
良いところを説明する際は、多少は強調した感じで言わざるを
得ないところがあると思っています。
0332nobodyさん
2008/02/11(月) 13:39:48ID:???そうですね、確かに言い過ぎました・・
GOTO構文は習いませんでしたが、switch構文は習得しちゃいました。
あえてそれを使用しないで組んでみるのも勉強になるのではないでしょうか?
構造化的スタイルとOOP的スタイルを手っ取り早く理解しようとするなら
それぐらいのパラダイムシフトが必要だと思うんです。
もちろんGOTO構文もswitch構文もコーディングには必要です。
0333nobodyさん
2008/02/11(月) 15:01:11ID:???if文もいらないな。
それともswitchを使わずに、
if文で書けばいいのかw
0334に ◆lKs5QMUHoA
2008/02/11(月) 18:07:43ID:???(なんか、自分語りみたいなレスになっているけれど、
OOPの勉強方法についての意見交換にもなるかと思ったので書いておきます。)
私は、プログラミングをこれから勉強しようという時、「無駄・ムラ・無理なく
勉強する」という予備校の受験勉強の風潮を受けていましたので、先生に
「プログラミングを勉強する場合は、どんな風なやり方をしたら良いですか?」
とか「どんな順番で勉強をしていったら良いですか?」と聞いたことがあるのですが、
その先生は、「そんなことを考えている時間があるなら、その分コーディングを
した方が良い」とアドバイスをしました。
実際に手を動かしてやってみると、文章や口頭の説明では言えない、何か体感的な
ものが習得でき、その後の勉強方針もどうやったら良いのかが見えてきました。
「ああ、あの言葉は、こういう意味なんだな」と思いました。
プログラミングは、実技の世界なのだから、実際に手を動かしてみて見えてくるものだと
思っています。
過去に表計算をするプログラムを構造化指向で組むと、処理を関数に分けていく方法が
身についたなと思いました。なので、今度は、構造化指向で苦労をするプログラミングを
してみると、OOPの良さが見えてくるのでは、と思っています。
0335に ◆lKs5QMUHoA
2008/02/11(月) 18:16:42ID:???ttp://www.geocities.jp/narutobakijp2/index.html
OOPの勉強として、簡易なBBSを作ってみました。
BBS Version2(2008.2.11)入力したデータで改行に対応してなかったので、その部分を修正。
BBS Version2の構造化Ver(2008.2.11)上記プログラムの構造化バージョンです。
0336nobodyさん
2008/02/12(火) 04:15:37ID:E8FcAvF50337nobodyさん
2008/02/12(火) 09:16:19ID:???0339nobodyさん
2008/02/12(火) 11:35:52ID:???複雑なデータを持つオブジェクトを作っても、mod_phpはリクエストの度にプロセス生成・終了するわけで、そのオブジェクトも消える。
そもそもウェブアプリはユーザからのリクエストを受けて処理が発生しする構造だから、オブジェクトを永続化しておくことにあまり意味はない。
オブジェクト指向に興味があるなら、GUIのあるアプリケーションとか、ゲームとかを作ってみるとよいよ。
0340nobodyさん
2008/02/12(火) 12:57:39ID:???Booch先生も、「永続性」に対して、「有用ではあるがオブジェクトモデルにとって
なくてはならない要素というわけではない」 って言ってるし。
(もう絶版だけど、Booch法第2版 2.2節より)
0341nobodyさん
2008/02/12(火) 13:17:09ID:???イベントが非同期で発生したりするわけでもないからOOを使うのはどうかなー?って気がする。
だいたいフローチャートで処理書けちゃうしね。
あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
って処理が無駄な気がする。
実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。
0342nobodyさん
2008/02/12(火) 13:23:42ID:???>あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
>って処理が無駄な気がする。
なるほど、それはそうだね。
いわゆるロジック的なものがほとんどない Webアプリってのは存在するし。(っていうか大半かも)
フレームワークでもなんでも、整理してるつもりで回りくどいだけってのは多い気がする。
話に付き合ってくれて、どうもありがと。
0343nobodyさん
2008/02/12(火) 14:28:33ID:???どう考えても少数だろw
ロジック無しで何が作れるというんだ?w
0344nobodyさん
2008/02/12(火) 14:34:01ID:???その理屈だと、PHPに限らず、JavaでもRubyでもオブジェクト指向は要らないということになるな。
それにアプリでも終了すると消えるわけで、結局はウェブアプリと同じ。
そもそもデータベースやファイルにデータを保存するのも
オブジェクトの保存・永続化なわけだが?
> あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
> って処理が無駄な気がする。
> 実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。
だからフレームワーク使うんじゃん。
0345nobodyさん
2008/02/12(火) 14:42:23ID:???単純に、SQLにパラメータ設定して、実行して、検索結果をエスケープしてHTML/XMLのタグつけて
返してるだけで出来てるWebアプリって多そうだけどな。ロジックというほどのもんでもないでしょ。
>>344
ムダなのは実装時間じゃなくて、CPU時間でしょ。
フレームワークで解決する問題じゃないと思うが。
0347に ◆lKs5QMUHoA
2008/02/12(火) 18:36:45ID:???> あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
> って処理が無駄な気がする。
> 実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。
これはもともとOOPの特性じゃない?
再利用性や保守性を高めるために、他の処理とを完全に切り分ける代わりに、
構造化指向よりも、コード量が多く、動作が重くなるというのは。
これは、個人で組む小規模プログラムでは無駄でしかないが、チームで組んだり、
改変がある場合には威力を発揮する、という類のことでしょ。
0348に ◆lKs5QMUHoA
2008/02/12(火) 18:50:13ID:???指摘にあるように、フローチャートがかけるような処理しかしていないので、
主にPerlやPHPで構造化指向でコーディングするスタイルが流行っているのだと思う。
(PerlやPHPのOOP対応は未だに不十分なところがある)
また、ネットにあるサンプルアプリは構造化指向のものが非常に多い事からも、
構造化指向で十分に組めることを意味しているのだと感じる。
通常だと、「だったら、WebアプリをOOPで組む必要ないよね。」となるわけだが、
私がそれでもあえてOOPをやっているのは、その有用性などを自分で体感する形で
確認したいからだ。
大規模なアプリとなると、WebアプリでもOOPを活用して組むことが多いと聞くが、
それは具体的にどのような場面で、どのような有用性があるからなのか。それらを確認したい。
最近は、どうも(Webアプリの世界では)OOPの有用性を見るよりも、
各種フレームワークの有用性を確認した方が良いのでは、と感じている。
0349nobodyさん
2008/02/12(火) 19:23:14ID:???> 指摘にあるように、フローチャートがかけるような処理しかしていないので、
OOPの意味が少ないの理由がおかしい。
フローチャートがかけるような処理しか”貴方が”していないから
必要ないといっているだけであって、そうではないものはOOPの意味がある。
「Webアプリはフローチャートがかけるような処理」という前提がそもそもおかしい。
> 大規模なアプリとなると、WebアプリでもOOPを活用して組むことが多いと聞くが、
> それは具体的にどのような場面で、どのような有用性があるからなのか。それらを確認したい。
OOPの有効性、そのものがわかってないだけじゃないか?
> 最近は、どうも(Webアプリの世界では)OOPの有用性を見るよりも、
> 各種フレームワークの有用性を確認した方が良いのでは、と感じている。
各種フレームワークは、すべて(といって問題ないレベルで)OOPで
作られていることを知らないの?
0350nobodyさん
2008/02/12(火) 19:40:22ID:???別にOO的なモデリングをしなくても複雑さが増大しないのであれば、OOを選択するのは技術的な理由ではないでしょ。
前提がおかしいと主張するなら、どうおかしいのか言わないと、それこそ意味がない。
0353nobodyさん
2008/02/12(火) 22:43:18ID:???オブジェクト指向を謳うなら、オブジェクトをシリアライズしてDBやセッションに保存するくらいはしないと。
そんなフレームワークがどれだけある?
0354nobodyさん
2008/02/12(火) 22:58:38ID:???0355nobodyさん
2008/02/12(火) 23:01:04ID:???0356nobodyさん
2008/02/12(火) 23:08:25ID:???だから、RDBMSからオブジェクトにいったん変換するんだけど、最終的にはHTMLというやはりフラットな構造に戻さないと行けない。
例えばgmailみたいに非常に複雑な処理が要求されるサイトなら、いったんオブジェクトにするのは有効と思うけど、gmailみたいなサイトは例外的。
ほとんどのウェブサイトは、ただDBに入った値を表示するだけでいい。
0358nobodyさん
2008/02/12(火) 23:19:02ID:???オブジェクトを使ってプログラミングすることではないでしょ。
これを区別しないのは 「VC++で作ったからオブジェクト指向だ」って言うのと同じ。
0360nobodyさん
2008/02/12(火) 23:37:53ID:???今まで読んだ本でOOに関して一番良かったのは Booch法:オブジェクト指向分析と設計 なんだけど、
いくら Booch法自体が古いとは言え、こうした本が絶版になってしまっているというのは、なんとも悲しい。
0361nobodyさん
2008/02/12(火) 23:59:12ID:???0362nobodyさん
2008/02/13(水) 00:22:08ID:???別にOOPしてもいいと思うよ。
俺もクラス使うし。
ただWebプログラミングだとクラス使っただけの手続き型プログラムになりがちだから
OOPの恩恵に与りにくいんじゃないかなーって思っただけ。
たとえば俺はいまPHPでゲーム組んでるんだけど
普通のゲームプログラムとかだと
$char_list[] = new Player();
for($i=0; $i<N; $i++)
{
$char_list[] = new Enemy();
}
while($game_loop)
{
foreach($char_list as $char)
{
$char->Move();
$char->CheckHit();
$char->Draw();
}
}
exit(0);
みたいな感じになるけど
0363nobodyさん
2008/02/13(水) 00:22:41ID:???Webプログラミングだと
$buf = DataRead();
$player = new Player();
$player->SetData($buf);
$player->Move();
$player->CheckHit();
$player->Draw();
$buf = $player->GetData();
DataWrite($buf);
exit(0);
みたいなのになりがちじゃん。
0364nobodyさん
2008/02/13(水) 00:23:37ID:???DataRead();
PlayerMove();
PlayerCheckHit();
PlayerDraw();
DataWrite();
exit(0);
でもいいじゃん的な気がするってだけ。
まぁひとえに俺のプログラミング力不足だと思うけど。
0365nobodyさん
2008/02/13(水) 00:42:03ID:???見えるように、オブジェクト指向の考えに染まった開発者は世界中の全てのものがオブジェクトで
あると考え出す。この観点は少々無邪気すぎる。」だそうで、若干感情的な議論を呼びやすい
テーマではあると思う。
そういえば、同じ様なことが フラクタルとか 1/fゆらぎの本にも書いてあったな。
人間なんてそんなもんだ。
0366nobodyさん
2008/02/13(水) 09:32:28ID:???・構造化プログラミング三要素
STEP01 順次進行
STEP02 条件分岐
STEP03 繰り返し
・OOプログラミング三要素
STEP04 カプセル化
STEP05 継承
STEP06 ポリモーフィズム
WEBデザイナがPHP使ったところでSTEP01止まり、
MS OFFICEのマクロ/VBAもそんな感じだね。
ifやforを使わず延々と処理を記述してるのあるよね。
STEP04で思考を止めちゃ駄目なんだ。
勉強の為に「継承」「ポリモーフィズム」を使った
プログラムをあえて書いてみるんだ。
モデリング云々とかそんなの関係ないんだよ。
そもそもここは>>1でしょ?
0367nobodyさん
2008/02/13(水) 11:21:35ID:???思考を止めてるのは誰だよ。
0368nobodyさん
2008/02/13(水) 11:29:38ID:???0369nobodyさん
2008/02/13(水) 11:42:59ID:???じゃあモデリング房が設計について判りやすく教えたら?
OOPの概念すら理解出来ない初心者に上流から教えるんですか?
ぐだぐだ言ってないで初心者に判りやすく為になる発言したらどう?
0370nobodyさん
2008/02/13(水) 11:50:58ID:???あとは自分で本でも読め。
0371nobodyさん
2008/02/13(水) 11:52:02ID:???0373nobodyさん
2008/02/13(水) 12:27:30ID:???純粋な議論ではないと思う。
0374nobodyさん
2008/02/13(水) 13:28:08ID:???酸いも甘いも知ってる方はOOPで作るべきっていう良いお題を
出してあげたら盛り上がるんじゃないか
0375nobodyさん
2008/02/13(水) 15:14:37ID:???オブジェクト指向が有用だからこそ
java,c++.c#,ruby最近の言語は全てOOPになってる
大規模なものをつくるのにOOPじゃないと非効率すぎる
0376nobodyさん
2008/02/13(水) 15:17:14ID:???規模が小さいほどOOPの必要性が無くなり
規模が大きいほどOOPの必要性がでる
0377nobodyさん
2008/02/13(水) 15:18:55ID:???大きいならOOPじゃないとはなしにならない
0378nobodyさん
2008/02/13(水) 15:21:38ID:???あと、規模というよりは複雑さだろうな。
0379nobodyさん
2008/02/13(水) 15:35:17ID:???〜〜〜〜〜〜〜〜〜ここからOOPネタ禁止〜〜〜〜〜〜〜〜〜〜〜〜〜〜
0380nobodyさん
2008/02/13(水) 16:30:31ID:???↑
マスコット(笑)
名前はオッピー君。
育ち盛りのオスです。
パスタは嫌いだよ!
最近、俺俺オブジェクト指向にはまって
同僚達から嫌われる羽目にw
そんな落ち目のオッピー君と一緒にオブジェクト指向の真髄を極めよう!
0381(OO)P 名前はオッピー君。
2008/02/13(水) 16:32:38ID:???0382nobodyさん
2008/02/13(水) 20:00:42ID:???0383nobodyさん
2008/02/13(水) 23:26:03ID:yj0olWG5テーブルAの操作をするクラスA、テーブルBの操作をするクラスBを作った。
両方のクラスで個別に接続するより、1番最初に接続して、その接続IDを使って処理させたほうがいいのかな?
0384に ◆lKs5QMUHoA
2008/02/13(水) 23:56:35ID:???取得するテーブルの数ごとに別々に接続はしない方がいいよ。
DBの処理負荷が大きくなるから。
私だったら、テーブルごとにクラスを分けたりはしないかな。
テーブルの構成そのものを隠蔽するために。
検索と更新は同じフォーム上では行わない前提にして、こんな感じにするかな。
// 接続に関するクラス
// PostgreSQLに接続する為のメンバとメソッドを持つ。
class CDB_PostgreSQL
// MySQLに接続するためのメンバとメソッドを持つ。
class CDB_MySQL
// 個人情報の検索をするクラス。
// 以下の検索メソッドを持つ
// ・電話番号を指定し、候補の個人情報一覧を得る。
// ・苗字を指定し、候補の個人情報一覧を得る。
// このクラスのメンバに上記2つのどちらかのDBクラスを持たせる。
class CSearch_Personal
// 個人情報の更新をするクラス。
// 以下の更新メソッドを持つ
// ・主キーを指定し、個人情報を更新する。
// ・新しい主キーを設定し、個人情報を新規追加する。
// このクラスのメンバに上記2つのどちらかのDBクラスを持たせる。
class CUpdate_Personal
0385383
2008/02/14(木) 00:16:52ID:nkc61sHTクラス設計は、慣れがないと難しいね……。
> このクラスのメンバに上記2つのどちらかのDBクラスを持たせる。
申し訳ないんだけど、「メンバにクラスを持たせる」の意味が理解できない。
少し補足してもらえるとありがたいんだけど、ダメかな?
0386nobodyさん
2008/02/14(木) 03:29:07ID:???0387nobodyさん
2008/02/14(木) 03:30:36ID:???0388nobodyさん
2008/02/14(木) 05:53:07ID:???テーブルの中からgetConnection()するのが普通だよ
コネクション管理とテーブルを切り離す
0389に ◆lKs5QMUHoA
2008/02/14(木) 08:04:05ID:???設計の仕方は、その人が作ろうとするアプリ次第なので、その人が
やりやすいスタイルでやっていいと思うよ。
OOPの設計理論は、あくまで一般論なので、必要性を感じないのであれば、
必ずしも守らなくていいだろう。
私は、DBをPostgreSQLからMySQLへ変換する必要性も生じることを
想定した設計をしただけだよ。
こうやっておけば、書き換えるコードも少なくて済む。
class CSearch_Personal{
// DBを格納する
var $m_db;
// コンストラクタ
function CSearch_Personal(){
$db_info = ""; // ここでDB接続に必要な情報を入れる。
$this->m_db = new CDB_PostgreSQL($db_info);
}
// 電話番号で検索
function Search_by_TEL($tel){
$sql_str = "SELECT * FROM TableA WHERE TEL = '" . $tel . "'";
$this->m_db->Execute($sql_str);
// ここで、データをうけとり、返す。
}
}
0390に ◆lKs5QMUHoA
2008/02/14(木) 08:07:28ID:???// PostgreSQLへ接続処理などを管理する基底クラス(抽象)
class CDB_PostgreSQL_Connection
// TableAの操作を管理するクラス。
class CDB_TableA extend CDB_PostgreSQL_Connection
// TableBの操作を管理するクラス。
class CDB_TableB extend CDB_PostgreSQL_Connection
0391に ◆lKs5QMUHoA
2008/02/14(木) 08:26:42ID:???その中から名詞や役割を抽出していけばいいと聞いたことがある。
その単位を1つのオブジェクトとして設計する。
1つのオブジェクトを、1つのクラスとしてコーディングする。
0392nobodyさん
2008/02/14(木) 08:57:14ID:???CDB_PostgreSQL_Connectionを拡張してCDB_TableAにするのはまずい
子クラスと親クラスはis_a関係にしないといけない
言い換えると子クラスは親クラスの範疇に含まれていないといけない
テーブルがコネクションの一部でないことは明らか
0393nobodyさん
2008/02/14(木) 10:58:27ID:???モデルに合わせて考えるのではなくて、SQLを考えてから、それに会うモデル(クラス構造)を考えた
方が良いと思う。
0395nobodyさん
2008/02/14(木) 11:09:12ID:???0397nobodyさん
2008/02/14(木) 12:00:13ID:???ただDBアクセスについて、パフォーマンスを保ったまま、高い抽象化ができない・やりにくい
というのは、OOが本質的にDB向きではないということだと考えてる。
0398nobodyさん
2008/02/14(木) 12:33:45ID:???各操作系に保持させるならプリペアドステートメントを。
個人的には各テーブルってよりも各テーブルのレコードクラスを作るかなー。
テーブルに対する操作は静的メソッドで実装する。
どうでもいいがクラスってのは抽象データ型なので関数と比べるなんてしてるとハマる。
0399nobodyさん
2008/02/14(木) 12:59:49ID:???具体的には「Umbrello」を業務で使っている人
0400nobodyさん
2008/02/14(木) 13:18:17ID:???Column - 継承を使うべき場合、使うべきではない場合 -
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_004/cs2_004_03.html#cs0406
0401nobodyさん
2008/02/14(木) 14:54:28ID:???> というのは、OOが本質的にDB向きではないということだと考えてる。
逆逆、リレーショナルデータベースが、OO向きじゃない。
0402nobodyさん
2008/02/14(木) 15:00:26ID:???> 各操作系に保持させるならプリペアドステートメントを。
プリペアドステートメントは条件の数を変えにくいという
大きな欠点があるからなぁ。
> 個人的には各テーブルってよりも各テーブルのレコードクラスを作るかなー。
一般に言われている、ActiveRecordパターンですね。
Ruby on RailsやCakePHPで採用されている奴です。
0403nobodyさん
2008/02/14(木) 15:08:57ID:???> テーブルAの操作をするクラスA、テーブルBの操作をするクラスBを作った。
> 両方のクラスで個別に接続するより、1番最初に接続して、その接続IDを使って処理させたほうがいいのかな?
処理の負荷というより、決定的な問題がある。
それは主にトランザクションを使ったときに起こる。
複数のテーブルを操作することで、一つの処理を完成させる場合
中途半端な状態を他に見せないようにしなければいけないし、
また一つのテーブルで処理が失敗した場合すべてを元に戻さなければならない。
これを実現する為に同じ接続から見える状態と、違う接続からみえる状態で
違うことがある。
0404nobodyさん
2008/02/14(木) 15:18:21ID:???ここで言うフレームワークには、汎用の名前があるフレームワークだけじゃなく
たとえばあるゲームの独自の基本システムなんていったものも含む。
このフレームワークを使って作るもの・・・すなわち、
フレームワークから呼び出されるコードは、単純な処理になるので
(というか単純な処理ですむ為のフレームワーク)
OOPにならないことが多い。
だからといって、システム全体がOOPになっていないとは思わないけどね。
システム全体の一部。つまりクラスの中のメソッドだけを見て
非OOPというのはおかしいでしょ?
0406nobodyさん
2008/02/14(木) 15:35:44ID:???OOPがフレームワークのためにあるという主張は初めて聞いた。
0407nobodyさん
2008/02/14(木) 15:36:31ID:???普通に考えるとこういう感じだろう?
// 接続に関する抽象クラス。汎用で使える関数があれば定義しても良い。
class CDB_Connection {}
// PostgreSQL接続用クラスの実装
class CDB_PostgreSQL extends CDB_Connection {}
// MySQL接続用クラスの実装
class CDB_MySQL extends CDB_Connection {}
// テーブルに関する抽象クラス。汎用で使える関数があれば定義しても良い。
class CTable {}
// 個人情報クラス。
class CPersonal extends CTable{
function CSearch($connection) {} //コンストラクタかメソッドでコネクションと接続
function search() {}
function update() {}
}
0408nobodyさん
2008/02/14(木) 15:41:23ID:???概ね同じ意見だけど、Cpersonalを実体化する必要ってあんまりなさそうだから、
自分はメソッドを staticにすることが多い。
あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
SQLを実行できてしまうので、引数で渡すようにしてる。
(まぁ、staticにしたら引数で渡すしかないけど)
0409nobodyさん
2008/02/14(木) 15:45:33ID:???必要性がないというより、CTable (のサブクラス)のインスタンスをnewするということは、
意味論的には、そのテーブル自体を新規に生成するということだから、ちょっと気持ち悪い。
0410nobodyさん
2008/02/14(木) 15:48:44ID:???> 私は、DBをPostgreSQLからMySQLへ変換する必要性も生じることを
> 想定した設計をしただけだよ。
> こうやっておけば、書き換えるコードも少なくて済む。
とか言っておきながら、
> // コンストラクタ
> function CSearch_Personal(){
> $db_info = ""; // ここでDB接続に必要な情報を入れる。
> $this->m_db = new CDB_PostgreSQL($db_info);
> }
CSearch_Personalのコンストラクタで
CDB_PostgreSQL決め打ちなのはナンセンス。
DBをPostgreSQLからMySQLへ変換する必要性も生じることを想定した設計というのなら
設計としては、Personalデータを扱う(Search専用?)クラスは
接続するデータベースに依存すべきではない。
(限られた環境だけで動くものを作ればいいだけならどうでもいいが)
接続オブジェクト(CDB_PostgreSQL)はCSearch_Personalクラス外部から
与える。そのときの引数は(PHPに厳密な型は無いが)抽象クラスのCDB_Connection型で与える。
こうすることで、DBをPostgreSQLからMySQLへ変換する必要が生じたとき、
CSearch_Personalを一切修正しないですむ。
0411nobodyさん
2008/02/14(木) 15:49:17ID:???内部的にはクラスが動いているんだよ」といってるのと
同じ意味のように思える。
誰に何を伝えたいのかは良く分からないが。
0412nobodyさん
2008/02/14(木) 15:51:40ID:???まあ、そこは設計しだいでいくつかやり方があるけど、
ActiveRecordパターンの場合、インスタンスはテーブルを作るという意味ではなく、
クラスがテーブル全体で、そのインスタンスはテーブルのレコードという扱いになる。
そしてフィールドがプロパティ。
0414nobodyさん
2008/02/14(木) 16:01:23ID:???これですかね。
http://www.martinfowler.com/eaaCatalog/activeRecord.html
細かいけど、
>そのインスタンスはテーブルのレコードという扱いになる。
なら、searchメソッドは、staticなり外部に置くのではないかと思う。
確かに updateはこの場合 staticにすべきものではないですね。失礼。
0415412
2008/02/14(木) 16:03:01ID:???> あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
> SQLを実行できてしまうので、引数で渡すようにしてる。
なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、
> (まぁ、staticにしたら引数で渡すしかないけど)
これが理由なら、そのクラスをシングルトンパターンで
実装するという方法もある。
CPersonal::search() などという書き方で呼べるぞ。
ただし、PHP4に対応した書き方だとすごく気持ち悪いんだが(笑)
CakePHPでgetInstance()というメソッドをキーワードにして探せば
実装例が見つかると思う。
getInstance()関数内のstatic変数に配列[0]にで確保(なぜ?)した後
各メソッドの初めで$_this = getInstance() して$_thisで参照するという・・・
まあ見たほうが早い(?)
0416nobodyさん
2008/02/14(木) 16:13:08ID:???>なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、
DBなんて巨大なグローバル変数の固まりみたいなものだし、アクセスもメモリと比べて遅いし、
トランザクションの都合からもある範囲でDBアクセスしている可能性がないかが
簡単に見分けられないのは怖いと思うけど。
0417412
2008/02/14(木) 16:13:24ID:???> なら、searchメソッドは、staticなり外部に置くのではないかと思う。
あー。staticでいいです。単に個人的な環境の理由から
PHP4を使っていて忘れていただけです。
0418412
2008/02/14(木) 16:17:15ID:???でもどっちみちデータベースに操作を出来るところなら、
コネクション知っているわけで、結局同じことでしょ?
それにクラスの変数はグローバル変数じゃないからw
0419nobodyさん
2008/02/14(木) 16:33:55ID:???必要なメソッドにしか connection を渡さず、オブジェクト内に保存しないことで、
「データベースに操作できるところ」を限定するという話。
connection をDBアクセスする権限と見るならば、その権限は処理に対して与えるべきで、
オブジェクトに対して与えるべきではないだろうということ。
0420nobodyさん
2008/02/14(木) 17:56:06ID:???0422nobodyさん
2008/02/14(木) 18:51:49ID:???例えば Personテーブルに depart_codeがあるとして、$person->getDepartName() としたときに、
暗黙のうちにdepart_codeをキーとしてDepartテーブルから検索する SQLが実行されたら嫌だし、
setPersonNameされたときに、そのタイミングでupdateが実行されていないか疑わなきゃいけないのも嫌。
0423nobodyさん
2008/02/14(木) 19:13:43ID:???メソッドの実装がどうなってようが呼んだ方の知ったこっちゃないだろ。
そのどっちの例もそのクラスの仕様なんだから。
それを外側から知ろうとか制御しようだなんておかしな話だ。
0424nobodyさん
2008/02/14(木) 19:41:54ID:???を作ろうとしてるのが気持ち悪い。
しかもOOPなんてデータベースの各要素に関数をくっつけたようなもんなんだから既存のデータを単体でしか扱わない
データベースと相性が悪いのは分かりきったことだろう。
0425nobodyさん
2008/02/14(木) 19:54:36ID:???既存のデータベースはデータを単体でしか扱わない?
だからOOPとデータベースと相性が悪い?
( ゚Д゚) ワカラナイ
0426412
2008/02/14(木) 20:04:12ID:???staticはあくまでstaticだよと明示しているだけで
本質的には必要なものとは思えないけど。便利だけどね。
それと、CDB_PostgreSQLは「機能をまとめたクラス」ではないよ。
たとえば一つのアプリでサーバー負荷分散などで、
複数の接続を使用するときとか、複数のインスタンスが出来る。
0427nobodyさん
2008/02/15(金) 07:09:54ID:???インスタンスに縛られない柔軟なOOPができるのにな
0428nobodyさん
2008/02/15(金) 17:51:58ID:???VBプログラマ向けの情報だと、OOPの考え方の情報が結構ありそうです。
業務Webアプリの作り方の基礎(前編)
業務アプリ開発で失敗しないコツ
http://www.atmarkit.co.jp/fdotnet/vblab/bizappbasic01/bizappbasic01_01.html
> 1つの機能(=たとえWebアプリで複数のページにまたがっていたとしても一連の作業を
> 完了させるまでの一連の操作)に対して、1つのビジネス・ロジック層のクラスを
> 作ってみることをお勧めする。
> 一般的な業務アプリでは、クラスを細かくしすぎてしまうとどこで何を行っているのかが
> 分かりづらくなり、結果的にメンテナンスしづらいアプリになることがある。
(パフォーマンスを考慮し、)
> 可能な限りクラスのインスタンス化が必要ない静的メソッド(Sharedプロシージャ)で
> 作成したステートレスな設計にすることをお勧めする。
0429nobodyさん
2008/02/15(金) 20:19:56ID:???DRYになってないから直すの大変
0430nobodyさん
2008/02/15(金) 22:23:07ID:???そういう考え方は別として、単にコーディング技法として便利だよ。
0431nobodyさん
2008/02/15(金) 22:36:39ID:???プリミティブだけど実装してみました・・
もはやQuickFormとSmartyがないと動きませんが・・
ttp://briefcase.yahoo.co.jp/bc/oopfw
0432に ◆lKs5QMUHoA
2008/02/15(金) 23:49:43ID:???>>392
確かにそうですね。継承をして作ったクラスはすべてPostgreSQLに依存してしまいます
ので、is-a関係が正しいですね。
>>407
接続に関して抽象的にクラスを定義するところは勉強になりました。
私はまだまだ継承を使いこなせてないですね。
>>410
> 接続オブジェクト(CDB_PostgreSQL)はCSearch_Personalクラス外部から与える。
この発想は思いつきませんでした。
確かに言われてみるとそうです。CSearch_Personalを一切修正しないで済むようになります。
0434383
2008/02/16(土) 00:15:26ID:???具体的なコードやアドバイスを提示してくださった方々、ありがとう。
ちょっとまだ、自分には敷居が高くて色々大変そうですが、
考えるよりも産むが易し、と言うので、手を動かして色々試行錯誤してみます。
ありがとうございました。
0435nobodyさん
2008/02/16(土) 11:47:29ID:???ASP.NETでは、「検証コントロール」というのが便利そうだ。
「プログラムを作成するたびにこういうのをいちいち書いたりしなくていい」という
部分の利便性は良く分かる。
ASP.NETで学ぶVisual Studio .NETの魅力
第2回 Visual Studio.NETでプログラム・レス開発を学ぶ(前編)
http://www.atmarkit.co.jp/fdotnet/aspandvs/aspandvs02/aspandvs02_04.html
だが、こういうのは逆にそのフレームワークに縛られてしまうのが欠点だな。
準備されてるコントロールを自分の意図するようにやりたいが、その方法が誰も分からない
もしくは、出来ない場合は、それで終わりみたいな。
話はずれるが、Accessで開発してる時、各種コントロールやウィザードの組み合わせでは
対応出来ないと感じたのを思い出した。ウィザードが準備する通りの物が目的ならば良いのだが、
それにちょっと変更を加えたい場合はどうしたらよいのかという感じ。各種プロパティーの
値を変更してみても変な方向に変わっていくだけ。
自分の意図するようにカスタマイズしたい場合は、非連結のテキストボックスを貼り付けて
VBAで制御するスタイルでやってたな。
0436nobodyさん
2008/02/16(土) 12:59:37ID:???しかし、そのカスタマイズ度は低い。(確か、クリックしたセルの場所を
取るとか、一つのセルだけ色を変更するとかがかなり苦手だったような。)
サブフォームで代用できない場合は、フォーム上にグリッドを貼り付けるような
モジュールは無いので、DBへのアクセス手段が手軽なものを捨ててでも
VBで0から作り直すのが一般的な選択方法となる。
Webアプリのフレームワークでもこのような状況になる事ってあるのかなぁ?
0437383
2008/02/16(土) 17:18:06ID:???突っ込みどころ満載だと思うんだけど、とりあえず、このコーディング方法はやめておいたほうがいい、
っていうところを教えていただけると嬉しいです。
class DBConnect(){
// メンバ変数にDB接続情報を記述
function __construct(){} // PDOをインスタンス化
function getConnID(){} // PDOオブジェクト格納変数を返す
}
class TableCtrl extends PDO{} //PDOを継承、汎用関数を定義してもOK.
class CtrlA extends TableCtrl{ // テーブルAを操作する
protected $ConnID;
function __construct($ConnID){} //PDOオブジェクト格納変数を渡す
}
0438438
2008/02/16(土) 17:21:28ID:???それを引数にCtrlAをnewする感じ……。
一応動きはするけど……全然ダメだな……。
0440438
2008/02/17(日) 16:53:21ID:???返信ありがとう。
まったくわかってないみたいなので、クラスの設計方法から学び直します。
実際の処理をする具象クラスを作って、また別に、それを統括するクラスを作っていく。
複数のクラスを設定によって使い分けしなきゃいけない場合は、抽象クラスなりインターフェイスなりを継承(後者の場合は実装)させて、
メソッド名を統一させた上で、ポリモーフィズム――クラスによって同名メソッドの振る舞いを変えさせるって解釈でいいよね?――で実現させる。
基本こんな感じかな?
プリペアドステートメントに惹かれて、PDOを継承する形で作って見たんだけど、
DB接続関連の場合、接続IDを返してくるmysql_connect(); なんかのほうが、使いやすい気がする。
フレームワーク自作なんて、自分にとってはとんでもない話しですよ……。
0441nobodyさん
2008/02/17(日) 19:14:54ID:???0442nobodyさん
2008/02/17(日) 20:01:12ID:???ごめん、無視してたわけじゃないんだ。
とりあえず、軽い「ちいたん」とやらを見てきます。
スレ汚し、ごめんなさい。自重します。
0443nobodyさん
2008/02/17(日) 20:03:55ID:???0444nobodyさん
2008/02/17(日) 20:08:23ID:???0445nobodyさん
2008/02/17(日) 20:22:12ID:???0446nobodyさん
2008/02/17(日) 21:40:51ID:???軽い「ちいたん」が入門にはちょうどいいかな、と思っての選択です。
いきなり、CakePHPなど大きいのを見ても、余計に混乱しそうだったので。
スレのレベルを余計に下げるだけなのでROMします。
度重なるスレ汚し、失礼しました。
04471 ◆SWtzLesEmM
2008/02/17(日) 23:11:41ID:???>>335
掲示板スクリプトの改善、どうもありがとうございます。(*^^*)v
↓動作サンプルを設置しました。
http://ssurl.net/n777
http://ssurl.net/ioah
0448nobodyさん
2008/02/22(金) 09:37:11ID:???もう少し具体的なアドバイスを出して欲しい。
具体的に、どんなフレームワークの構造を見て、どんなことを
学んだのかなどをあわせて出してくれたら、勉強もしやすいと
思うのですが。
0449nobodyさん
2008/02/22(金) 09:52:27ID:???0450nobodyさん
2008/02/22(金) 09:59:49ID:???0451nobodyさん
2008/02/22(金) 11:02:18ID:???漠然としすぎていて良く分からないのである程度は具体例が
欲しいという意味なのですが。
>>450
こちらへどうぞ
【PHP】フレームワークについて語るスレ10【総合】
http://pc11.2ch.net/test/read.cgi/php/1202521438/l50
0453nobodyさん
2008/02/22(金) 11:36:33ID:???自分でDBの抽象化を考えてみて、クラスの定義だけでも書いてみろ。
その後にZFのZend_DBを見て、自分のとどう違うか、なぜそうなっているのかを考えろ。
それから、偉そうな態度で教えてもらおうと思うな。
0454nobodyさん
2008/02/22(金) 11:50:38ID:???むしろお前のほうが偉そうだ。
何被害妄想してるんだw
0455nobodyさん
2008/02/22(金) 12:50:26ID:???PHPの世界にOOPの参考になるものがどれほどある?
javaやらずOOP出来ましたってありえないでしょ。
0457nobodyさん
2008/02/22(金) 13:04:24ID:???PHP使いながら、OOP勉強すればいいだけ。
本気でOOP勉強をするなら、非実用的な言語も含めていろいろな
言語を使うことになる。そしてそれらが実用的かというと別の問題。
いくらsmalltalkでOOPをマスターしました!とかいっても
それでウェブサービスを作ることはまずありえないんだから
手段と目的を逆にしないようにね。
0458nobodyさん
2008/02/22(金) 13:04:45ID:???「スクリプトの世界ならRubyだろ。」とか、結論が見えてこないし、
このスレの趣旨とは違うと思う。
0460nobodyさん
2008/02/22(金) 13:13:27ID:???勉強の際はjavaやC#などの情報を読みながらやることになると思う。
しかし、PHPを辞めるまでする必要性は無いと思う。
言いたいのは「OOPの勉強するのなら、PHPに限定してはいけないよ。」
じゃないの?
0461nobodyさん
2008/02/22(金) 13:16:21ID:???そしてOOPをマスターした。
しかし、Javaでは共有サーバーで動くソフトを作れなかった。
多くのオープンソースアプリはPHP製だった。
OOPをマスターしたが、何も出来なくなった。 完。
0462nobodyさん
2008/02/22(金) 13:27:17ID:???自分がどんな風に思われてるかも分かってないんだろうなw
0463nobodyさん
2008/02/22(金) 13:58:48ID:???> いくらsmalltalkでOOPをマスターしました!とかいっても
> それでウェブサービスを作ることはまずありえないんだから
今やウエブサービスに欠かせないMVCはそもそもsmalltalkのOOP由来なんだが…。
継続ベースだって覚えておいて損はない。
http://www.ibm.com/developerworks/opensource/library/os-lightweight8/
http://www.ibm.com/developerworks/jp/java/library/j-cb07056/index.html
0464nobodyさん
2008/02/22(金) 14:19:47ID:???自分の為に必要だからやるだけ。
0466nobodyさん
2008/02/22(金) 17:56:13ID:???一人じゃ到底無理だろうな。別スレでも立てて、解析して
ドキュメント作ろう!見たいなことやってみる?
Visual Studio 2008で見る.NET Frameworkのソースコード
http://www.atmarkit.co.jp/fdotnet/insiderseye/20080222sourcecode/sourcecode.html
> 公開されたソースコードには(もちろん英語だが)多くのコメントが入っており、
> ローカル変数名も元のままの“生”のソースコードである。
> そしてそれがVisual Studio 2008でシームレスにトレースできるようになる
0467nobodyさん
2008/02/23(土) 08:39:50ID:???サンプル見たけど
Viewで変数が入らないとこで”を使ってる意味がわからない
”と’の使い方間違ってると思う
面倒な使いわけするならsprintfという手もある
パラメータ変数が渡ってくる
switch文のcaseに頭文字を大文字にしてる意味がわからない
0468nobodyさん
2008/02/23(土) 08:44:08ID:???echo "<html>";
echo "<head><title>BBS</title></head>";
echo "<body>";
}
上は、こうでいいやん!
function html_head(){
echo '<html>';
echo '<head><title>BBS</title></head>';
echo '<body>';
}
なんでダブルクォートやねん
0469nobodyさん
2008/02/23(土) 09:12:10ID:???class View_Baseは
helper的な役割だからいいとしても
View_List
View_WriteFinish
コントローラで判断させるべき機能が
Viewで書かれてるし
テンプレート化されてないのもあって
ぐちゃぐちゃですね。
ここがOOP構造を理解しにくい作りになってる
コントローラは面倒でもOOP理解するには必要だ
理解しやすくするためにテンプレート化も必要
0470nobodyさん
2008/02/23(土) 09:19:29ID:???本来コントローラとModelがやりとりする部分が
コントローラが無いために
Viewで処理されてる
MVモデルですね!
OOP構造化理解のためには
面倒でもMVCモデルじゃないと
初心者を間違った方向に導きますよ!!
0471nobodyさん
2008/02/23(土) 12:22:21ID:???具体的にどうすればいいの?
条件分岐してないから切り分けは良さげに見えたんだが。
viewは機能ごとの静的HTML吐くのとは違うの?
0472nobodyさん
2008/02/23(土) 13:43:29ID:i4AYcehMこれの
アクティブモデルは、コントローラとは関係なくモデルで状態が変更される場合に使用されます。
これは別のソースでデータが変更され、この変更をビューに反映する必要がある場合に起こります。
株価相場表示を例に考えてみます。株価データが変更された場合、外部ソースからデータを受け取り、チッカーバンドや警告ウィンドウなどのビューを更新する必要があります。
モデルの内部状態の変更が検知できるのはモデルだけなので、モデルからビューに表示を更新するよう通知する必要があります。
って、hoge.php?param1=aaa¶m2=iiiみたいなリクエストを解析してコントローラがそれに応じたビューを選択して云々
ではなくて、例えばブログだったら記事テーブルにまだ一つもデータが無いときは「まだ記事が登録されていません」のビューをモデルが選ぶ、ってことかい?
だとしたらどうやって実装したらいいんだろ・・・
そのモデルを使用するビューをモデルに登録しておいて、モデルのデータによって分岐させて使うビューを選択。そのときにビューは出力に必要なデータをモデルからひっぱりだす
MSDNは書き方がやたらめんどいぜ
0473nobodyさん
2008/02/23(土) 13:56:50ID:i4AYcehM↓
そのリクエストにおいて必要なモデルのインスタンス生成
↓
モデルのメソッド呼び出す
↓
選択したビューのupdate呼びだして出力に必要な変数定義
↓
モデルがビューの出力するメソッドを呼ぶ
ビューはモデルからの変更を受け付けるupdateメソッドと出力するためのputHtmlメソッド持つインターフェイスを実装する
なんか間違ってますか>< 教えてください!><
0474nobodyさん
2008/02/23(土) 14:42:12ID:???0475474
2008/02/23(土) 14:43:18ID:???0476474
2008/02/23(土) 15:11:03ID:???それはようするに、株価データのようにユーザーが
ページを更新しなくてもデータが更新されるときの話。
コントローラがモデルからデータ引っ張ってきて
そのデータをビューに渡して表示という処理は変わらない。
↑この処理を、普通は「URLを開いた」というタイミングで行っているわけ。
しかし、そのタイミングだと株価データ表示のようなリアルタイムでの表示は難しい
人間がF5を押す必要がある。この場合も更新されているとは限らず無駄に負荷が高くなる。
それを(ウェブアプリ以外では)モデルからデータが変更されたよーと
コントローラ・ビューに通知し、その通知が来たタイミングでコントローラ・ビューが
モデルからデータを引っ張ってきて(ry)という設計方法がある。
それが>>472で言っていること。
モデルに対して、コントローラやビューを「変更あったら俺に通知してくれ」
登録することでそれを実現する。
(データに変更があったらコントローラ・ビューのこの関数を呼び出してくれとモデルに登録する)
でも、この設計。モデル(つまりサーバー)から変更の通知をすることになるので
ウェブアプリでは一工夫必要になる。結局は、JavaScriptを使って
一定ごとに変更チェックをすることになるわけだが、まあそれをAjaxとかの技術で
非同期的にバックグラウンドで行うことにより、見た目上はサーバーから
変更通知がくるような感じに出来るんでしょ?やったこと無いけど。
その通知を元に、画面の一部、もしくはすべてを再描画する。
あとは詳しい人に任せた。
0477nobodyさん
2008/02/23(土) 17:10:06ID:i4AYcehMレス�d
オブザーバパターンはWebアプリに不向きなのかー。
じゃあ、
//コントローラの実行メソッド
public function doExecute(){
if($this->model->getArticleNum() === 0){
$message = '記事がまだ一つもありません';
require_once('./template/Error.php');
}else{
$this->view->putHtml();
}
}
こういう、コントローラがモデルからデータ引っ張ってきて分岐して、ビューを選択する、ってのはアリなのかな?
ちょっとCakePHPとかの資料ググってくるは
0478nobodyさん
2008/02/23(土) 17:50:55ID:???Cometすげえ!って大騒ぎになってたころ資料見ても俺には何がなんだか理解できなかったけど
0479nobodyさん
2008/02/23(土) 20:15:50ID:???MVモデルになってるんだよ!
CakePHP、symfonyのソースをよく解読してみろよ!
1のサンプルにはVIEWにコントローラで処理するコードかいてあるんだぜ!
0480nobodyさん
2008/02/23(土) 20:21:31ID:???結局はMVCモデルのフレームワークにテーマが行き着くんだよね
だったらPHPフレームワークのスレと同じじゃんて感じで
ここでOOPを議論するときは
MVCモデル以外を議論の対象にしたいよ
0481nobodyさん
2008/02/23(土) 20:27:22ID:???ワロタ。目からうろこw
httpってのはクライアント(ブラウザ側)から聞くことしかできないんだ。
どうやってもサーバーから話しかけることはできない。
だから、たとえば一分おきに、
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わったよ!」
って聞かないといけない。たとえ4分半の時点でデータが変わっていても
5分後に聞くまでわからない。Cometというのは、
「データ変わったかい?」・・・・・・・・・・・(4分30秒後)「変わったよ!」・・・(数分後)「また変わったよ!」
とこうなる。
本質的にはクライアントから聞いているわけだが、変更があるまで
みのもんたみたいにずっと溜めてから返答するため、
負荷の軽減とリアルタイムな通知が実現できるというわけ。
しかし、いまさらだけどhttpで無茶やりすぎだw
0482nobodyさん
2008/02/23(土) 20:30:12ID:???0484nobodyさん
2008/02/23(土) 20:35:35ID:???> PHPでOOPを追求すると
> 結局はMVCモデルのフレームワークにテーマが行き着くんだよね
それはPHPに限らず。
そもそもOOPが一番よく使われるのは、フレームワーク部分なんだよ。
OOPはフレームワークを作るときに使うものといっても過言じゃない。
通常のビジネスロジック部分は基本的に単純な命令の集まりになるので
OOPを使っているという感じは無くなる。
0487nobodyさん
2008/02/23(土) 20:49:01ID:???フレームワークスレは、フレームワークの比較などを話すスレ
OOPはフレームワークを題材に、OOPの話をするスレ
おk?
0488nobodyさん
2008/02/23(土) 20:53:31ID:???class View_List extends View_Base{
//
function Write_HTML_head(){
$this->html_head();
$this->html_title("--- PHP で OOP の BBS ---");
echo "<hr>";
}
// 書き込みフォームを表示させる。
function Write_HTML_form(){
$this->html_form_start("index.php");
echo "<b>[メッセージを投稿する]</b><br>";
$this->html_input_hidden("PAGE", "Write");
echo "タイトル:<br>";
$this->html_input_text("title");
echo "<br>";
echo "メッセージ:<br>";
$this->html_textarea("msg");
echo "<br>";
$this->html_submit(" 書き込む ");
$this->html_form_end();
}
0489nobodyさん
2008/02/23(土) 20:54:28ID:???function Write_HTML_foot(){
$this->html_foot();
}
//
function Write_HTML_data($line){
echo "<b>タイトル:</b>";
echo $line->GetName();
echo "<br>";
echo "<b>メッセージ:</b>";
echo $line->GetMsg();
echo "<hr>";
}
}
この中のどこがコントローラで判断させるべき処理なんだ?
0490nobodyさん
2008/02/23(土) 20:57:01ID:???OOPはフレームワークを題材に、OOPの話をするスレならプログラム板だろ?
初心者だらけの、ここよりも良レスが来ると思うんだが
PHPにこだわる理由がわからない
WEBでのフレームワークならどれも仕組みは同じだろうに
じゃあperlでOOP、rubyでOOPていうスレが無いのは何でなんだ?
0491nobodyさん
2008/02/23(土) 21:21:33ID:???if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}
これは下記がいいだろ?
function GetNextData(){
$ans = "";
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}
return $ans;
}
0492nobodyさん
2008/02/23(土) 21:36:01ID:???function GetNextData(){
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}
変数名の最後に数字使うのは初心者だろ?
もしコード拡張で数値計算が入ったら紛らわしい
0493nobodyさん
2008/02/23(土) 21:39:32ID:???function AddLast($title, $msg){
// ファイルを開く
$hd = fopen($this->m_file_name , "a");
// データを書き込む
$line = $title . $this->m_pause_chr . $msg . "\n";
fwrite($hd, $line);
// ファイルを閉じる
fclose($hd);
}
なんでflock入れないの?
0494nobodyさん
2008/02/23(土) 21:47:30ID:???はこれの方がわかりやすいだろ?
list($name,$msg) = split($this->m_pause_chr, $line);
0495nobodyさん
2008/02/23(土) 21:52:46ID:???if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}
これは下記に修正した方がわかりやすいよ
function GetNextData(){
$ans = "";
if( $line = fgets($this->m_file_hd, 1024) ){
list($name,$msg) = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($name, $msg);
}
return $ans;
}
0496nobodyさん
2008/02/23(土) 21:55:49ID:???初期化はこうだった
function GetNextData(){
$ans = null;
if( $line = fgets($this->m_file_hd, 1024) ){
list($name,$msg) = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($name, $msg);
}
return $ans;
}
0497nobodyさん
2008/02/23(土) 22:04:10ID:???$ans = "";
}
これ全部
$ans = null;
に初期化に変えて
elseとっぱらった方がいいよ
返り値はオブジェクトが入ってるか入ってないかという処理なのに
空文字を返すのよくないよ!
0498nobodyさん
2008/02/23(土) 22:44:30ID:???0500nobodyさん
2008/02/24(日) 11:09:06ID:???OOP習得が目的ならあまりにも無謀だし、全くもって得策ではない。
フレームワークとか利用しても、ユーザが$_POSTとか直接呼べちゃうと
結局OOPの意味が無いんではないだろうか?むしろそれが出来てしまうPHPは
OOP理解には全く向いていない言語だとも思うのだ。
でも不完全ながら、PHPでOOPっぽくコーディングすること自体は楽しいと思う。
0501nobodyさん
2008/02/24(日) 11:31:24ID:???> プログラム初心者がPHPだけでOOPを習得するのはほぼ不可能に近いと思う。
どんな言語でも当たり前。
> フレームワークとか利用しても、ユーザが$_POSTとか直接呼べちゃうと
> 結局OOPの意味が無いんではないだろうか?
まったく関係ない。
0502nobodyさん
2008/02/24(日) 14:04:04ID:???初心者じゃ無理だよ
オブジェクトの設計は上手に出来ても
コーディングレベルで初心者ならではのミスが目立つ
0503nobodyさん
2008/02/24(日) 14:08:38ID:???JAVA,C#,rubyみたいに
OOPを前提として作られた言語じゃないからね
0504nobodyさん
2008/02/24(日) 15:14:16ID:???0505nobodyさん
2008/02/24(日) 15:31:22ID:???0506nobodyさん
2008/02/24(日) 15:37:16ID:???0507nobodyさん
2008/02/24(日) 15:38:42ID:???だいたい$_REQUESTや$_SESSIONがオブジェクトじゃなくって、変数な時点で、PHPのウェブアプリでオブジェクトなんて使うなっていう、PHP開発者からのメッセージと理解すべき。
0508nobodyさん
2008/02/24(日) 15:44:11ID:???そりゃすごい。
0509nobodyさん
2008/02/24(日) 16:03:09ID:???コードを教えて欲しい。
このコードの話が質問されても出ていないのはなぜ?フレームワークを
使わないと、理論を完全に実現できないとかそういう話だから?
0510nobodyさん
2008/02/24(日) 16:19:48ID:???だめだだめだと言うものの、何故だめなのか、どう書けばいいのかということには答えられない低レベル批判厨なのさ
0511nobodyさん
2008/02/24(日) 19:08:42ID:???05121 ◆SWtzLesEmM
2008/02/24(日) 19:49:37ID:???このスレも1周年を迎えてましたね!
…時間が経つのは早いなー。><
1年前からあまり進歩してないのは気のせい?(・∀・)
05131 ◆SWtzLesEmM
2008/02/24(日) 19:50:55ID:???PHPでOOPを勉強するとき、フレームワークは良い見本になりますね!
>>490
>PHPにこだわる理由がわからない
ホームページ作成でPHPの勉強を始めました。
プログラミングの勉強をしていたら、手続き型以外にOOPという方法があることを知り、使えるようになりたいと思いました。
>>502
Zendが積極的に音頭を取って、初心者向けの情報提供をやってくれたらいいですね。><
http://www.zend.co.jp/tech/
Zendの代わりに、PHPプロというサイトがPHP初心者のニーズをカバーしてくれているでしょうか?(・∀・)
http://www.phppro.jp/
>>503
Javaもちょっと勉強してみました。^^
…今使っているレンタルサーバだとJavaが動かない><
>>507
自分で作ったクラスに関しては、クラス内に変数を封じ込めておけるので、スコープ(変数が操作できる領域)をコントロールできるのではないでしょうか?
PHPが最初から用意してくれているグローバル変数($_REQUES等T)のデメリットがよく分からないのですが、いつでもアクセスできるのでこれはこれで便利だと思います。
とりあえず、PHPでOOPが使えるようになりたいです。
PHP以外の言語も使ってみて、必要に応じて使い分けができるようになれればイイですね!(´∀`)
05141 ◆SWtzLesEmM
2008/02/24(日) 20:01:23ID:???>>479
MVモデル…(ノ∀`) アチャー
以前作った掲示板を、MVCフレームワークの形で作り直してみました。(^^)v
↓
http://ssurl.net/ryol
0515nobodyさん
2008/02/24(日) 20:34:16ID:???アマゾンのアフィリエイトの誘導らしいwww
05161 ◆SWtzLesEmM
2008/02/24(日) 22:49:51ID:???PukiWikiPlusでamazonプラグインをデフォルトのまま使うと、プラグイン作者さん?のアフィリエイトコードが付くようですね。><
ttp://cafelounge.net/dev/?PukiWiki%20Plus!%2FPlng-in%20Customize#a5aa9e2a
>amazonアカウントを設定します。
>define('AMAZON_AID','mikoscafeterr-22');
アフィリエイトはやってませんが、とりあえず本の情報をまとめるのに便利なのでamazonプラグインを使ってみます。^^
0517nobodyさん
2008/02/25(月) 07:27:51ID:???本の情報とかいらんよ
あと、valueclickのアフィリエイトも出てるし
あとTOPページいくとgoogle広告も出てる
結局こういうことかいな
最悪やなお前
0518nobodyさん
2008/02/25(月) 11:09:54ID:???でも、単に羅列してるだけよりも、読んでみてどう思ったのかという
レビューをだして、その人なりの評価を出して欲しいとは思った。
羅列しているだけだと、そのサイト特有の色を感じない。
0519nobodyさん
2008/02/25(月) 11:36:58ID:???ここだけじゃないけど
技術的なサイトに広告とかマジうざい!!!!
0520nobodyさん
2008/02/25(月) 11:41:53ID:???それをいいたいのならば、もっと具体的に言って欲しい。
「RubyはもともとOOPとして設計されている」とか抽象論で終わってるから
何も話が進まず、同じことの繰り返しが続いているんだと思う。
「$_POSTなど、グローバル変数があるからオブジェクト指向的な考えには
ならない」とかそういう話をしてもらえれば、勉強する人はそれを
それぞれに解釈して学んでいけるのではと思う。
「じゃ、辞めようか」と思う人もいれば、「じゃ、その部分だけ気を
つけていけばPHPでもOOPがやれるんだな」と思う人もいるわけで。
0521nobodyさん
2008/02/25(月) 11:44:37ID:???0522nobodyさん
2008/02/25(月) 11:44:58ID:???そこまでいいきるのなら、じゃ、みなけりゃいいじゃんとか思うけどな。
あからさまなCMじゃなければいいと思うけどな。俺はこの本をつかって
こういう勉強をして、こういう役に立ったとか、いいじゃん。
このスレは勉強しようっていうスレなんだから。
0524nobodyさん
2008/02/25(月) 11:47:54ID:???最終的に宣伝目的にするやつが多いからな
リンク先に広告があるかどうかだけはシビアに見てる奴が多いよ
0525nobodyさん
2008/02/25(月) 11:51:48ID:???それがアフィリエイトになってるのがおかしいよ
0526nobodyさん
2008/02/25(月) 11:54:29ID:???投稿も受け付けたりしていて、そのサイトに広告を出して儲けてた
人がいて、叩かれたことがあったからな。
あと、のまねこ。
そういう事件があったから、2ちゃんねるをつかって管理者が
儲けようとする目的で広告が掲載されていることにはぴりぴりと
している傾向はあると思うな。
2ちゃんねるを通じて何か企画をするのには賛成だけど、やるのなら
GPLライセンスでやるみたいな意識でやらないとだめなんじゃないかな。
0527nobodyさん
2008/02/25(月) 11:59:06ID:???本当に内容の無いことしかかけなくなってしまう。
情報をまとめていることで、便利だというものもあるしね。
だけど、「アフィリエイトはダメだ」という意見には賛成だ。
0528nobodyさん
2008/02/25(月) 12:02:29ID:???2ちゃんを利用するというのが問題あり
0529nobodyさん
2008/02/25(月) 12:06:47ID:???アフィリエイトされていると、それがどこかで告知されて、
大きく騒がれると思う。このスレに厨を沢山呼ぶことにも
なりかねない。
記念パピコとかが大量に来るので、1は早急にアフィリエイトは
辞めるべきだと思う。
0530nobodyさん
2008/02/25(月) 12:07:12ID:???それができないのも仕方がない。
0532nobodyさん
2008/02/25(月) 12:34:45ID:???まとめサイトで書籍紹介するのも始めてみて正直びびった
05331 ◆SWtzLesEmM
2008/02/25(月) 12:50:47ID:???>>517
2chでソースコードを投稿(>>36-50)したら、>>53さんが「わかりにくいからWebサイトにまとめてくれ。」とアドバイスしてくれました。
とりあえず、無料サーバ(XREA)にまとめサイトを設置しましたが、XREAは広告を表示するようになっているので仕方ないですね。
ttp://www.xrea.com/?action=ad
>当サイトは、無料運営のため、広告コードを自分で挿入する、または、自動的に挿入して頂く必要があります。
>>521
アドバイスどうもありがとうございます。
PukiWikiPlusのamazonプラグインに付いていたプラグイン作者さん?のアフィリエイトコードは外しました。
>>526
CGM型のサイトを運営して収益が出る場合、運営者だけが利益を得て、参加者に利益が還元されないと、不公平=不満に感じる人もいるかもしれませんね。
このまとめサイトは、ソースコード置き場+自分のメモという感じで使っていますが、利益が出せるでしょうか?
営利目的の企画として行なうなら、企業や出版社等に運営してもらった方が、本格的になっていいかもしれませんね。(^^;
…どこかで「PHPでOOP」講座を作ってもらえないでしょうか?>PHPプロさんとか?
>>527
勉強するとき、本を読む人っていますよね?
本は読まない人もいると思いますが、本の情報も調べたのでついでにまとめました。
0534nobodyさん
2008/02/25(月) 12:58:27ID:???1がコテハン使ってスレをリードするのおかしいやろ?
まとめサイトも1が作るのちゃうやろ
名無しがやることやろ
0535nobodyさん
2008/02/25(月) 13:00:22ID:???長くレスが続くなら
それは本当に需要のあるスレであって
1が作り上げたスレになってるやん
0536nobodyさん
2008/02/25(月) 13:14:26ID:???1(個人)に利益が出てたら、必ず騒ぐ人が出てくる。
しかし、利益が出てなければ、その旨を断っておけば、
騒いでいる意見は無視しておけば、しばらくすれば蒸発
すると思う。
0537nobodyさん
2008/02/25(月) 13:18:05ID:???俺は1ではないが。
> 1の目的がよくわらん。
スレタイの通り。PHPでOOPを勉強する。
> 1がコテハン使ってスレをリードするのおかしいやろ?
何がおかしいのかがわからん。
こうあるべきだとかいうガイドラインでもあるわけ?
> まとめサイトも1が作るのちゃうやろ
> 名無しがやることやろ
お前のローカルルールを押し付けるな。
1がまとめサイトやめたら変わりにお前がやるのか?
0539nobodyさん
2008/02/25(月) 13:27:10ID:???広告目的以外に見たことないんだけどwww
0540nobodyさん
2008/02/25(月) 13:30:31ID:???0542nobodyさん
2008/02/25(月) 13:35:25ID:???スレ主がまとめサイト作ってるスレどこにあるんだよ?
0543nobodyさん
2008/02/25(月) 13:36:07ID:???0544nobodyさん
2008/02/25(月) 13:39:24ID:???自分の存在を認められたいだけのオナニスレだよ
0545nobodyさん
2008/02/25(月) 13:44:21ID:???このスレは1の自己満足以外に何も生まれないよ結果としてね
0546nobodyさん
2008/02/25(月) 13:45:42ID:nYfgU4lL何で君はスルーができないの?
誰も書き込まなければそのまま消えていくんじゃないの?
0547nobodyさん
2008/02/25(月) 13:46:57ID:???よほど腕に自信がある奴か
初心者相手に自己満足したい奴かのどっちか
0548nobodyさん
2008/02/25(月) 13:47:30ID:???君の語りを見てオナニレスてことに確信がもてたよ
これらのレスは君の自己満足以外に何も生まれないよ結果としてね
0550nobodyさん
2008/02/25(月) 13:52:02ID:???0551nobodyさん
2008/02/25(月) 13:54:58ID:???俺は1じゃないんだけどな。言い返せなくてそれしかいえないんだな。
それにお前がここに常駐する意味はないよな。
0552nobodyさん
2008/02/25(月) 13:58:28ID:???0553nobodyさん
2008/02/25(月) 14:52:48ID:???0554nobodyさん
2008/02/25(月) 17:26:59ID:???て
ま
い
り
ま
し
た
0555nobodyさん
2008/02/26(火) 10:28:32ID:???恐ろしいほどさびれてんねw
1だけがPHPでOOPに興味があって
その興味を無理矢理に広めようとしてる
このスレの落胆ぶり見ればよくわかるwww
0556nobodyさん
2008/02/26(火) 12:06:28ID:???クラス化されて、プログラマはそれを使ってるという程度の話でしかないから、OOPそのものの話が盛り
上がらないのは、当然といえば当然。
0557nobodyさん
2008/02/26(火) 14:01:10ID:???0558nobodyさん
2008/02/27(水) 22:15:02ID:???やはり1が何をしたいのかよくわからん
0559nobodyさん
2008/02/28(木) 00:08:29ID:???0560nobodyさん
2008/03/01(土) 01:04:42ID:???乗せられたボランティアからの不満が噴出。
ありがち。そして解散。ありがち。
0561nobodyさん
2008/03/02(日) 15:48:10ID:???営利団体なら意味はわかりますが
0562nobodyさん
2008/03/02(日) 16:50:51ID:???必死どころか、やる気があるのかと言いたい。
2007
02/23 02/24 02/27 02/28 05/12
06/12 07/06 07/11 07/26
2008
01/29 02/02 02/06 02/10 02/17
02/24 02/25
0563nobodyさん
2008/03/02(日) 20:21:37ID:???0564nobodyさん
2008/03/02(日) 23:43:21ID:???別に興味ないやつはスルーでも何でもしときゃいいと思う。
0566nobodyさん
2008/03/10(月) 14:48:07ID:???0567nobodyさん
2008/03/17(月) 07:13:22ID:???0569nobodyさん
2008/04/20(日) 09:34:37ID:???0570nobodyさん
2008/05/24(土) 06:41:54ID:???0571nobodyさん
2008/06/16(月) 13:47:07ID:???0572nobodyさん
2008/06/17(火) 12:52:46ID:???やはりC言語は、一度は学んでいた方が良いな。
Javaからプログラムに入ったから、PHPのOOPでアロー演算子使うのにとても違和感あったのだけど、
Cの構造体を知って、ドットシンタックスよりアロー演算子の方が正統派と思えるようになった。
0573nobodyさん
2008/06/17(火) 13:01:04ID:???0574nobodyさん
2008/06/17(火) 16:56:31ID:???0576nobodyさん
2008/07/27(日) 23:15:55ID:???また時間がとれたら舞い戻ってきます。よろしくw
0577nobodyさん
2008/08/09(土) 20:52:22ID:???0578nobodyさん
2008/08/19(火) 00:44:43ID:???0579nobodyさん
2008/08/28(木) 21:10:25ID:???05801 ◆SWtzLesEmM
2008/09/02(火) 15:51:27ID:w90kCMMOhttp://www.amazon.co.jp/dp/4798110558/
モデルとプロセスをめぐる冒険
「モデリング」ということについて調べてみると、いろいろノウハウがあるようです。
0581nobodyさん
2008/09/27(土) 22:23:48ID:???0582nobodyさん
2008/10/06(月) 00:30:42ID:???0583nobodyさん
2008/10/24(金) 23:26:54ID:???0584yodobashi
2008/10/26(日) 01:15:24ID:???http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1220150877
506 :目のつけ所が名無しさん:2008/10/26(日) 00:47:20
大手ECサイトで、ここまで派手なリリース失敗は初めて見た。
エンジニア向けIT情報誌や関連サイトは、ぜひ取材して原因を明かして欲し
いは。
0585nobodyさん
2008/11/05(水) 20:43:48ID:???0586nobodyさん
2008/11/13(木) 23:12:08ID:???0587nobodyさん
2008/11/15(土) 09:19:30ID:???糞スレに対してその執念が怖いんだが。。。
0588nobodyさん
2008/11/23(日) 22:46:31ID:???0589nobodyさん
2008/11/29(土) 11:22:40ID:???http://www.ibm.com/developerworks/jp/opensource/library/os-php-7oohabits/
PHP での適切な OO の習慣を身につけることによって、より安定していて、保守が容易で、拡張も容易にできるアプリケーションを作成することができます。そのためには、次のことを忘れないでください。
* 控え目である
* 良き隣人である
* メドゥーサを見ないようにする
* 結びつきを極力弱くする
* 結束性を高める
* 家族の一員として扱う
* パターンで考える
こうした習慣を身につけ、使いこなせるようになると、皆さんはきっとアプリケーションの品質が変わったことに驚くはずです。
0590nobodyさん
2008/11/30(日) 22:51:36ID:???英語の翻訳だからなのかな。
「メドゥーサを見ないようにする」なんて飛躍した比喩表現では
イメージつかないだろw
0591nobodyさん
2008/11/30(日) 23:12:38ID:???パクりblog乙
0592nobodyさん
2008/12/01(月) 12:13:27ID:YUzphIUVメデューサの項目でインタフェースを使う意義って何?
ファクトリーパターンの利点しか説明してないような気がするんだが
0594nobodyさん
2008/12/04(木) 18:30:24ID:???0595nobodyさん
2008/12/14(日) 06:43:35ID:???<?php
class A
{
function foo()
{
echo 'hello <br>';
}
}
$a = new A();
$a->foo();
$b=new A();
$b->foo();
?>
0596nobodyさん
2008/12/15(月) 02:03:44ID:???フレームワークを作るとか、フレームワークを使うとかじゃなくてさ。
考え方を学ぶためにみてみたいんだけど。
過去ログにあるように、つい、MVモデルになってしまうもんで。
0597nobodyさん
2008/12/15(月) 03:35:20ID:???0598nobodyさん
2008/12/15(月) 12:27:44ID:???簡易なMVCモデル
と検索させる
ttp://www.google.com/search?client=safari&rls=ja-jp&q=簡易なMVCモデル&ie=UTF-8&oe=UTF-8
ドゾ...
0599nobodyさん
2008/12/16(火) 10:49:27ID:???過去ログ読み直してみても、何処が批判されているのかが分からん。
Viewはこれでいいと思うのだが。
0600nobodyさん
2008/12/16(火) 10:56:49ID:???ひょっとして、「Viewではhtml出力をしてはいけない」という考えを示している
ということなのか?
html出力は別のクラスに任せるべきで、Viewはそのクラスのインスタンスの生成
と実行までを行うべきだという視点で批判してるとか。
0601nobodyさん
2008/12/16(火) 11:17:25ID:???0602nobodyさん
2008/12/16(火) 12:52:53ID:???批判している書込みは>>479です。
「に」のサンプルが、(コーディングにかかわるルール以外で)
MVCの設計はこれで良いのかがあいまいなまま終わってる気がします。
0604nobodyさん
2008/12/16(火) 19:38:24ID:???0605nobodyさん
2008/12/16(火) 19:50:24ID:???0606nobodyさん
2008/12/17(水) 01:23:14ID:???ttp://www13.plala.or.jp/naka_jima/php/chapter12.html
0607nobodyさん
2008/12/17(水) 01:36:07ID:???0608nobodyさん
2008/12/17(水) 03:42:22ID:???それとも、非常に単純なクラス構成でMVCを実現しようという考えが間違いとか?
0609nobodyさん
2008/12/17(水) 04:51:02ID:???0610nobodyさん
2008/12/17(水) 10:09:45ID:???View や Model 1つに対して1ファイルみたいだけど、ファイル量半端ないことになりそう。
0611nobodyさん
2008/12/17(水) 14:15:45ID:???でも、MVCってわりとファイル多めだよな!
1ファイルのコード量、大して多くないけど
0612nobodyさん
2008/12/17(水) 15:06:27ID:???0613nobodyさん
2008/12/17(水) 17:53:39ID:???汎用性を考えて作ろうとするとなおさらだ。それはしかたがないのかも。
そこをあえて、フレームワークや外部のモジュールなどを使わずに
非常にクラス数を少なくしてやってみたいなと思うんだけどね。
MVCの理解の一環として。
0614nobodyさん
2008/12/17(水) 20:20:24ID:???0615nobodyさん
2008/12/18(木) 01:34:16ID:???class Framework{
// コントローラー
public function controller(array $inp){
$model = $this->model($this->di('Action', $this->di('Action_Mapper',$inp));
$this->view($model);
}
// モデル
protected function model(Action $actions){
return $action->do();
}
// ビュー
protected function view($model){
print ($this->di('View_Helper', array($model));
}
// DIコンテナ
protected function di($class, $options){
return new $class($options);
}
}
class HelloWorld extends Frameworkd{}
App::controller($_GET);
0616nobodyさん
2008/12/18(木) 01:36:48ID:???0617nobodyさん
2008/12/18(木) 01:37:24ID:???0618nobodyさん
2008/12/18(木) 08:21:41ID:???最低限といっても、ファイルを読み込んで表示とか、書き込みとかの処理まで
出来る機能を持ったほうがコントローラとビューの違いが明確に分かりやすく
なると思うんだけど。
0619nobodyさん
2008/12/18(木) 10:48:40ID:???ってところで迷う。
時々、曖昧なのが出てきちゃう。
0620nobodyさん
2008/12/18(木) 11:48:41ID:???ここで事例を通じて具体的な意見を交わしていけばどうかな?」
例えば・・・
掲示板
■コントローラ:処理の内容を判断するクラス
・プログラムが実行された時、一番最初に実行される
・POSTの値をみて、以下の処理にてどれに該当するかを判断する
・データを表示する
・データを書込む
・編集用のフォームを表示する
■ビュー:htmlのレイアウト表示を担当するクラス
・以下のメソッドを持つ
・データをhtmlで表示する
・データ編集用htmlを表記する
■モデル:データファイルを管理するクラス
・ファイルの読み込み、書込みをする
・外部とは1件分のデータはBBSLineクラスでやりとりする
0621nobodyさん
2008/12/18(木) 12:24:15ID:???『■コントローラ:処理の内容を判断するクラス 』の
> ・データを表示する
> ・データを書込む
『 ■モデル:データファイルを管理するクラス 』の
> ・ファイルの読み込み、書込みをする
って、意味が重複しているような感じがするのですが...
ならば、
■コントローラ:処理の内容を判断するクラス
・モデルからデータを受け取る
・モデルにデータを渡す
とかでは、おかしいですか?
0622nobodyさん
2008/12/18(木) 12:52:00ID:???>>620じゃないけど。
・データを表示する
・データを書込む
・編集用のフォームを表示する
実際に上記の作業をするのは View と Model だよ。Controllerがするわけじゃない。
コントローラーはどれがリクエストされたかを判断して、適切な Model と View を呼び出す。
0624nobodyさん
2008/12/18(木) 20:10:31ID:???それとも必ずC経由?
C経由の場合、Mをなるべく疎結合になるように細分化してると、
Cの各Actionに書くロジック量が半端なく多くなってくるんだよね。
(Aデータを取ってきてBデータを取ってきてBをCバリデータに通してAとBを基にDを作成して・・・みたいな)
一つのAction内にロジックが増えるのもどうかと思うし、それって新しいモデルじゃんという気もしてこないでもない。
0625nobodyさん
2008/12/18(木) 20:23:33ID:???俺はM同士で連携するかたちでも良いと思うけどね。
CからMを見た場合、あるまとまった処理単位でメソッドを呼び出す形であることが
重要だと思うから。
CがMを使うときは必ずメソッドA呼び出してメソッドB、メソッドCを実行しなければならない。
さらに、そういう3連呼び出しがCの中に何箇所か書かれているなんていうのは再利用性などが
悪くなると思うから。
0626nobodyさん
2008/12/19(金) 16:35:55ID:???0628nobodyさん
2008/12/20(土) 14:28:47ID:???変化する内部状態を持つモデル同士で連携させると見通しが悪くなる。
生成してから、(観察される)内部状態が変化しないようなモデルはどこから呼んでもそれほど大きな問題はない。
オブジェクトの生成期間中に(観察される)内部状態が変化するようなモデルは、C直轄にしといた方がいい。
0629nobodyさん
2008/12/20(土) 14:34:18ID:???なんか寝ぼけてた。
要は変化する「状態」を持っているもの全てはCの管理下に置いておいた方がいいってこった。
「状態」が無いもの(生成時にファイルからデータをロードしてそれっきり、とか)はどこにあったって構わない。
インスタンスの生成を行なうクラスは自分ルールでもいいからある程度絞っておかないと混乱すると思うけどな。
0630nobodyさん
2008/12/20(土) 15:34:43ID:???is_numeric(); とかをModel内にべた書きしないで、Validatorオブジェクトを通じて、変数の内容を確認すればいいの?
$str = 'string';
$valid =& new Validator();
$valid->isStr($string);
みたいな感じで。
BaseValidator みたいな基本的なチェックをするクラスを作って、継承した先で複雑なチェック用のメソッドを実装させればいいのかな。
0631630
2008/12/20(土) 15:37:54ID:???$valid->isStr($str);
ね。まぁ、別に問題ないが。
0632nobodyさん
2008/12/20(土) 15:54:47ID:???0633nobodyさん
2008/12/20(土) 16:42:14ID:???ttp://gist.github.com/38261
俺はValidatorクラスはコントローラ単位で実装してる。「入力値の検証」なのだから、コントローラの責任。
Validatorだけ独立させるのはコードの見通しを良くするためであり、責任はあくまでコントローラにある。
ただ、実際にそっからコールするのはModelのメソッド。何が許可されるかを知ってるのはだいたいModelだからな。
たとえば受け付ける値が日付なら、そっから日付クラスのvalidateメソッドを呼び出す(MyDate::validate($string))。
POSTされる中に列挙型(<select>から送られるような、選択肢が限られているもの)とかがあった場合にこの構成は滅茶苦茶強い。
<select>のためのデータ生成とか、送られたvalueから画面表示用の文字列(「〜モード」とか)への変換を一箇所に集められる。
あと、文字列が決まったフォーマットになっているか調べる場合とかな。
is_strとかctype_stringとかstrlenだけで検証が終わるものはvalidatorクラス内に直書きする。
validateNumericとかvalidateStrとか書くよりその方が分かりやすい。
0634nobodyさん
2008/12/20(土) 17:07:58ID:???ものすごく丁寧にありがとう。
まだぼんやりとしかわからないけど、サンプルコードを読み解いて、いろいろ試してみる。
0635nobodyさん
2008/12/20(土) 17:13:17ID:???>「入力値の検証」なのだから、コントローラの責任。
「検証する」んじゃなく「検証させる」のが仕事じゃないの?
ここでいう入力値の検証って例えばどんなこと言ってる?
3行目で
>何が許可されるかを知ってるのはだいたいModelだからな。
って書いてるってことは、なにか、Modelに関係ないものを想定してると思うんだけど。
0636nobodyさん
2008/12/20(土) 18:07:36ID:???大雑把に言うと、処理を始める前に可能なパラメータの検証全般。
純粋に入力値だけを見て判定できるものだな。システムや環境の状態を見なくとも判定できるエラーを出す役割。
処理を始めないと分からないもの(DBに指定されたエントリーがあるかとか)は、バリデーションでは扱わない。
DBにこの値があった場合はクッキーにこれが無いといけない…みたいなのも対象外。
日付として「'9999-12-31'」が指定されてもバリデーションでは引っ掛けない。これは有効な入力。
「'2008-13-45'」はバリデーションでエラーとして引っ掛ける。この日付が有効になる事はあり得ないから。
メールアドレスが正しいフォーマットかをチェックするのはバリデーションで、それが有効なメールアドレスかをチェックするのはモデル。
ユーザーIDとして正しいフォーマットならばバリデーションは通るが、当該ユーザーがいない場合モデルがエラーを出す。
0637nobodyさん
2008/12/21(日) 00:53:43ID:???なんとなく分かるけど、
例えばそれだと「2008-13-45は日付(のつもり)」ってことを
コントローラが知っとかないといけないってことだよね?
あと、日付が必要なくなった、とかいうときは
コントローラーを変更しないといけないってことにならない?
なんか拘ってるようでアレだけどお勉強スレってことで許してw
0638nobodyさん
2008/12/21(日) 00:57:41ID:???hoge.php?date=20081231
とか。
0639nobodyさん
2008/12/21(日) 12:32:43ID:???「コントローラ」の指している範囲が俺と違う気がする。
俺はディスパッチャ(処理の振り分け)部分じゃなくて、そこから振り分けられる先のコントローラを指している。
ぐぐったが、「アクション」としてクラスにして丸ごとコントローラから切り離す文化圏もあるようだな。
「日付のつもりで送られてくる文字列がある」という事実は、ディスパッチャは(たいていの場合)知らない。
が、コントローラ(アクション)は知っている。だって知らないと日付具象モデルに処理を引き渡しようがないからな。
Cにはどの道変更が入る。リクエストをモデルに引き渡すのが仕事だからな。
「日付がどこからどう渡ってくるか」はCの管轄であってMじゃない。Mはそれを知っていてはいけない。
Mは「日付を渡されたらどうする」だけ知っていればよく、実際問題どこに日付があるかはCが隠蔽すべき。
たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。
この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。
「省略時は日付を無視して過去のレコードを全取得する」という場合は、データ取得ロジックが変更なのでまずMは変わる。
制御の構造、呼び出しインターフェイスも変わるのでCも変わる。
0640nobodyさん
2008/12/21(日) 12:37:44ID:???>638
入力値以外のもの(DB内の値とか処理結果)の検証は当然モデル。
というか、そういうのは一般にはバリデーションとは言わずアサーションと呼ぶ。
0641nobodyさん
2008/12/21(日) 13:45:12ID:???Cは振り分けだけが仕事だと思ってたんだけど。
その先にさらに C があることなんてあるのか。
サブコントローラーみたいな感じ?
0642nobodyさん
2008/12/21(日) 14:51:26ID:???やっぱ、そこか。
例えばブログの場合、エントリー群を司るモデルや、タグクラウドを司るモデルができる。これは自明だな。
で、データを受け取って画面を表示するだけの、ごく単純なビューがいる。これも自明。
で、それら呼び出してページのデータを作る、という「データの統合」を司るクラスが必要になる。
これをMVCのうち、MとCのどっちに置くかの問題。
MVC、MVCって言ってるけど、本質的には4層なんだよ。
処理の振り分けに1層を割くならば、4層なくてはならない。
処理の振り分け=呼び出すCの決定(ディスパッチャ)→どのMを呼び出すかを制御する(コントロール)
→データを実際に扱う(モデル)→表示(ビュー)、となる。
実際のフレームワークだと、RailsやZendはDispatcherが振り分けを担当し、制御はコントローラが執っている。
(だから、おまいの目から見れば、コントローラは仕事をやりすぎに見えるはず)
SymfonyやCakeだとControllerがディスパッチを担当し、制御はActionが執っている。
CodeIgniterだとディスパッチは単一のエントリポイント(リクエストを受けるphpファイル)であるindex.phpが行なって、制御はCが行なっている。
0643nobodyさん
2008/12/21(日) 15:35:51ID:???>たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。
>この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。
これって制御じゃなくてロジックだからモデル的仕事じゃねぇの?
0645nobodyさん
2008/12/21(日) 16:03:24ID:???0647nobodyさん
2008/12/24(水) 12:54:19ID:???実装するときは、コントロールで括るよな?
0648642
2008/12/24(水) 22:47:37ID:???M・V・Cで分けるならCってのは同意。いちおう
> 処理の振り分けに1層を割くならば
と予防線は張ってあるわけだが。
俺はControllerの親クラスとかControllerFactoryでディスパッチする事が多い。
0649nobodyさん
2008/12/25(木) 12:55:55ID:???> Controllerの親クラスとかControllerFactoryでディスパッチする事が多い
ディスパッチャーのインターフェースを作って、コントローラクラスでインプリメンツするってのは駄目なの?
0650nobodyさん
2009/01/04(日) 21:25:44ID:???0651nobodyさん
2009/01/10(土) 18:38:23ID:???0652nobodyさん
2009/01/18(日) 01:35:36ID:???0653nobodyさん
2009/01/26(月) 20:14:56ID:???0654nobodyさん
2009/02/02(月) 14:37:18ID:JcAer1H1自作のモチベ下がっちまったい。
0655nobodyさん
2009/02/02(月) 14:46:20ID:???0656nobodyさん
2009/02/02(月) 14:54:00ID:???0657nobodyさん
2009/02/02(月) 15:06:11ID:???で、既存のフレームワークのマニュアルとかソースを参考にしながら作ってたんだけど、取り込むつもりが逆に呑まれた形。
0658nobodyさん
2009/02/02(月) 20:06:44ID:???で、市販のモジュールを使うなどして0から作り直すなどの方法を
模索したが、結局は引継ぎしたソースを解読して手を加えるのが
楽で、早い道であることが分かった。みたいな話かな?w
PHPではないが、俺はちょうどこんな感じの体験をしたことがあるw
0659nobodyさん
2009/02/03(火) 00:06:52ID:???要するにフレームワークの魅力に気付いたわけですよ。
0660nobodyさん
2009/02/03(火) 01:52:40ID:???0661nobodyさん
2009/02/04(水) 08:03:26ID:???プログラムは体感して分かっていくものなのだから。
0662nobodyさん
2009/02/04(水) 21:38:41ID:???自作云々は別にして。
0663nobodyさん
2009/02/05(木) 22:29:31ID:6GWaaOT60664nobodyさん
2009/02/06(金) 07:54:15ID:???PHPでOOPのスレの趣旨に添ってると思うし、他の人の意見を聞いて
参考になる部分もあると思うのだが。
0666nobodyさん
2009/02/09(月) 20:26:45ID:???0667nobodyさん
2009/02/12(木) 07:33:22ID:???0668nobodyさん
2009/02/12(木) 09:08:20ID:???0670nobodyさん
2009/02/12(木) 20:11:52ID:???0671nobodyさん
2009/02/12(木) 20:25:45ID:???0673nobodyさん
2009/02/12(木) 20:59:58ID:???0674nobodyさん
2009/02/12(木) 21:37:52ID:???0675nobodyさん
2009/02/12(木) 22:00:11ID:???0676nobodyさん
2009/02/13(金) 20:54:05ID:???0677nobodyさん
2009/02/15(日) 23:40:26ID:???メリットやデメリットがみえてくるんじゃなかと感じた。
あれは、ポストバックとか独自の理論があって、それを学ばないと使えるようになれない。
しかし、ページをまたがってデータの受け渡しをする際は、非常に便利な機能であり、
使いこなせるようになると、生産性が向上する。
0678nobodyさん
2009/02/16(月) 00:05:47ID:???0679nobodyさん
2009/02/16(月) 00:44:15ID:???0680nobodyさん
2009/02/16(月) 11:09:32ID:IOY0ae9eでも両者とも動かせるサーバって高いからなぁ。
Web以外にも用途はあるけど。
0681nobodyさん
2009/02/16(月) 19:31:23ID:???いろいろな言語に触れてみると、その分視野は広くなることだろう。
共通して実装している機能を見ることで、OOPの概念をつかんだり
出来るはずだし。
しかし、広く浅くにとどまっていると、何も作れないで終わるので、
物を作る際は、一つの言語に絞り込んでいた方が良い。
なので、java や C# においてはローカルで稼動させるのにとどまらせて
おいたらどうかな?ASP.NET だと、Webアプリでもローカルでテスト動作
させる環境が Express にもついてるし。
0682nobodyさん
2009/02/16(月) 23:33:26ID:???ASP.NETは、デスクトップアプリケーションからのアプローチなんで、これだけちょっと勝手が違うけど。
プログラミングを仕事にするなら、最初は型ありの言語をやった方がいいと思う。
JavaとかC#が理解出来れば、PHPやPerlはすぐに分かる。
0683nobodyさん
2009/02/17(火) 12:38:03ID:???0684nobodyさん
2009/02/17(火) 20:53:57ID:???それはそれで良いのではないかと思っている。
perlのモットーがあわないのであれば、PHPを使うで良いと思うし。
0685nobodyさん
2009/02/23(月) 20:40:12ID:???いうのではなく、その理由の部分を述べていくといいかもね。
0686nobodyさん
2009/02/23(月) 21:35:23ID:???0687nobodyさん
2009/02/23(月) 22:27:49ID:???個人的には、純粋にOOPを学びたいのであれば別の言語がいいかなーとは思う。
理由は、Webは身近だし使い慣れてると言えるかもしれないが
PHP以外のHTMLやらJSやらHTTPプロトコル等知らなければいけない知識が多くあるから。
その辺を知っていれば問題はないと思うけどね。
0688nobodyさん
2009/02/23(月) 23:55:46ID:???0689nobodyさん
2009/02/24(火) 02:09:17ID:???いきなりWEBフレームワークを作ることは難しいので、
実際に存在するフレームワークのソースを追いかけ、参考にしながら、
オレ的フレームワークを組み上げることで、様々な知見を得ることができると思う。
また、これらのフレームワークはたいてい、何らかのデザインパターンやアークテクチャパターンが使われているため、併せてこれらも学習する必要があると思う。
0690nobodyさん
2009/02/24(火) 12:23:13ID:???0691nobodyさん
2009/02/24(火) 12:40:12ID:???0693nobodyさん
2009/02/24(火) 20:31:42ID:???俺的フレームワークなんて作らないほうがいい。
自己主張ばかり強い勘違いになりがちだし、遠回り。
良い先人の手本を眺めるほうがよっぽど効率的だわ。
0695nobodyさん
2009/02/25(水) 06:21:18ID:???聞いたことないな。そんなことするぐらいなら、Windowsアプリケーションなり、Accessなりで直接DBを参照するから。
0696nobodyさん
2009/02/26(木) 22:25:57ID:???クライアントマシンの性能を利用しないなんて
どれだけ無駄なんだかw
0697nobodyさん
2009/02/26(木) 23:57:14ID:???性能うんぬんは考えてないんだよな
0698nobodyさん
2009/02/27(金) 00:54:42ID:???0699nobodyさん
2009/02/27(金) 05:45:51ID:???0700nobodyさん
2009/02/27(金) 06:00:50ID:???0701nobodyさん
2009/02/27(金) 13:31:01ID:???つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
0704nobodyさん
2009/02/27(金) 20:00:15ID:???「今日はCakePHPがお勧めとなっております。」
「じゃあ、そいつをくれ。」
「かしこまりました。」
0708nobodyさん
2009/02/28(土) 04:26:33ID:???0709nobodyさん
2009/02/28(土) 08:03:49ID:???0710nobodyさん
2009/02/28(土) 08:44:26ID:???0711nobodyさん
2009/03/04(水) 21:56:11ID:vdYaMRthそれぞれ適当な補助クラスをコンポジる感じでok?
0712nobodyさん
2009/03/04(水) 22:30:14ID:???0713nobodyさん
2009/03/04(水) 22:51:16ID:???それはどうだろう…
0714nobodyさん
2009/03/04(水) 23:44:42ID:???別にありじゃない?
PHPTALってのもあるし
厳密には、TALに値渡す必要があるので、Viewが純粋なHTMLのみという訳ではないけど
0715nobodyさん
2009/03/05(木) 10:13:09ID:???コンポーネントってのもよくわからんし。
0716nobodyさん
2009/03/05(木) 11:05:22ID:???0717nobodyさん
2009/03/05(木) 12:25:35ID:???ビューとコントローラで迷うことはないけど、モデルとコントローラのどっちに書くべきかな、って言うのが多い。
まぁ、経験で補うもんだろうね。
0718nobodyさん
2009/03/05(木) 17:40:27ID:???byとぐろ兄弟
0719nobodyさん
2009/03/06(金) 04:31:52ID:???0721nobodyさん
2009/03/10(火) 12:40:11ID:???0722nobodyさん
2009/03/29(日) 09:52:31ID:???0723nobodyさん
2009/04/06(月) 08:51:50ID:???0724nobodyさん
2009/04/06(月) 09:51:43ID:???0725nobodyさん
2009/04/08(水) 23:43:02ID:???社内だけで技術囲ってんじゃねーぞ。
0726nobodyさん
2009/04/08(水) 23:49:40ID:???0727nobodyさん
2009/04/10(金) 03:54:17ID:4A05Vd6N処理はModel、ViewとModelを制御するController
ってある。
例えば、ある条件を満たしたときに、データファイルからデータ一覧をリスト形式にしたくて、
・データ1
・データ2
・
みたいにずらーと繰り返しして表示するとき、
modelには、ある条件を満たしたしたかどうかを判断する処理を、
viewには<div>やら<ul><li>を、
controllerには繰り返しのwhileを?
って迷ってしまう。
でもwhileて処理になるからmodelに書いた方がいいんじゃあいの?、と・・
でもmodelにwhileの処理かくと、同時に<br>やらもmodelに書いて
viewには何を?・・ってなってしまって先にすすめない・・
つづく
0728727
2009/04/10(金) 03:59:45ID:4A05Vd6N非常にわかりにくいかもしれないけど
こういうときって、素直にcontrollerにwhile処理いれとけばいいのかな。
でも、controllerに制限させるものが二、三個ならいいけど
もっとwhile処理するものが多くなれば、
処理がかぶってくるんだけど、
それが気持ち悪くて・・
なにか上手い回避方法を教えてください
0729nobodyさん
2009/04/10(金) 04:08:52ID:4A05Vd6Nviewにはhtmlタグだけを、
modelには条件処理とwhile処理を、
このwhile処理の中にviewで書いたhtmlタグを
放り込んで繰り返し処理。
controllerで、このmodelに引数入れてやれば
このmodelの変数には、
条件処理された結果と、
htmlタグつきのデータ一覧が格納されて、
表示される。
みたいにしたんだけど、これでいいのかな。
wikiのまとめサイトみるとmodelにwhileかかずに
controllerに書いてたから、何か意図があってやってるのかなと
0730nobodyさん
2009/04/10(金) 04:22:59ID:???0731nobodyさん
2009/04/10(金) 09:37:55ID:???View にはテンプレートエンジン使って View の中でループさせる。
Controller は Model に「データ持ってこい」と頼んで、受け取ったデータを今度は View に渡して「表示しろ」と頼む。
View は渡されたデータをぶん回して表示する。
「頼む」ってのは メソッドを呼び出すことを指す。
嘘教えてたら許して
0732nobodyさん
2009/04/10(金) 10:04:35ID:???というとつまり、もしも動的にデータを一覧表示させたいときなんかは、
”データ持ってこいとModelに頼む→Viewに渡して表示させる”
という一回の表示を、whileなりなんなりを使って何回も繰り返す操作を
Controllerがやるってことでいいのか。
0733nobodyさん
2009/04/10(金) 10:51:33ID:???"2"という条件を与えたときに、
date1<br>
date2<br>
"4"という条件を与えたときに、
date1<br>
date2<br>
date3<br>
date4<br>
という一覧を行いたい場合。
Modelには、指定されるデータを一つ引き出せるメソッドを、
Viewには、Controllerから受け取ったModelの一つのデータの後ろに、<br>を加えてechoするメソッドを、
そしてControllerで、Modelのメソッドを実行して、得られたデータをViewのメソッドへ渡し、一つデータを表示させる、
この操作を条件分繰り返すwhileもControllerに書いておく。
で、いいのけ
超基本的な場合、イメージ的には、
・Viewは、htmlしか知らない人でも、(phpの変数以外は)htmlタグ部分がはっきりしてるので弄ろうと思えば弄れる作り
・Modelは、処理されたデータを与える
・Controllerは、初期条件をMVに与えたり、MVにあるいろいろなメソッドの中から、
必要なものを選んで、データを得たり、表示させたり(MをVに渡して表示させたり)、
MVを組み合わせて完成したものを表示させる
みたいな感じ
だけで基本的名ことがまだまだ全然わからん
0734nobodyさん
2009/04/10(金) 12:01:58ID:???まあ作り方によるんだろうけど……
ループでViewを何回も呼び出すよりも、例えば配列でデータを一度に全部渡しちゃって、Viewにループしてもらったほうがスッキリしない?
Viewの中にPHPの生のコードが入るのを避けたいなら、先に挙げたテンプレートエンジン使うとかすればいいし。
0735nobodyさん
2009/04/10(金) 12:17:29ID:???たしかにそうか
ループするデータ表示のデザインて単純なものが多いだろうし
デザイン変更するときも、viewにphpのコードが入っててもそこまで苦にはならないか。
テンプレートエンジンどれがいいか決めれないし、
controllerにphpコードの種類がいっぱい入ってくると見にくいし長くなりそうだから
とりあえずはviewでループさせる方法にしてみるわ
あんがと
0736nobodyさん
2009/04/10(金) 12:48:47ID:???レス全部読んでないから、的外れになるかもしれないけど、
MVCの基本コンセプトは『プログラムの着火点(エントリーポイント)は、URLである』
という考え方が中心になっているらしいよ
つまり、どんなWEBアプリもそのプログラムにアクセスしないと何も起こらないという発想。
そこから更に考えを発展させて、URLの一部にメソッドを含めよたのがMVCのポイント。
この、メソッドを含んだURLを処理する枠組みをコントローラにした訳。
だから、コントローラを中心にデータをサーバに貯めるならModelに、
データをユーザに表示するならViewにと処理系を分けた。
一般的にビジネスロジックはModelにとか言われるけど、
このビジネスロジックとはデータに正規表現をかけて別の形に置き換えるとか、
特定の数値を暗号化したりとか、殆どの処理の処理を指す。
だから、ロジックの中心はModelで処理され、コントローラはただMやVにデータを振り分けるだけに徹するのが
正しいMVC設計と言われてる。
実際のコード量もControllerが異様に肥大しているMVCは、悪いMVCとされている。
迷ったらMにロジック書いて、Cから呼出すようにする。
どうしても呼出せないロジックだけCで処理しよう。
0737nobodyさん
2009/04/10(金) 13:22:45ID:???なるほど
完全に思い込みで、
Vには、phpコードでの処理に関連するものはほとんど無くしてhtml表示メインが良い
みたいになぜか考えてしまっていて、なかなか進めなかった。
>メソッドを含んだURLを処理する枠組みをコントローラにした訳。
>だから、コントローラを中心にデータをサーバに貯めるならModelに、
>データをユーザに表示するならViewにと処理系を分けた。
これで、C、M、Vにはそれぞれこれをしようっていう考えが固まってきて
踏ん切りがついて先にすすめそうだ
とんクス
0738nobodyさん
2009/04/11(土) 01:35:03ID:???最初の1件とか最初から100件とか、或いは全部っていうのはVの都合なわけで、
変更したいって思ったときはVだけ触ればよくしたい。
ってことで、
無駄とかなんとかは気にせずに、純粋な感じでいうと
Cの人は全部もらって、そのままVの人に渡す
っていうのがMVCぽいかな、って思う。
0739nobodyさん
2009/04/11(土) 07:42:37ID:???俺は、Vの役割は「もらったデータを表示する」だと思ってるから、
ループする処理とかはCの役割だと思うけどな。
Vは、大量データ表示用のフォーマットや、1件詳細表示用のフォーマットを
持っているという形。
Cは、指定された件数のデータを表示させる機能を持っている、という形。
0740nobodyさん
2009/04/11(土) 07:47:58ID:???質問者さんは、自分の思う発想でコードを書いてさらしてみたらどうかな。
それに対していろいろな人がレビューをすると何か見えてくるかもしれない。
0741nobodyさん
2009/04/11(土) 14:03:22ID:???ASP.NET MVC入門
http://www.atmarkit.co.jp/fdotnet/aspnetmvc/aspnetmvc01/aspnetmvc01_01.html
0742nobodyさん
2009/05/07(木) 16:51:10ID:???デザインパターンなども学んで理論に忠実に沿った理想的な
プログラミングをしてみたいなとも思ったけれど、つきつめると
ケースバイケースってことに落ち着くから、こういう、忠実さを
追いかけるのは無駄な考え方のような気もしている。
この考えで合ってるよね?w
0743nobodyさん
2009/05/07(木) 16:54:10ID:???0744nobodyさん
2009/05/07(木) 20:10:16ID:???そもそもASP.NETはイベントドリブンなフレームワークで、本来の意味でのMVCを採用してたんだけど、StrutsとかRoRとかがウェブで流行ったから、MSも似たようなフレームワークを作ったわけ。
だからのこれまでのASP.NETの方が本来的なMVCに近い。「ASP.NET MVC」は「ASP.NET ウェブMVC」とかって名前にすれば良かったのに。
0745nobodyさん
2009/05/07(木) 20:53:37ID:???ASP.NETにおいてMVCに関する詳しい記事かなと思ったけれど、
実際に読んでみると、まったく別なフレームワークってことだった。
違いについて理解するのがひとつ面倒になったなぁ。
0746nobodyさん
2009/05/07(木) 23:05:13ID:???0747nobodyさん
2009/05/19(火) 20:06:52ID:???0748nobodyさん
2009/06/18(木) 20:12:33ID:???0749nobodyさん
2009/07/02(木) 08:55:14ID:SGa5I59I自転車を使え
走れ
歩いてもいいぞ
0750nobodyさん
2009/07/02(木) 09:07:04ID:???必要な機能をモジュール化したいときにOOPをいいとこ取りすれば便利
0752nobodyさん
2009/08/27(木) 07:51:29ID:???最初に設定していた目標が概ね達成出来たからじゃね?w
っていうか、このスレに求めているものを書いていけば
盛り上がりを戻す可能性もあると思うよ。
質問するとか、何かソースを提供するとか。
0753nobodyさん
2009/10/25(日) 21:56:08ID:???0754nobodyさん
2009/10/30(金) 22:56:19ID:???0755nobodyさん
2009/11/13(金) 21:51:59ID:???いや、あおりとかじゃなくて。
0756nobodyさん
2009/11/19(木) 15:33:07ID:???07571 ◆SWtzLesEmM
2009/12/17(木) 22:30:30ID:???同じ機能を作るのに、コードを書く量が少なくて済むと楽ですね!
ただ、MVCだとスクリプトのファイル数が多くなると、ゴチャゴチャして見づらいと思いました。
MVC以外のフレームワークでオススメのものはありますか?
http://www.slideshare.net/NetPenguin/mvc-2659370
・PAC
・RecursiveMVC(HMVC)
・MMVC
・Doc/View
という仕組みが紹介されていました。
0758nobodyさん
2009/12/17(木) 22:33:57ID:???07591 ◆SWtzLesEmM
2009/12/17(木) 22:48:51ID:???ttp://d.hatena.ne.jp/sotarok/20091126/modern_php_programming_at_pfi
↑このスライド資料の72ページ目に、PHPフレームワークの評価が紹介されていました。
・CakePHP
世界でも日本でも大流行り。当然日本語での情報量も多い。
Modelが使いやすい。それ以外は嫌いだけど。
Cake3が別フレームワークにfork
・ZendFramework
世界的にシェアNo.1?
書く量の減らないドMフレームワーク
というかいわゆるライブラリ群
・symfony
これも利用者多い
大規模向け。がっちりしてる。
・Ethna
グリーはこれで動いている!(古いバージョンだけど)
・rhaco2
大本命の超変態フレームワーク
すごい
Ruby(RoR)っぽいFW → CakePHP / Lithium
Java(Struts)っぽいFW → symfony
Python(Django)っぽいFW → rhaco
というかんじでしょうか?
07601 ◆SWtzLesEmM
2009/12/17(木) 22:56:44ID:???ttp://d.hatena.ne.jp/kagigotonet/20091215/1260851032
>PHPはWeb特化言語という特性上他の言語では見られない強力な仕組みがあります。
>その特徴は他の言語では参照で取り回すところを文字列で取り回すところである、と言えるでしょう。
>可変関数
>PHPのフレームワークは、これを基本としています。ライブラリ、モジュールを動的にロードするのが非常に容易
>可変変数
>このように可変変数や可変引数を組み合わせるだけでも、少ないコード量でかなり複雑なことが可能になります。
各フレームワークのディスパッチ(処理の割当て)の仕組みを見ると、参考になりますね。
07611 ◆SWtzLesEmM
2009/12/17(木) 23:07:31ID:???「名前空間」を活用すると、たくさんモジュールを作っても分類が楽になりますね!
ttp://d.hatena.ne.jp/Fivestar/20091215
ttp://prezi.com/0-vyhjdkslih/
0762nobodyさん
2009/12/17(木) 23:10:38ID:???07641 ◆SWtzLesEmM
2009/12/17(木) 23:43:57ID:???>Viewにループしてもらったほうがスッキリ
そうですね。
データをループ表示させるのは、ビューの役割。
ビューの部分には
・テンプレート(HTMLファイル)
・テンプレートエンジン(HTMLファイルに文字列を当てはめるパーサー)
の二つが含まれている形にすれば、
表示に関するロジック(繰返し表示の処理など)はビューの中に置けばOK
=表示に関する機能を修正する場合、ビューの中を探せばOK
07651 ◆SWtzLesEmM
2009/12/18(金) 00:45:09ID:???MVCのモデルはどんなふうに作るか?という話で、
・トランザクションスクリプト
・ドメインモデル
という二つのスタイルがあるそうです。
ttp://pc11.2ch.net/test/read.cgi/php/1241341332/
ttp://proshile.blog.drecom.jp/archive/616
・トランザクションスクリプト
→古きよきC言語時代の関数が主体の書き方
・ドメインオブジェクト
→オブジェクト毎に内包する値と役割の責務を明確にしたOOPライクな書き方
MVCのモデルの部分は2層に分けて、
(1)ビジネスロジックコンポーネント
(2)デーアクセスロジックコンポーネント(O/Rマッパーを含む)
と分類する考え方があるそうです。
ttp://satoshi.blogs.com/life/2009/10/rails_mvc.html
ttp://d.hatena.ne.jp/p4life/20091014/1255532618
>Skinny Controller, Fat Model
・コントローラーはシンプルにする
・モデルに処理を集約する → 上記(1)ビジネスロジック=データの加工を担当
・モデルはデータの整合性を保証する → 上記(2)データアクセスロジック=データの読み書きを担当
ttp://www.virtual-tech.net/blog/2008/10/reflex-restful.html
ttp://www.virtual-tech.net/blog/uploaded_images/designold-722880.PNG
↑この図だと、モデルの部分が2層に分かれていて、
サービス層=上記(1)
ドメイン層=上記(2)
という形になるかと思います。
07661 ◆SWtzLesEmM
2009/12/18(金) 00:55:44ID:???C側に書いてあるコードを、なるべくM側の方に移動した方がスッキリするかも?
CとMの間のデータ受け渡しについて、こんな記事がありました。
↓
ttp://q.hatena.ne.jp/1242894491
>個々のSetterをオーバーライド出来るところが
>symfonyの便利な部分じゃないでしょうか。
>これが出来ないと個々のコントローラでデータを加工するハメになります・・。
>「MVCとして洗練されている」というのは
>「MVCに忠実に機能している」というのと同義かと思います。
一口にOOPと言っても、各フレームワークでちょっとずつ使い方に違いがありますね。
07671 ◆SWtzLesEmM
2009/12/18(金) 01:20:21ID:???フレームワークを使ってみて、OOPの使い方の理解が深まりました。
皆さん、たくさんのアドバイスをいただき、どうもありがとうございました。
分からないことがあっても、検索したり質問して1個ずつ埋めていけば、確実に進歩できると思います。
どんなプロフェッショナルな人でも、最初は素人だった…
これからPHPの勉強を始める方がいましたら、焦らずに頑張ってくださいね!(*^o^*)/
0768nobodyさん
2010/01/16(土) 21:42:43ID:???0769nobodyさん
2010/03/05(金) 11:55:14ID:???サイト見つけたので紹介しておきます。
0770nobodyさん
2010/04/20(火) 14:58:53ID:???必要なときにどこからでも呼び出せるプログラムみたいなものだよね。
0771nobodyさん
2010/04/20(火) 18:56:50ID:???0772nobodyさん
2010/04/21(水) 02:32:40ID:???プレーヤーを継承した CDプレーヤー,MP3プレーヤー がある
それぞれに 再生,停止,早送り,巻き戻し,次トラック,前トラック という機能(メソッド)がある
具体的な処理はそれぞれが行うので,使う人はプレーヤーの処理している内容を
理解している必要はなく,再生したいときに再生ボタンを押すという事だけ
分かっていればいい。(カプセル化)
つまり考え方であって,そういう意味では間違ってないのかもしれない。
0773nobodyさん
2010/04/21(水) 23:48:02ID:???0775nobodyさん
2010/04/22(木) 20:41:56ID:???0777nobodyさん
2010/04/23(金) 00:43:27ID:???PHPは型にしばられない(しばられなさすぎて困る)スクリプト言語だからね。
逆に、静的言語のように型を意識しすぎると、スクリプト言語のメリットが少なくなると思う。
「じゃぁ、お前、クラス階層つかわねーのか?」と言われればノー
コンポーネント(レイヤ)の中では、型を意識し、拡張する場合は継承も使用する。
コンポーネント間の接続は型ではなくメッセージ(メソッド)に束縛させるように意識している。
でも最近は、interface作って、抽象クラス作ってというのがおっくうになってきたので、可能ならメソッドポインタによるコールバックで済ませちゃうこともしばしば。
0778nobodyさん
2010/04/30(金) 11:21:02ID:???http://www.craftgear.net/docs/yii_blog_tutorial/index.html
本家の日本語訳が途中でストップしてるけど、こちらは全部訳してある。
本家
http://www.yiiframework.com/doc/blog/ja
0779nobodyさん
2010/05/22(土) 17:38:18ID:???0780nobodyさん
2010/05/24(月) 00:43:02ID:???javaや.NETはたまたPythonあたりの純血PGが書けばOOPっぽいソースになると思うよ。
PerlとかPHPから始めました、ってのはだめだな。
0781nobodyさん
2010/06/09(水) 18:32:35ID:uqJikGsn0782nobodyさん
2010/06/09(水) 21:02:23ID:???名前空間とか
0783nobodyさん
2010/06/09(水) 22:05:43ID:???0784nobodyさん
2010/06/09(水) 22:50:19ID:???0785nobodyさん
2010/06/11(金) 20:18:27ID:???じゃあ、PHP5のコードをPHP6に移植しても問題なく動くってことでいい?
PHP4→PHP5のときは大変みたいだったけど。
同じ思いをしたくない。
0786nobodyさん
2010/06/12(土) 05:01:32ID:???0787nobodyさん
2010/06/13(日) 07:15:58ID:???0788nobodyさん
2010/06/20(日) 11:50:01ID:???公式にオブジェクト指向ライブラリを提供すればよい
0790nobodyさん
2010/06/21(月) 16:09:23ID:L/6UXzEfオブジェクト指向(クラス)を使ってるつもりなんだけど正しいのか自信がない
クラスformPartsの中で各プルダウンやラジオボタンの要素(nameとvalue)を
外部ファイルから読み込んどいて
$fp = new formParts();
$pref = $fp->callPullDown('prefecture',$val);
$job = $fp->callPullDown('job',$val);
$sex = $fp->callRadioButton('sex',$val);
こんな感じでメソッドでパーツの種類を指定しつつ(ラジオボタンかプルダウンか)
そのパーツの要素(都道府県とか職業とか)と既定値($val)を投げて呼び出してる。
プルダウン要素とかは各メソッド内部で引数によって外部ファイルから読みこんでる。
クラスってこんな使い方でいいの? 継承とかはさっぱりわからない、どういう状況で使うんだか。
あと1さん凄いね、ガッツがあるなぁ。。
0791nobodyさん
2010/06/22(火) 02:52:17ID:???0792nobodyさん
2010/06/22(火) 02:53:02ID:???0793nobodyさん
2010/06/26(土) 22:03:26ID:lGwy0O8s0794nobodyさん
2010/06/28(月) 10:27:12ID:PXXo1bnrPHP最大の武器であるHTMLとの親和性の高さを殺してるよね
0795nobodyさん
2010/06/28(月) 20:02:03ID:???0796nobodyさん
2010/06/28(月) 22:25:44ID:???PHPのHTML埋め込みなんてもう古い
0797nobodyさん
2010/06/29(火) 01:12:38ID:???0798nobodyさん
2010/06/29(火) 07:49:52ID:???0799nobodyさん
2010/06/30(水) 18:24:45ID:???そもそもPHP自体テンプレートみたな言語じゃん。
index.php
<?php
$title = "hoge";
$hello = "hello world";
include "template.php";
?>
template.php
<html>
<head><title><?php echo $title ?></title><head>
<body>
<h1><?php echo $hello ?></h1>
</body>
</html>
こういうのとは違うの?
0800nobodyさん
2010/07/01(木) 00:39:53ID:???コードを動かすという発想で作られていない。
コードーの中でHTMLを出力するという発想。
そういう言語ではテンプレートが重要。
PHPでテンプレートの意味が薄いのは確か
ただテンプレートの意味がまったくないかというと、そうではなく
分業作業。つまりプログラマとデザイナに分かれて開発するときは便利。
デザイナはphpコードはまったく知らない。だからなるべくシンプルな
記号レベルの書き方であってほしい。しかもDreamweaverのような
HTMLエディタで見たときに不具合無く表示されるものの方がいい。
0801nobodyさん
2010/07/01(木) 14:26:10ID:ksuFUfiJいや、分かるようにPHPを書かなければならいと思う
それがPHP
0802nobodyさん
2010/07/01(木) 19:54:20ID:???まで読んだ
0803nobodyさん
2010/07/07(水) 17:20:53ID:???0804nobodyさん
2010/08/20(金) 12:31:24ID:???0805nobodyさん
2010/08/20(金) 14:43:19ID:???マルチしてんじゃないですよクソゴミww(笑)wwww(笑)wwww(笑)wwww(笑)ww
ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
ww(笑)wwww(笑)ww
PHPやってるやつノウタリンばっかりwwwwwwww
0806nobodyさん
2011/10/15(土) 11:25:55.76ID:???0807nobodyさん
2011/10/17(月) 12:28:57.35ID:???コーディングが楽だから、OOPで良いんです!!
0808nobodyさん
2011/12/16(金) 08:42:12.54ID:???OOPだからボトルネックが把握しやすくてメンテナンスや新実装がしやすくなる
0809nobodyさん
2011/12/18(日) 18:35:23.31ID:XDa3NN+N0810nobodyさん
2011/12/18(日) 21:04:34.89ID:???だったら書き方おかしいよ
0811nobodyさん
2011/12/19(月) 12:14:00.72ID:8JBaGfsG体感できないとは幸せだね。
0812nobodyさん
2011/12/23(金) 12:11:53.50ID:???0813nobodyさん
2012/01/12(木) 17:20:16.63ID:???コントローラを肥大させてはならないという概念ではわかりにくい。
もっと具体的に境界線を引くべきだと思う。以下俺の意見なんだけど、
MVCってユニットテストために
ユニットテストを難しくする汚染要素を隔離するためにあるのだと思う。
具体的に言うとこんな感じ。
View(GUI, xml, html, json)
Controller(Session, Request, Form, 画面遷移などWeb独自のデータ)
Model(RDB, KVS)
MとCが分離されることでMはWebスコープから分離され、CはSQLから分離される。
でもこの理屈だとVとCの関係がおかしくなっちゃうね。
CがVにデータを渡すときはリクエストスコープを経由しないで
直に関数の引数で整数や文字列、オブジェクトを渡すべきって話になるから。
0815nobodyさん
2012/01/13(金) 12:44:55.80ID:???> MVCってユニットテストために
> ユニットテストを難しくする汚染要素を隔離するためにあるのだと思う。
正しいが、これは現場的な視点の1つの考え方。
MVCは、スケーラブルなサイト構築のためのパラダイムという方が、しっくりくると思うが...
0816nobodyさん
2012/01/13(金) 14:14:37.80ID:???0817nobodyさん
2012/03/25(日) 15:09:36.84ID:AY6baIQVイメージとしてはJavaのStrutsのようなものです。
0818nobodyさん
2012/03/26(月) 23:05:27.26ID:???0823nobodyさん
2012/03/29(木) 00:32:40.17ID:???OOPに慣れてるからです。
オブジェクトとして定義するところで
phpの場合、配列になるのでいらいらします。
たとえばCakePHP。ModelがModelになっていない。
やはり後付けでOOP機能が加わった言語では無理があるのですね。
0827nobodyさん
2012/03/29(木) 12:36:50.80ID:???0830sage
2012/03/31(土) 00:44:25.15ID:5Y7rPOtM実行速度が遅いPHPではそもそも向いていない。
0834nobodyさん
2012/04/02(月) 10:00:58.63ID:???Javaのフレームワークの比較で語りましから、あなたが今までにどのJavaフレームワークを使ってきたのか教えてください
0835nobodyさん
2012/04/03(火) 02:06:22.73ID:???08371
2012/04/03(火) 05:28:27.27ID:???いやです
0838sage
2012/04/03(火) 09:03:36.19ID:s3V9thNo0839nobodyさん
2012/04/03(火) 12:55:40.44ID:???0840nobodyさん
2012/04/03(火) 13:09:50.72ID:???0841nobodyさん
2012/04/03(火) 13:40:01.23ID:???速度の面でも不利
0842nobodyさん
2012/04/03(火) 14:48:23.63ID:???0845nobodyさん
2012/04/04(水) 00:03:58.45ID:???回答者がそのフレームワークとCakePHPを比較すべき
0846nobodyさん
2012/04/04(水) 02:04:42.62ID:???phpのOOP機能は単なるおもちゃ。
0847nobodyさん
2012/04/04(水) 19:20:23.84ID:???すいません
ここのフレームワークのソースをダウンロードしたいんですが、ダウンロードできません。
どこかで入手できないでしょうか
0848nobodyさん
2012/04/04(水) 21:46:53.59ID:???10分ほどしてから再度お試しください。
0849nobodyさん
2012/04/21(土) 07:48:42.18ID:???PHP自体カス以下だし
0850nobodyさん
2012/04/25(水) 22:43:11.22ID:???参加者募集中
0851nobodyさん
2012/04/25(水) 23:12:37.13ID:???0852nobodyさん
2012/04/25(水) 23:13:48.71ID:???0853nobodyさん
2012/04/26(木) 00:11:07.09ID:???0854nobodyさん
2012/04/26(木) 03:03:15.10ID:???関数があるんだよ。
0855nobodyさん
2012/04/29(日) 05:23:36.37ID:???そして、関数名が長くて、使いたいときに思い出しにくく覚えにくい。命名法が統一されてない。
0856uy
2012/06/25(月) 19:13:52.21ID:???笑わせるなよwwww
0857nobodyさん
2012/06/26(火) 12:21:43.29ID:???便所に行ったら手ぐらい洗え
つttp://sociorocketnews.files.wordpress.com/2012/06/after-toilet-wash-your-hands-japan01.jpg
ttp://sociorocketnews.files.wordpress.com/2012/06/after-toilet-wash-your-hands-japan02.jpg
ttp://sociorocketnews.files.wordpress.com/2012/06/after-toilet-wash-your-hands-japan05.jpg
0858uy
2012/06/26(火) 12:34:02.34ID:???お前らのような下級ゴミカスとは格が違う
0859nobodyさん
2012/06/26(火) 12:39:35.58ID:???0861nobodyさん
2012/06/28(木) 00:47:58.97ID:???0862nobodyさん
2012/06/28(木) 05:06:29.82ID:???0863nobodyさん
2012/06/28(木) 12:22:49.87ID:???でも、よく言った!
0864nobodyさん
2012/06/29(金) 03:21:18.32ID:???平たく言えば何でもセッションに突っ込んでるだけなんだけどね。
0865nobodyさん
2012/07/14(土) 00:10:18.29ID:???0866nobodyさん
2012/07/16(月) 19:14:45.27ID:???だれか使いこなせてるって人いますか?
0867nobodyさん
2012/07/17(火) 07:36:18.33ID:???0868nobodyさん
2012/07/17(火) 15:16:40.35ID:???0869nobodyさん
2012/07/18(水) 09:22:42.54ID:???PHPってそういうもんだろ
0870nobodyさん
2012/07/18(水) 12:20:26.18ID:???セッション利用でOK。
0872nobodyさん
2012/07/22(日) 10:45:56.54ID:???PHPなど愚の骨頂
0873nobodyさん
2012/07/27(金) 20:37:24.49ID:???0874nobodyさん
2012/07/28(土) 00:10:09.70ID:???0876nobodyさん
2012/07/31(火) 11:18:22.44ID:???今はLOOP、すなわち論理オブジェクト指向プログラミングの時代
0877nobodyさん
2012/07/31(火) 12:11:56.61ID:???0878nobodyさん
2012/08/05(日) 00:31:48.84ID:???秀丸でちょちょいとやるのがオツってもんだ
0879nobodyさん
2012/09/27(木) 03:31:54.43ID:yKCGiKEV>実際トレイトって、あれば便利な気はするけどどこで使うのか思いつかん。
>だれか使いこなせてるって人いますか?
traitは scala から持ってきた仕組み。
(もちろん scala も他の言語から影響を受けている)
trait とは:
- Mixin - Wikipedia http://ja.wikipedia.org/wiki/Mixin
- traitは実装を含めることができるinterface
- コードのコピペをfunctionalityにしただけ
利用シーンとしては、継承したくないけど、
ある実装を、このクラスだけでは使用したいという場合に
traitを作って、それを使います。(だから、コードのコピペと表現した↑)
AS3を書いてたときはmixinはイベント機能を追加する目的で
よく使ってた
以下PHPでの実例をどうぞ↓
0880nobodyさん
2012/09/27(木) 07:12:35.38ID:???0881nobodyさん
2012/10/06(土) 00:51:33.59ID:???0882nobodyさん
2013/03/25(月) 12:45:02.49ID:???0883nobodyさん
2013/05/28(火) 08:36:15.70ID:???約 10,600,000 件 (0.13 秒)
PHPのオブジェクト指向入門 | オブジェクト指向PHP.NET
http://www.objective-php.net/&amp;#8206;
0884nobodyさん
2013/06/21(金) 04:07:35.21ID:v9NBCNRF0885nobodyさん
2014/03/02(日) 09:39:24.54ID:???オブジェクト指向は愚かな考え。排便メソッドを実装した人間クラスから美少女クラスが作れない。
http://toro.2ch.net/test/read.cgi/tech/1393660194/88
0886nobodyさん
2014/04/05(土) 00:55:43.80ID:???■ このスレッドは過去ログ倉庫に格納されています