Webでオブジェクト指向プログラミング
サーバーサイドWebプログラミングのOOスレです。
・OOP、MVC、デザパタなどのコンセプト的な話題
・OOにまつわる言語比較(言語批判はその言語で開発してる人に失礼にあたることが多いのでなるべく禁止でお願いします)
・保守、再利用、生産性、開発環境などの実践的な話題
・Webサーバ、DBなどの外部との親和性に関する問題
・学習、教育などの方法論
などなど。
前スレ
PHPでオブジェクト指向プログラミング
http://pc8.2ch.net/test/read.cgi/php/1113724557/
>>288 PHPのオブジェクト指向を先に覚えるより、CやVBなどのプログラムを覚えたほうが
組み方は理解できるよ。短時間で >>291
スパゲッティソースの量産方法を理解できると言うこと? >>289
Pythonから始めたら、PHPもJavaも楽勝
という漏れはPascalが初体験の相手だった なんかPHPerは無条件でオブジェクト指向マンセーしてる奴が多いよな・・・
手続き型の進化系がオブジェクト指向ってわけじゃないからね
手続き型的なロジックが有効なところもあればオブジェクト指向が有効なところもある
俺が確かに言えることは、オブジェクト指向は少なくとも万能ではないってこと
だからオブジェクト指向で書かないとスパゲティになるとかわけわかんないんだよ
むしろオブジェクト指向によって作られたスパゲティの方が多いという現実さえあるのに・・・
>>294
誰も藻前の妄想なんか聞きたくないわけだが。 コードがアチコチに飛ぶって意味では、gotoも多態を使いまくったトリッキーなコードも
スパゲッティには変わりないよ。 正直、オブジェクト指向で作られたソースがさっぱり理解できないのだが・・・
もうダメなのかな俺 Javaで作られたCMS。ソースにコメント一切無し。
消えた前担当が全然ドキュメント残してないってのもあるが、Perl使いの俺にはサパーリ。
まぁ何だ、愚痴だ。スマン。 >>298 これわかる?
Webより抜粋 PHP (編集しました)
******************************************************************************
* class Shopping {
* ク var $item = "コンピュータ"; これがメンバ変数の設定
* var $price = 99800; コンピュータが99800
* ラ ************************************************************************
* function getTotal() {
* ス $tax = $this->price * 0.05;
* return $this->price + $tax; // 税込価格の設定 これがメソッドの定義
* } 消費税の設定と選択した商品に消費税を加える定義
* }
******************************************************************************
$result = new Shopping(); 上記で指定したクラスをnewステートメントを使ってオブジェクトに格納します
$item = $result->item;
print("$item の会計は".$result->getTotal()."円になります\n"); これが表示結果
******************************************************************************
>>301
そこまで親切にコメント書いてあれば流石にわかるなぁ。
っていうかphpのオブジェクト指向って変に見辛いな。 VB系のプログラム言語と識別子が逆だからめんどうだよね PHP4のオブジェクト指向が中途半端だからいけない >>305
それだから、PHPでオブジェクト指向はしない...と思っていたんだけど
最近ちょっとずつやってみている。
しかし一番最初に触った言語がPHPだったもんだから、この前
C言語を勉強しているときに「あー、やっぱPHPって気持ち悪いな」って思った。
なんか仕様がグダグダだし、10年くらいすれば忘れられそうだなとか思った。 10年後には確実に気持ちいい言語になってるのがPHPだけどな オブ脳とPHPデザパタを読んでオブジェクト指向というのを実践しようとしたけど、
ちゃんとわかってないからか、酷いスパゲッティーになる気がして途中でやめた。
中途半端なオブジェクト指向を解説してるところはないのかな。
俺の今の思考↓。
クラスのメリット
・関数を纏められるの。
・纏めた関数だけ扱う変数を作れる。
・継承のおかげで、元は残したまま拡張した纏まりを別の場所で使える
よし、オブジェクト指向で書くぞ!って書くもんじゃなくて
気づいたら知らぬ間にOOで書いてるもんだ >>310
クラスを処理関数郡的に捕らえると、クラスが肥大化したりするかもな。
どちらかというと、データに処理機能を添わせると考えた方がよさそげ。 手続き型で書かれたスクリプトをclassで囲んで、
処理を関数で小分けして、例外かましただけ、
みたいなのあるよね
継承、再利用、知るかボケみたいな
俺がまさに今やってることだけど(´・ω・`) 他の人はどうか知らんのだけど、俺個人レベルでは
再利用や拡張のためにクラスを書いたり継承したりはあんまりない。
多態性を持たせるための手段として継承させる程度かな。
PHP5時代の本は買ったことないのだけど、PHP4の時代は
継承による拡張ばかり取り上げていて、カプセル化とか多態性の
ことはあまり取り上げられてなかった希ガス。まぁPHPもデザパタが
取り上げられているので多態性については出てくるでしょうけどカプセル化は?
PEARのDB(MDB2)もFetchモードがObjectのとき、StdClassだけじゃなくて
XmlSerializerみたいにクラスを指定できたらいいなと思うのは変?
>>310にあるメリットは、結果であって目的ではないと思う、
と思えるようになった今日この頃w オブジェ糞指向はうんこだな
人類は新しいパラダイムを発明してくてる天才を必要としている PHPでは、結局、カプセル化、抽象化できる部分をクラスにして、
手続き型の部分から呼び出す方法に落ち着いた
MVCでいうと
Mをクラスで、Cを手続き型で、Vをテンプレートエンジンでやるというのが
わかりやすくてよいと思った。
ポリモーフィズムって、PHPで実現するのが面倒だと思うけど、どう? >>314
>継承による拡張ばかり取り上げていて、カプセル化とか多態性の
>ことはあまり取り上げられてなかった希ガス。
そもそも4はメンバメソッド全てがパブリックなんで、
カプセル化の概念自体皆無。
説明しようにも、カプセル化の機能自体が無いので不可能。 >>319
言いたいことはわかるけど、概念自体皆無とか不可能ってのは言い過ぎじゃね?
そもそもオブジェクト指向ってオブジェクト単位で独立した存在にするだろ。
だから、カプセル化=独立 であって カプセル化=隠蔽 ではないと思う。
PEARもPrivateメソッドやフィールドは先頭にアンダーバー(_)をつけるなど、
コーディング規約で決めてるわけだし。
もちろん、規約であって言語仕様じゃないから、
簡単にアクセスできて崩壊してしまうがの。 カキコ後に読み直して
> カプセル化=隠蔽 ではない
は言い過ぎだったかな。
オブジェクトを独立させる為にカプセル化を行う。
隠蔽はカプセル化を厳密に行う手段(手法)ってことでどぉ。 >>320
そんな規約定めてるPEAR自身、アンダーバーがついてるプライベートであるはずのメンバに
パブリックアクセスしてる件について >>321
4の解説書なんだから、コーディング規約のことまでいちいち面倒見る必要無いだろ。
概念として説明してもかえって紛らわしいだけ。
だからPHP5が生まれたわけで。 >>317
PHPのような型無し言語はポリモーフィズムだらけです。 >>324
型なしといわずに「動的型」といってあげて >>327
それおもしろそうだな。
symfonyのsfMixer使ってやれば、
意外とそれなりにつかえるもんになりそう。
まぁ、ぐちゃぐちゃになりそうな気もしなくも無いけど… type hintingでstringとかintも使えるようにすりゃいいのにな
そんなに難しくもなさそうだし phpのtype hintingはでstringとかintも使えるようにって話は時々話題になるけど、もし導入するとしたら、
function hoge(string s) {・・・
っていう定義の関数をhoge(12);で呼び出した場合、エラーにすべき?例外投げるべき?暗黙的にキャストすべき? わざわざtype hintingに記述する=厳格な型を要求してる
と考えられるから
事前にstringにキャストされてたらok
int等ならfatal errorじゃない? オブジェクト指向よくわからんから
とりあえずpearのDB呼んでみる。 >>322
stringとintの違いを意識しなくてもコードを書けるのが、ほとんど唯一のPHPの利点なのに・・・ 例えば掲示板投稿処理で
入力処理
画像処理
ログ処理
表示処理
とかにクラスが分かれている場合、それぞれでオブジェクトを作成するの? オブジェクト指向っていうものは聞いて覚えるもんじゃない。
体で感じるんだ。 2ch型掲示板を作る時はオブジェクト指向でやったなあ 「PHPによるデザインパターン入門」を始めてみた。
いきなりTemplate Method ではまった。
本の通りに打ち込んでるのに、クライアント呼んでも
画面が空白のままだ。
試しにクライアントの中で文字列出力をしてみると、
スクリプトの先頭では出力できるけど、require_once
以降ではechoしても出力できない。
var_dumpでnewしたオブジェクトを表示させようとしても
空白だ。
何だこの現象は。 ちなみに、読むだけなら5章まで進んでるけど、オブジェクト指向を
軽いノリで始めるにはPHP5は結構いい感じに思えた。 >>343
エラーメッセージは表示される設定になってるのか?
ダウンロードしたソースを実行してるのか
自分で打ち込んで実行してるのか? 出来るならワンタッチで、しかも「情報起業」に特化した
ホームページ作成ソフトがあったらいいのに・・・。
もし、プロ並みにキレイなホームページが作成が出来たとしたら、
情報商材で一旗あげようと思っているあなたの人生は変りますか?
【早くも成功者続出!】起業サイトビルダー
http://www.infotop.jp/click.php?aid=16484&iid=5683 >>345
環境はPHP5.2.1 Apache2.0.59 WindpowsXP です。
error_reportingは E_ALL | E_STRICT っす。
だけど、HTML吐かれてるんだよね。で、そのHTMLソース見ると、
スクリプトに指定もしてないDOCTYPE宣言とか、METAタグとか、
空のBODYタグとか入るんだけど、これどういうときなるんだろ?
ちなみに、頭に叩きこうもと思って自分で打ち込んだやつ。
ダウンロードしたやつは動いた。違いといえば、require_once
のところを別の<?php ?>ブロックにしてないところだけど・・・。 おそらくどっかでHTMLモードに入ってる
?>の後に空白とか入ってないか確かめてみ ダンプ吐いて、地道に変数をトレースしか無いんじゃね。
ちなみに echoじゃなくて、var_dump()の方 >>348
?>の後の空白はなかったです。
ほかにもHTMLモードに移行するような箇所はなし。
もっかい見てみますけど・・・。
>>349
echoもvar_dumpも出力してくれません。どうやっても、
DOCTYPE宣言、METAタグ、要素が空のBODYタグが出力され、
結果、真っ白な画面に。
しかし、こんな簡単なスクリプトで・・・。
php.iniの問題でしょうか?phpinfo()は動いてますが。
オブジェクト指向と関係ない話で申し訳ない。 PHPスクリプトファイルの文字コードは何で保存しているの?
UTF-8で保存しているなら、BOM無しのUTF-8Nで保存し直したら、空白が直るかもしれないよ。
UTF-8とUTF-8Nの違い=BOMについてはGoogleで検索して! 折れもBOMには、ハマったよな
フリーのエディタの中には、デフォでBOMを付加する設定になっていたりする...
UTF-8のBOM付きでは、PHPは動かなかった! >>352
--enable-zend-multibyteでコンパイルしたPHPならBOMありでも大丈夫だよ OOPで実装する時はJAVAとか統合環境がしっかりしてるほうが
分業の切り分けもしやすいと最近思った。
クラスが2、3個とか済む軽いのはPHPでさくっと実装するけど。
要件で言語指定がないとき、みんなの言語の選定基準って何? ウンコでも小便でも、
サクサク開発できるPHPは良い 私書箱システム(webでログインしてメッセージが読めるシステム)で、
・ユーザーAがユーザーBにメッセージを送る
・ユーザーBにメッセージ到着メールを送る
・システム管理人にメッセージ到着メールを送る
このとき、私書箱メッセージもメール形式でmail classから処理できるようにするとして、
mailオブジェクトを3つ作って処理って普通ですか? 3つオブジェクト作ってもいいし、オブジェクト1つで宛先とか送信内容をタスクに合わせてその都度変更してから送信で良くないか?
どっちを採用してもおかしくないよ。 >>359
まずその仕様をオブジェクト指向にしたい理由を言って下さい
メリット・デメリットなど
その後にその仕様の目的にあったクラス構成を議論したいです オブジェクト指向にあったロジックと
そうでないロジックが存在する しかし何でPHP5は寸前のところでnamespaceをなくしてしまったのか。
クラス名をアンダーバーで繋げるという回避策は悲しすぎる。
唯一悔やまれる点だわ。 クラス名をアンダーバーで繋げれば、
問題が解決するからじゃね? 遅延静的束縛がPHP5.3.0以降じゃないと使えないのが萎える。
あれがあればいろんなものをStaticなまま呼び出せるのにー。 厨でスマソ
それってクラス名得る以外に使い道あるの? staticってか、 オブジェクト指向でいこうよ と厨房がいってみる。 オブジェクト指向でつくったモジュールのなかにクラスが参照するサブルーチンを
書くのって、やはり負けですかね。なにがなんでもクラスとして記述した方がいい
でしょうか? >>368
クラスで書かないと便利わるくね?
悪くなければ、便利がいいように書けばいいのでは? >>368
クラスが参照するサブルーチンて書いてあるけど、ちょっと意味かわからない >>368 369
ええっとですね、hoge.pmないに、コンストラクタとクラスを書くのが
オブジェクト指向でのモジュールですが、その中のいくつかのクラスが
使い回せるサブルーチン(例えば、変数が英数かチェックするサブルーチン)
を書いておく、という感じです。
そうするといくつかのクラスの中で英数チェックを共通かできるので。
ただ、英数チェックなどそういうチェック部分だけをオブジェクト指向
モジュール化してという方法もありますが、いまいち、決めかねています。
一般的にはどういう感じでやっているのかなぁとアドバイスを求めた次第です。
ええっともっと簡単にいうと、hoge.pm(オブジェクト指向モジュール)の
中にある特定のクラスが処理として行なう共通な部分(たとえば英数半角チェック)
を抜き出して、それをサブルーチンとしてhoge.pmの中に記述して、クラスが
使うようにする(メインプログラムcgiが直接利用するのではない)、という
のは、手法としてはどうですか?
という意味です。オブジェクト指向でつくられたモジュール内のサブルーチンは
簡単にいってクラスとして書くけど、単なる英数半角チェックルーチンをサブルーチン
化した場合はそれはクラスというよりやっぱり単なるサブルーチンでしかない
ですよね?
いや、その半角英数チェックのサブルーチン内で処理後の変数をあらたに定義
すればその半角英数チェックのルーチンはクラスとしていってもいいとおもいますが。
なんかしらんけど、FormValidator::Simple とかつかえばよくね。 あなたもアダルト動画サイトを運営しませんか?
動画検索ロボットが毎日動画を自動収集!!
アクセスアップ間違いなし。
もちろん海外のサーバーなので違法性も一切ありません。
完全無料!!いくらでも動画サイトを作成できます。
http://sxv.xgun.tv
▼mixiのトピックです。
http://mixi.jp/view_bbs.pl?id=33336111&comment_count=0&comm_id=326589
▼自分のmixiです。
http://mixi.jp/show_friend.pl?id=15652823 オブジェクト指向って一言でいうとなんなんですかって後輩に聞かれた。
おま、一言でいえるかっての! >>376
オブジェクト指向が一言で表したものだから、って言えば良いよ。 Trapezoidクラス
upper 上底
lower 下底
height 高さ
それぞれのアクセッサ
コンストラクタで初期値を設定
面積を求めるメソッド calcArea()
現在のフィールド値を画面に表示するshow() メソッド
誰かおしえてください なんかOOPでやると、
日ごとにincludeするファイルが増えていくような気がする
昔はファイル一枚あればいいだったのに
ってか、はっぱ隊とかウンナンとか10年ぶりぐらいに思い出したような PHPで学ぶデザパタとかいう本はいいものなの?
アマゾンンの読者レビューでは褒められてたけど。 オブジェクト指向初心者。
継承と多態の意味くらいが分かる。 >>379こゆこと?
class Trapezoid
{
private upper ;
private lower ;
private height ;
function __construct( $u , $l , $h ) {
$this->upper = $u ;
$this->lower=$l;
$this->height=$h;
}
略
}
>>388
うむ。やはり宿題か。だったら
面積求める抽象クラス
と
継承して作った四角や三角
っていうのが本当に伝えたかったことじゃないだろかなんて思った。
MVCに関する質問です。
利用者ごとにログインし、見た目をカスタマイズ出来るような仕組みを考えています。
で、ログイン状態やユーザー情報というのはModelに相当すると思うんですが、
見た目の情報はModelには入りませんよね。
そもそもViewの情報はどこで管理すべきなのか。
Viewで良いのか。だとして、ユーザー情報との同期はどうとれば良いのか。
分からないところだらけですが、よろしくお願いします。