1 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:35:52 ID:???] PHPを使ってプログラミングするとき、 プロシージャ指向(手続き型、構造化プログラミング)でもできますが、 オブジェクト指向を使った場合の恩恵を享受するために、 PHPでオブジェクト指向プログラミングの勉強をしてみましょう。 <目的> PHP5でオブジェクト指向プログラミングを行なうための知識を習得する。 (PHP4のOOPもOK、このスレが1000に行く前にPHP6が出たらPHP6のOOPもOK) <方向性> ・このスレは、プログラミング初心者、PHP初心者の勉強の場として利用することを前提にします。 ・PHPのOOPの話題に限定します。 (Ruby、Python、Javaなど他言語のOOPについては、その言語のスレッドでお願いします。) ・PHPのOOP学習に役立つ本、WEBサイトの紹介をお願いします。 <その他> ・略記は、「OO」=「オブジェクト指向」、「OOP」=「オブジェクト指向プログラミング」でお願いします。 ・質問をする人はなるべくトリップを付けましょう。 ・荒らし、煽り、叩き、気違いは無視・無干渉でお願いします。 このスレで、今日から貴方もOOP!!!\(^o^)/
25 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:53:26 ID:???] MySQL5.0で、phpMyAdminを使って、oop_testというデータベースを1個新設しました。 その中にテーブルを1個作りました。 CREATE TABLE `message` ( `message_id` int(11) NOT NULL, `name` text, `title` text, `message` text, `create_date` datetime default NULL, PRIMARY KEY (`message_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 日付はとりあえずdatetime型にしておきました。 MySQL4.0を使っている人は、上記のSQL文から「DEFAULT CHARSET=utf8」という句を削らないとエラーになると思います。
26 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 17:00:26 ID:???] 画面は、>>23 の(1)〜(3)の3画面を用意すればOKかな? 画面(ハリボテ)を先に作ってみて、それにプログラムを付けて動くようにしてみます。 (1)入力ページ input.php (2)一覧ページ list.php (3)詳細ページ message.php itpro.nikkeibp.co.jp/article/COLUMN/20070214/261859/ 「HTML画面をそのまま仕様書に」,5カ月で1000画面を構築した就職サイトPuffの高速開発手法
27 名前:nobodyさん mailto:sage [2007/02/24(土) 18:52:22 ID:???] wktk
28 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 20:07:40 ID:???] >>25 主キーをオートインクリメント(連番の)の設定にしておくのを忘れてました。orz CREATE TABLE `message` ( `message_id` int(11) NOT NULL auto_increment, `name` text, `title` text, `message` text, `create_date` datetime default NULL, PRIMARY KEY (`message_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
29 名前:nobodyさん mailto:sage [2007/02/25(日) 02:57:19 ID:???] サンプルページ公開して
30 名前:2 mailto:sage [2007/02/25(日) 16:11:09 ID:???] 定番のhelloを表示w class hello { var $aisatu = "こんにちは"; } $re = new hello(); $aisatu = $re->aisatu; echo $aisatu; 読み図ら買ったら適当に改行して
31 名前:2 mailto:sage [2007/02/25(日) 16:19:08 ID:???] #オブジェクト学校のhelloクラスを作る class hello { #このクラスに生徒である$aisatu君がいる #彼に「こんにちは」という言葉を覚えさせる var $aisatu = "こんにちは"; #放課後なので括弧で閉じる } #クラスの風景を覗くための魔法 $re = new hello(); #生徒$aisatu君に「こんにちは」を言わせるための魔法を矢で飛ばす。 #魔法で生徒$aisatu君の$は壊れてしまい、以下のような記述になる。。 $aisatu = $re->aisatu; #魔法にかかった生徒挨拶君をおまえらのディスプレイに召還する。 echo $aisatu;
32 名前:nobodyさん mailto:sage [2007/02/26(月) 16:35:48 ID:???] コードの解説なんてしなくても見ればわかる。 「なぜOOP」か、だとか、 こういう場合にOOPが役立つ、というのを具体的なコードで示してくれ
33 名前:nobodyさん mailto:sage [2007/02/26(月) 18:41:14 ID:???] namespace は結局 PHP5 では実装されなかったんだね・・・・ 悲しい。悲しすぎる。
34 名前:nobodyさん mailto:sage [2007/02/26(月) 23:07:07 ID:???] MVCのMをOOPでCは手続きVはテンプレート
35 名前:1 ◆SWtzLesEmM mailto:age [2007/02/27(火) 15:21:07 ID:???] >>22 (1)最初はOOPを使わないで掲示板を作ってみる OOPを使わないで作った簡単な掲示板をアップしてみます。 >>26 ファイルは、他に掲示板のトップページと、DB接続関係のデータを入れたファイルを用意しました。 WEBサーバのルート直下にデプロイした場合を想定しています。 /index.html 掲示板のトップページ /db.php データベースの接続関係のデータのファイル /input.php メッセージ入力ページ /list.php メッセージ一覧ページ /message.php メッセージ詳細ページ
36 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:22:07 ID:???] index.htmlの内容は以下の通りです。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>掲示板メニュー</title> </head> <body> <h1>掲示板メニュー</h1> <div id="menu"> <ul> <li><a href="input.php">メッセージ入力</a></li> <li><a href="list.php">メッセージ一覧</a></li> </ul> </div> </body> </html>
37 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:24:34 ID:???] db.phpの内容は以下の通りです。 <?php /** * データベース */ //本番環境ドメイン名 define("DOMAIN", "xrea.com");//ドメイン名に含まれる文字列を指定 //MySQL設定(本番環境とテスト環境で切替え) if (ereg(DOMAIN, $_SERVER['SERVER_NAME'])) { //本番環境 define("DBSERVER", "localhost"); define("DBUSER" , "username"); define("DBPASSWORD", "password"); define("DBNAME", "oop_test"); } else { //テスト環境 define("DBSERVER", "localhost"); define("DBUSER" , "test_username"); define("DBPASSWORD", "test_password"); define("DBNAME", "oop_test"); } (以下、続く)
38 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:25:32 ID:???] db.phpの続きです。 //MySQL接続関数 function db_connect() { // MySQL 接続 $link = mysql_connect(DBSERVER, DBUSER, DBPASSWORD); if (!$link) { die('mysql_connect ERROR: ' . mysql_error()); } // MySQL DB 選択 $db_selected = mysql_select_db(DBNAME, $link); if (!$db_selected) { die ('mysql_select_db ERROR: ' . mysql_error()); } // MySQL 4.1以上 文字コードセット mysql_query('SET CHARACTER SET utf8'); return $db_selected; }
39 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:26:17 ID:???] db.phpの続き(その2)です。 //MySQLプリペアードステートメント関数(SQLインジェクション対策) //(参考)www.php.net/manual/ja/function.mysql-query.php#70686 function mysql_prepare($query, $phs = array()) { $phs = array_map(create_function('$ph', 'return "\'".mysql_real_escape_string($ph)."\'";'), $phs); $curpos = 0; $curph = count($phs)-1; for ($i = strlen($query) - 1; $i > 0; $i--) { if ($query[$i] !== '?') { continue; } if ($curph < 0 || !isset($phs[$curph])) { $query = substr_replace($query, 'NULL', $i, 1); } else { $query = substr_replace($query, $phs[$curph], $i, 1); } $curph--; } unset($curpos, $curph, $phs); return $query; } ?>
40 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:30:07 ID:???] input.phpの内容は以下の通りです。 <?php /** * メッセージ入力画面 */ require_once("db.php"); db_connect(); // $name = $_POST['name']; $title = $_POST['title']; $message = $_POST['message']; $error_msg = ""; (以下、続く)
41 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:30:59 ID:???] db.phpの続きです。 //入力値バリデート if (0 < strlen($name) && 0 < strlen($title) && 0 < strlen($message)) { //DB保存処理 $create_date = date("Y/m/d H:i:s"); $sql = "INSERT message SET name = ? , title = ? , message = ? , create_date = ? "; $phs = array($name, $title, $message, $create_date);//プレースホルダーにバインドする変数 $sql_prepare = mysql_prepare($sql, $phs); $result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error()); //ページ移動 if ($result == TRUE) { $url = "".$_SERVER[ 'HTTP_HOST']."/test2/list.php";//メッセージ一覧 header("Location: ".$url); exit; } } else { $error_msg = "名前、タイトル、メッセージをすべて入力してください。"; } ?>
42 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:34:29 ID:???] >>41 間違えました。 >db.phpの続きです。 ではなくて、 「input.phpの続きです。」 でした。(・∀・) あと、 >$url = "".$_SERVER[ 'HTTP_HOST']."/test2/list.php";//メッセージ一覧 ではなくて、 $url = "".$_SERVER[ 'HTTP_HOST']."/list.php";//メッセージ一覧 になります。 =ローカルでは、/test2というフォルダを作ってその中にいれていたので。 =本番環境では、ドキュメントルート直下を想定しているので、/test2/は不要 もう一回訂正してアップします。
43 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:40:30 ID:???] >>41 の訂正です。 input.phpの続きです。 //入力値バリデート if (0 < strlen($name) && 0 < strlen($title) && 0 < strlen($message)) { //DB保存処理 $create_date = date("Y/m/d H:i:s"); $sql = "INSERT message SET name = ? , title = ? , message = ? , create_date = ? "; $phs = array($name, $title, $message, $create_date);//プレースホルダーにバインドする変数 $sql_prepare = mysql_prepare($sql, $phs); $result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error()); //ページ移動 if ($result == TRUE) { $url = "".$_SERVER[ 'HTTP_HOST']."/list.php";//メッセージ一覧 header("Location: ".$url); exit; } } else { $error_msg = "名前、タイトル、メッセージをすべて入力してください。"; } ?> (以下、続く)
44 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:42:00 ID:???] input.phpの続き(その2)です。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>メッセージ入力</title> </head> <body> <h1>メッセージ入力</h1> <div id="menu"> <ul> <li><a href="input.php">メッセージ入力</a></li> <li><a href="list.php">メッセージ一覧</a></li> </ul> </div> <?php echo $error_msg; ?> <div id="input"> <form name="form_input" method="post" action="input.php"> <div id="name">名前<br> <input type="text" name="name" value="<?php echo htmlspecialchars($name); ?>"> </div> <div id="title">タイトル<br> <input type="text" name="title" value="<?php echo htmlspecialchars($title); ?>"> </div> <div id="message">メッセージ<br> <textarea name="message"><?php echo htmlspecialchars($message); ?></textarea> </div> <input type="submit" name="submit" value="送信"> </form> </div> </body> </html>
45 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:44:03 ID:???] list.phpの内容は以下の通りです。 <?php /** * メッセージ一覧画面 */ require_once("db.php"); db_connect(); // $page = intval($_GET['page']); $max = 10;//1ページ当たりの最大表示件数 //ページング(ページ数は1から数える) $sql = "SELECT count(*) AS total FROM message"; $result = mysql_query($sql) or die('SQL Error: ' . mysql_error()); if ($result) $row = mysql_fetch_array($result); $total = $row['total'];//全メッセージ数 $page_total = ceil($total / $max);//全ページ数 if ($page < 1) $page = 1; if ($page_total < $page) $page = $page_total; //メッセージ取得 $sql = "SELECT * FROM message ORDER BY create_date DESC LIMIT ".(($page - 1) * $max) .",".$max; $result = mysql_query($sql) or die('SQL Error: ' . mysql_error()); ?>
46 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:45:25 ID:???] list.phpの続きです。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>メッセージ一覧</title> </head> <body> <h1>メッセージ一覧</h1> <div id="menu"> <ul> <li><a href="input.php">メッセージ入力</a></li> <li><a href="list.php">メッセージ一覧</a></li> </ul> </div> <div id="paging"> <?php //ページング処理 echo "全".$total."件"; echo "(ページ".$page."目)"; for ($i = 1; $i <= $page_total; $i++) { echo "<a href='list.php?page=".$i."'>".$i."</a> "; } ?> </div>
47 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:46:10 ID:???] list.phpの続き(その2)です。 <table border="1" cellpadding="5"> <tr bgcolor="#FFFF99"> <td>タイトル</td> <td>投稿者名</td> <td>投稿日</td> </tr> <?php //メッセージ一覧 while ($rows = mysql_fetch_array($result)) { echo "<tr>"; echo "<td><a href='message.php?message_id=".htmlspecialchars($rows['message_id'])."'>".htmlspecialchars($rows['title'])."</a></td>"; echo "<td>".htmlspecialchars($rows['name'])."</td>"; echo "<td>".htmlspecialchars($rows['create_date'])."</td>"; echo "</tr>"; } ?> </table> </body> </html>
48 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:47:39 ID:???] message.phpの内容は以下の通りです。 <?php /** * メッセージ詳細画面 */ require_once("db.php"); db_connect(); // $message_id = intval($_GET['message_id']); //メッセージ取得 $sql = "SELECT * FROM message WHERE message_id = ?"; $phs = array($message_id);//プレースホルダーにバインドする変数 $sql_prepare = mysql_prepare($sql, $phs); $result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error()); if ($result) { $row = mysql_fetch_array($result); } ?>
49 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:49:23 ID:???] message.phpの続きです。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>メッセージ詳細</title> </head> <body> <h1>メッセージ詳細</h1> <div id="menu"> <ul> <li><a href="input.php">メッセージ入力</a></li> <li><a href="list.php">メッセージ一覧</a></li> </ul> </div> <table border="1" cellpadding="5"> <tr> <td bgcolor="#FFFF99">投稿者名</td> <td><?php echo htmlspecialchars($row['name']); ?></td> </tr>
50 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:50:12 ID:???] message.phpの続き(その2)です。 <tr> <td bgcolor="#FFFF99">投稿日</td> <td><?php echo htmlspecialchars($row['create_date']); ?></td> </tr> <tr> <td bgcolor="#FFFF99">タイトル</td> <td><?php echo htmlspecialchars($row['title']); ?></td> </tr> <tr> <td bgcolor="#FFFF99">メッセージ</td> <td><?php echo nl2br(htmlspecialchars($row['message'])); ?></td> </tr> </table> </body> </html>
51 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:59:41 ID:???] それでは、次行ってみよう! >>22 (2)次にOOPで同じ掲示板を作ってみる >>34 PHPコードとHTML表示を一緒にしてありますが、OOPではテンプレートシステムを使って、PHPコードとHTML表示部分を分離して、MVCにしてみたいです。 どういうクラスを作ればいいのか良く分かりません>< (1)コントローラー(+アクション)→input、list、message (2)モデル→データベース接続処理も1つのクラスにするのでしょうか? (4)ビュー→テンプレートシステムへの出力 というかんじで3個のクラスが必要でしょうか? それぞれのクラスに必要なプロパティとメソッドを何にするか? クラスを考えて、UMLでクラス図を作ってみたいです。
52 名前:nobodyさん mailto:sage [2007/02/27(火) 22:54:58 ID:???] がんばってるなあ。 おれもがんばろう。
53 名前:nobodyさん mailto:sage [2007/02/28(水) 03:12:15 ID:???] わかりにくいからWebサイトにまとめてくれ。PHP使いなんだし
54 名前:1 ◆SWtzLesEmM mailto:age [2007/02/28(水) 20:49:38 ID:???] >>53 まとめサイトを設置しました。 ttp://kameleon.s241.xrea.com/dokuwiki/doku.php
55 名前:nobodyさん mailto:sage [2007/02/28(水) 22:48:34 ID:???] 最終的にMVCな構成を目標に 少しずつリファクタリングしていけばよいと思う とりあえずDBアクセスを一箇所にまとめるモデルを作ってみるといいんじゃない ・全件取得 ・1件取得 ・1件追加 できるMessageクラスとかを作ってそこにDBアクセス(SQL)をまとめれ
56 名前:nobodyさん [2007/03/03(土) 13:53:29 ID:Ej/v+KpC] 期待上げ
57 名前:nobodyさん [2007/03/04(日) 04:17:32 ID:xhaosu8B] 期待
58 名前:nobodyさん mailto:sage [2007/03/11(日) 11:30:29 ID:???] OOP勉強したいなら、実力不足のやつが書いたガラクタ掲示板スクリプトを 読むより、有名なオープンソースのスクリプトを読めばいいじゃん。 そもそも>>1 の意味不明な独善なんかに付き合わなくてもOOPに関する情報 はいくらでも手にはいるし。
59 名前:nobodyさん mailto:sage [2007/03/11(日) 23:56:02 ID:???] ど素人に肥大したコードを読ませて理解できると思ってる思考回路がカコイイ!
60 名前:nobodyさん [2007/03/12(月) 08:27:35 ID:cm9vlrfS] >>59 ど素人はみんな、自分みたいな学習意欲も向上心もない人間だと思ってる 思考回路がカコイイ!
61 名前:nobodyさん mailto:sage [2007/03/12(月) 09:16:45 ID:???] >>60 思考回路がカコイイ!
62 名前:nobodyさん mailto:sage [2007/03/12(月) 09:57:59 ID:???] >>59-61 全員カコワルイ!! 俺はカコイイ!!
63 名前:nobodyさん mailto:sage [2007/03/12(月) 13:37:56 ID:???] >>1-62 全員カコイイ!! 俺はカコワルイ!!
64 名前:nobodyさん mailto:sage [2007/03/12(月) 14:07:03 ID:???] で、結局荒れ放題になり>>1 の独善は無事終了したのだった。 ちゃんちゃん。
65 名前:1 ◆SWtzLesEmM mailto:age [2007/05/12(土) 03:12:14 ID:???] >>55 DBにアクセスするためのクラスを作ろうと思って、とりあえずdb.phpをクラスの形に変えてみようと試みました。 だけど、コンストラクタでエラーが出てストップ! Fatal error: Cannot access empty property in /…/test.php on line 18 なんでエラーになるのか?よく分からなくて、PHP5のコンストラクタについて調査していたら、サンプルになりそうなDBクラスの解説記事がありました。 www.bnote.net/php/php/09_db_class.shtml ↑これをソックリ真似すれば、DBクラスは何とかなるかな? ところで、このbnoteというサイトのPHP解説記事には、掲示板を作ってみるサンプルがあり、参考になりそうです。 www.bnote.net/php/php_idx.shtml >PHPでフォーラムを作ろう!
66 名前:nobodyさん mailto:age [2007/05/12(土) 16:09:18 ID:???] 中傷されている>>1 だが、 普通に>>1 のおかげでだいぶいい情報が手に入った。 曖昧だったクラスがなんとか分かりそうだよ。 ありがとー PHPでわからない人は情報が足りないのかもな。 似てるJAVAで本格的なものを見てみると分かるのかも。 昔、歴史で年表同士のつながりが薄くて分かりづらかったように、 もっと詳しく高校の歴史くらいのをみれば分かりやすい。
67 名前:nobodyさん [2007/05/12(土) 23:32:04 ID:s118dfiw] なんていうか「こういうときにはこういう設計をします」っていう 具体的な情報がほしいよな 俺は車なんかプログラミングしないっての
68 名前:nobodyさん [2007/05/14(月) 00:46:15 ID:4QCW9ZwU] 最近ちょっとだけ解ってきた。 なぜOOPなのかと言えば 再利用とメンテナンス、拡張がやりやすい(やりやすく作ることが出来る)ということがすごくて、 そのためにカプセル化とポリモーフィズムがあって ポリモーフィズムを実現(保証)するために継承や、インターフェイスや抽象クラスがあるって感じなのかな? PHPによるデザインパターンは読んでみても良いと思う。 あと、ゼンドフレームワーク勉強用にZFで動くブログソフトみたいのあるから、それの仕組みと、ZFのソース(全部はきついけど関係あるところだけ) を見てみると、結構勉強になると思う。 ttp://www.itmedia.co.jp/enterprise/articles/0702/28/news028.html ttp://www.itmedia.co.jp/enterprise/articles/0703/05/news013.html ttp://www.itmedia.co.jp/enterprise/articles/0703/08/news018.html 記事がちょっと古いから最新バージョンと微妙に違うけど。 まあ、このフレームワークが良いか悪いかは別にして(まだベータだし) OOPバリバリなので、勉強になること間違いなし!
69 名前:nobodyさん mailto:sage [2007/05/15(火) 15:55:34 ID:???] しかし PHP関連の本でOOPをわかりやすく書いてあるのが 「ない!」 お勧め教えて
70 名前:nobodyさん mailto:sage [2007/05/15(火) 16:01:33 ID:???] 本なんか読むよりPEARやフレームワークのソース読んで 勉強しながら自分なりに書いていけ、金かからないしだしそれが一番の近道 気が付いたらOOPなんて空気のように有って当たり前になるもんだから
71 名前:nobodyさん mailto:sage [2007/05/15(火) 16:06:06 ID:???] わかりにくいの例として スコープ演算子(static ::)は2冊読んでもチンプンカンプン そこでぐぐる先生に聞くと homepage3.nifty.com/gomi_doji/scopen.htm PHPではないが、ナルホドナルホドと理解できる オブジェクト指向の概要も phpspot.net/php/pg%83I%83u%83W%83F%83N%83g%8Ew%8C%FCPHP.html を読むとナルホドナルホドだが、本は意味不明になる 糞った本しか読んでいないかもしれないが一応書いておく 「PHP5プログラミング エキスパート編」 //最強の意味不明 「MySQL4/PHP5によるWebデータベース構築」 //わかりやすいがODPの章になると意味不明
72 名前:nobodyさん mailto:sage [2007/05/15(火) 16:08:18 ID:???] 書きながら次第にむかつき度が増加して誤字だらけになった(怒 >>70 それ疲れる
73 名前:nobodyさん mailto:sage [2007/05/15(火) 17:01:49 ID:???] >>69 独習PHPのクラスらへんの説明は中々分かりやすいよ。 作者があまりいいとはいえんが、ファーストステップにはいい感じ。
74 名前:nobodyさん mailto:sage [2007/05/22(火) 15:14:54 ID:???] 同じ事を色々な言葉で表現するから迷うずら PHPの本読むよりJAVAの本読んだほうが理解できる罠。
75 名前:nobodyさん mailto:sage [2007/05/28(月) 14:46:00 ID:???] 自分が作るだけなら手続き型でいいけど 人の作ったライブラリ使いたいから 最低限、何が書いてあって何をしているのか読めるようになりたい
76 名前:nobodyさん mailto:sage [2007/05/29(火) 05:34:16 ID:???] 答えが出てるじゃないか。その使いたいライブラリのコードを読め
77 名前:nobodyさん [2007/06/05(火) 12:23:56 ID:/w569Zaf] OOPS
78 名前:nobodyさん mailto:age [2007/06/05(火) 19:15:58 ID:???] XOOPS
79 名前:nobodyさん [2007/06/11(月) 22:06:39 ID:2dWIuVC4] >>65 に誰もつっこまないのかよ!! DBアクセスの為のクラス書くのかw おそらくPHPインストール時に君のHDDの中にすでに入ってる訳だが… しかもあらゆるDBに同じ書式でアクセス出来るやつが…
80 名前:nobodyさん mailto:sage [2007/06/11(月) 23:45:37 ID:???] >>79 なんてやつ?
81 名前:nobodyさん mailto:sage [2007/06/12(火) 00:15:06 ID:???] PEARのソースは読まない方が身のため
82 名前:nobodyさん [2007/06/12(火) 06:55:41 ID:e4tfCBN5] 79は勘違いしてるが、彼がいいたいのはPearのDBクラスのことだろう
83 名前:nobodyさん mailto:sage [2007/06/12(火) 09:31:07 ID:???] 82が勘違いだろ。 単にPDOだろ
84 名前:1 ◆SWtzLesEmM mailto:age [2007/06/12(火) 10:24:12 ID:???] >>73 情報提供どうもありがとうございます。 独習PHPは、図書館でかりて読んでみました。 オブジェクト構文の説明は分かりやすいと思いました。 >>79 DBにアクセスするクラスも勉強のため練習で作ってみようと思いました。 その次に、O/Rマッパーの使い方を練習してみることになるでしょうか? >>82 PHP5に標準で用意されているPDOのことですね。 jp2.php.net/pdo PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。 PDO は PHP 5.1 以降にバンドルされており、PHP 5.0 では PECL 拡張モジュールとして使用可能です。 PDO は PHP 5 の新機能である オブジェクト指向機能を使用しており、それより前のバージョンの PHP では動作しません。
85 名前:nobodyさん mailto:sage [2007/06/12(火) 10:56:05 ID:???] mysqliとどっちがいい?
86 名前:nobodyさん mailto:sage [2007/06/12(火) 17:53:32 ID:???] ふとおもったんだが、>>1 はできるんじゃないのか。
87 名前:nobodyさん mailto:sage [2007/06/17(日) 01:20:06 ID:???] 被害者増やさないように書いておく。 「PHPデザインパターン入門」は買うな。 最近買った中で最低レベルの悪書。 どっかの英語ページを機械翻訳したようなトンチンカンな用語説明にまじって 何故かApacheとPHPのインストール方法だけが丁寧な日本語で書かれている。 あとはデザインパターン図が羅列してあるだけ。解説ほぼ無し。 3流大学生のコピペ論文を彷彿とさせる。 こんなの真剣に呼んでも絶対わかるようにはならない。 OOP用語の説明は何故かちゃんとしてないのに php.iniにページさかれてるけど 網羅して無くて中途半端でページ稼ぎとしか思えない。 中身薄くて有名なヤマダヨウカン本の方がマシに感じるレベル。
88 名前:nobodyさん mailto:sage [2007/06/17(日) 01:28:20 ID:???] なんか良く読むと、この本は解説の日本語が オブジェクト指向で書かれてる気がした。 多分最初にパターン名を記載した時点で、作者の頭の中では 記載されてるページを呼び出してるんだろうと思えてきた。 解説するための日本語はプロシージャ指向で書いてくれと 小一時間問い詰めたい。 この本理解するには色んな本を買って、全部理解した後じゃないと 読めない。意味ねえじゃん。
89 名前:nobodyさん mailto:sage [2007/06/17(日) 01:54:28 ID:???] 軽いフレームワークいじって使うのが一番いいオブジェクト指向の勉強だよ
90 名前:nobodyさん mailto:sage [2007/06/17(日) 14:22:50 ID:???] ウェブアプリにオブジェクト指向なんていらないよ。どうせ文字列を加工してデータベースのテーブルのカラムに並べるだけなんだから。
91 名前:nobodyさん mailto:sage [2007/06/17(日) 18:51:52 ID:???] じゃどういうときに必須なんよ
92 名前:nobodyさん mailto:sage [2007/06/24(日) 17:09:42 ID:???] オブジェクト指向と言う言葉にまどわされず、 クラスの勉強をすればいいんだよ。 単に、呼び出してるだけだから。
93 名前:nobodyさん mailto:sage [2007/06/24(日) 19:32:38 ID:???] PEARをサンプルみながら見よう見まねでインスタンス作って なんだかんだで実際動いてるんだけど何してるかイマイチ理解出来てないんだよね functionの中でインスタンス作るとその外側ではやっぱアクセスできないのかな PEARDBのインスタンスがあっちゃこっちゃに散らばっちゃって困る
94 名前:nobodyさん mailto:sage [2007/06/25(月) 12:32:57 ID:???] >>93 プロパティに入れれ
95 名前:1 ◆SWtzLesEmM mailto:age [2007/07/06(金) 14:33:24 ID:???] >>68 >拡張がやりやすい(やりやすく作ることが出来る) そうみたいですね。 www.amazon.co.jp/dp/4822281957/ 「オブジェクト指向でなぜつくるのか」 という本にも、クラスを使うメリットが同じように説明されていました。(・∀・) >>74 Javaの本だと www.amazon.co.jp/dp/4797331828/ 「やさしいJava」をすすめられました。 >>86 (σ・Д・)σプログラミング初心者ですΣ(゚Д゚*)=3 >>89 Zend Frameworkの正式版が出ましたね☆ framework.zend.com/manual/ja/ シンプルなフレームワークを検索したら、CodeIgniterというのがありました。 userguide.cilab.info/
96 名前:nobodyさん [2007/07/08(日) 18:20:46 ID:XFKJF1H9] 最近このスレが怖くて見れん俺ガイル なんでそんな成長早いんだよ・・・おかしいだろ・・・orz
97 名前:テレビできたよー [2007/07/10(火) 15:53:51 ID:ZIdzImz8] class TV { var $channel; var $state; var $singleton; function TV() { $this->channel = 1; $this->state = false; } function on() { if(!$this->state) { $this->state = true; echo "電源オン<br />"; $this->reflect(); } else { echo "既に電源はオンになっています<br />"; } } function off() { if($this->state) { $this->state = false; echo "電源オフ<br />"; } else { echo "既に電源はオフになっています<br />"; } }
98 名前:テレビできたよー [2007/07/10(火) 15:54:22 ID:ZIdzImz8] function reflect($c = null) { if($this->state) { if(!empty($c)) { $this->channel = $c; } echo $this->channel . " チャンネルを写します<br />"; } else { echo "電源が入っておりません<br />"; } } } $tv = new TV; $tv->on(); $tv->reflect(8); $tv->on(); $tv->on(); $tv->off(); $tv->off(); $tv->reflect(5); $tv->on();
99 名前:nobodyさん mailto:sage [2007/07/11(水) 10:41:20 ID:???] 例外投げるようにすれば?
100 名前:1 ◆SWtzLesEmM mailto:age [2007/07/11(水) 12:59:29 ID:???] 例外処理 www.phppro.jp/word/E4BE8BE5A496E587A6E79086 2. PHPで例外処理 www.phppro.jp/phptips/vol45/eb49e8a31e9132d98a5a7db3df4663e4 PHP5の基本 > 例外処理 www.shigeweb.jp/php/project_p/?section=php5oop&page=exception phpspot - 例外処理 phpspot.net/php/pg%97%E1%8AO%8F%88%97%9D.html PHP4ではエラー処理といえば、 if ( ($err = func()) != "" ) { die("エラーです"); } のように戻り値のチェックをしていましたが、エラーというものは、呼び出し側がエラー制御を行うのではなく、呼ばれた側で、どういうエラーがあったか、というものがあった方が自然で、呼ばれた側がエラー処理を行うため、モジュールの場合より再利用性が高くなるでしょう。 更に上記では、どういうエラーが起こってエラーが出ているのかということが想像しにくいですね。 そこで try〜catch です。 ■例外処理 www.atmarkit.co.jp/flinux/special/php5/php5d.html プログラミングにエラー処理は避けて通れない事項だ。 とはいえ、関数やメソッドからの戻り値を毎回エラーチェックするのは煩雑で面倒でもある。 その煩雑さを回避するため、文法として例外処理を持っている言語もある。 PHP5もそれに倣って、言語仕様として例外処理をサポートした。 文法的にはC++やJavaと同様に、try{ }で投げられた例外をcatch{ }で処理するという流れになる。 ↑とのことですが、汎用性のある関数やメソッドにしたい場合、エラーが発生したときの処理を書く場所は、関数やメソッドを使う方(呼び出す側)にすることもあるでしょうか? =戻り値をチェックするというのは、古いやり方なんでしょうか?
101 名前:1 ◆SWtzLesEmM mailto:age [2007/07/11(水) 13:07:20 ID:???] >>96 PHPプロのメルマガ読んで、知ったかぶりなだけですw お互いがんばりましょう☆(・∀・)
102 名前:nobodyさん mailto:sage [2007/07/11(水) 14:16:38 ID:???] いやさ,まず公式マニュアルを読む癖を付けようぜ
103 名前:nobodyさん mailto:sage [2007/07/11(水) 14:44:53 ID:???] MVCじゃないとOOPなんて意味ないですかr
104 名前:nobodyさん mailto:sage [2007/07/11(水) 17:30:14 ID:???] ( д) ...。。
105 名前:nobodyさん mailto:sage [2007/07/12(木) 02:57:31 ID:???] MVCもデザインパターンの一種じゃなかったっけ?
106 名前:nobodyさん mailto:sage [2007/07/12(木) 08:06:18 ID:???] >>100 なんかphpspotのその文はおかしいな。 エラー処理は例外を使おうがそうじゃなかろうが変わらない。 呼ばれた側はどういうエラーがあったか返す責任があるし、 呼んだ側は返ってきたエラーをチェックする責任がある。 エラーが起きた時の挙動を自分で決めれるならその場で処理すれば良いし、 そこではまだ決められないならさらに上位へreturnなりthrowすれば良い。
107 名前:nobodyさん [2007/07/14(土) 15:28:38 ID:w3CTKtks] OOPってのはアプリケーションをモノに見立てて、それを構成している部品をクラスとして定義する、ってとこまではなんとなく理解した。 例外処理?なにそれうまいの?
108 名前:nobodyさん mailto:sage [2007/07/14(土) 18:34:23 ID:???] ダンボールの味がするお
109 名前:nobodyさん mailto:sage [2007/07/14(土) 19:32:25 ID:???] おまいらオブジェクト指向に騙されてるよ。ただのデータ型に過ぎない。
110 名前:nobodyさん [2007/07/14(土) 19:46:31 ID:w3CTKtks] 今、習作としてプロフィールスクリプト(っていうのも大袈裟なぐらいショボイやつ)を書いてるんだけど、どうにも悩む。悩む。 とりあえず、 -質問と答え(Entry) --セッタ(SetQuestion,SetAnswer) --ゲッタ(GetQuestion,GetAnswer) -それらのEntryを編集したり、操作したりする(ManageEntry) --POSTされたデータにEntryの値を変更する(EditEntry) -プロフィール自体(Profiel) --質問と答えを出力(ViewProfiel) こんなクラスたちを作ったんだけどなんかおかしい気がしてならない。 とくにManageEntryのとことか。 ManageEntryでEntryオブジェクトの配列Entriesを作っといてそれをそのクラス内で操作とか?は?え? OOPムズイ、ナキタイ スレ汚しスマソ
111 名前:nobodyさん mailto:sage [2007/07/14(土) 21:29:40 ID:???] どんな物を作ってるのかよく分からないけど ぱっと見で確実に言える事は、個別のクラスが多すぎ。 半分くらい継承とメソッドの追加で済みそう。 今のままだと拡張もやり難そう。 プロフィールが"profiel"なのはつっこんだ方が良いのかな。 CakeとかSynfonyみたいな、ライブラリじゃないフレームワークを 使い込んでソース読んだら、どう設計したらよいか一気に分かるよ。
112 名前:nobodyさん [2007/07/14(土) 22:22:33 ID:w3CTKtks] 継承とメソッドの追加ってどうやるんですか><; 正直どうやったらいいのか全くわからん。 プロフィール?え?あ?あはあは。
113 名前:nobodyさん mailto:sage [2007/07/15(日) 00:13:47 ID:???] きめぇ
114 名前:nobodyさん mailto:sage [2007/07/15(日) 00:19:07 ID:???] Synfony はつっこんだ方(ry
115 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:21:49 ID:???] >>106 >呼ばれた側はどういうエラーがあったか返す責任があるし、 >呼んだ側は返ってきたエラーをチェックする責任がある。 なるほど〜(・∀・) 呼ぶ側と呼ばれた側のそれぞれでエラーの対処があれば、手堅いですね! 大変参考になりました。
116 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:29:09 ID:???] 掲示板の続きを作りました。 DBにアクセスする機能をクラスにしてみました。 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 動作サンプル kameleon.s241.xrea.com/oop/bbs2/index.php なんか、>>55 さんのアドバイスの形になってませんが…orz とりあえず、DBアクセスをクラスの形にできたので一歩前進!!!\(^o^)/
117 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:50:37 ID:???] >>110 おー、ガンバレ〜〜〜☆ >>111 (1) Entryクラス 文章を「書き込む」メソッド、「読む」メソッド、「書き換える(編集)」メソッド、「削除する」メソッドが用意されている。 (2) Entryクラスを継承して、質問用のクラスを用意 =質問のデータだけを操作できる (3) Entryクラスを継承して、答え用のクラスを用意 =答えのデータだけを操作できる というかんじになるんでしょうか? どういうまとまりでクラスにすればいいのか、そこら辺がなんかよく分からないんですよねー(ノ∀`)
118 名前:nobodyさん mailto:sage [2007/07/26(木) 10:57:58 ID:???] どうしてPDOをry
119 名前:nobodyさん mailto:sage [2007/07/27(金) 00:44:20 ID:???] おんにゃにょこの おっぱい ぷぴにぷにだにょ〜
120 名前:nobodyさん mailto:sage [2007/07/28(土) 17:35:02 ID:???] 夏だな
121 名前:nobodyさん mailto:sage [2007/07/30(月) 03:51:10 ID:???] function &foo { echo "ほげ" } こういうやつ、「リファレンスを返す」っていうんですか? これはどういう処理をしているんでしょうか? どこかで定義されているfoo()という関数に何かしているんですか?
122 名前:nobodyさん mailto:sage [2007/07/31(火) 07:40:25 ID:???] 高機能な参照関数だな
123 名前:nobodyさん [2007/08/01(水) 06:30:28 ID:abLVM2kM] >>87 買ってしまっていたよ。Iteratorまで読んだけど、 分かったような分からないような気分。 説明が少ない&下手なのは分かった。
124 名前:nobodyさん mailto:sage [2007/08/01(水) 22:18:22 ID:???] 分からない人に分かるように書いてないという意味では同意。 書いてあることを全て理解していこうとするとこんがらがってくるしね。 まぁいい頭の体操になったけど。 あんなサンプルのためのサンプルではなく、具体的な使い方と利点が書いてあるとOOP素人にも理解しやすかったかもね。
125 名前:522 [2007/08/26(日) 13:53:57 ID:QzPwO1Nh] >>117 なんかCakePHP使ってみたんだけど質問と答えを操作するクラス作って云々みたいになって結局>>110 と同じような感じになっちゃいましたとさ・・・ 「モノ」に書く機能とか読む機能持たせていーの?おしえてえろいひと><