Webでオブジェクト指向プログラミング
サーバーサイドWebプログラミングのOOスレです。 ・OOP、MVC、デザパタなどのコンセプト的な話題 ・OOにまつわる言語比較(言語批判はその言語で開発してる人に失礼にあたることが多いのでなるべく禁止でお願いします) ・保守、再利用、生産性、開発環境などの実践的な話題 ・Webサーバ、DBなどの外部との親和性に関する問題 ・学習、教育などの方法論 などなど。 前スレ PHPでオブジェクト指向プログラミング http://pc8.2ch.net/test/read.cgi/php/1113724557/ MVC はともかく、デザパタとか入るとメタ議論好きが入ってきそうだなぁ。 適宜ム板、マ板に誘導していかないと。 そうだね。 とりあえず議論がWebプログラミングに関係なくなった時点でスレ違いってことで。 前スレのスレタイと比較すると、ぱっとみJAVA関連のスレと 思ってしまう俺は古い人間なのか? webページレベルではオブジェクト思考でなくてもまぁ、苦労はしないけど、webシステムになると、データやモジュールをクラス管理しないとやってられない。この板でスレ違いって言う人間こそスレ違い。 素人趣味プログラマですが、 綺麗にOOが書けません>< プロの方のソースを拝見させてもらうと感動します>< >>10 それは別に Web に限らないからスレ違いなのでは? むしろ webprog でやらない方が有意義になると思われ >>11 ごめん、それはどれのこと? 公開されてるやつで、プロが書いたかどうか分かるものってあるの? >>11 Apahce JakartaプロジェクトやStrutsプロジェクトなど、 オープンソースソフトウェアのソースコードは公開されているから参考にしてみれば? >>14 俺様が荒れないように見張っているので大丈夫だ。安心してくれ。 >>14 議論で荒れるならいいけどね。 アホとかバカとか低脳な荒れ方はしないといいんだけど。 JavaScriptでOOって無理があるだろ 派生クラスだとprivateプロパティとして使いたい部分が共有されてしまう。 全部publicならできるのか? <?php class State{ var $user; var $pass; var $host; var $database; function State($user,$pass,$host,$database){ $this->user = $user; $this->pass = $pass; $this->host = $host; $this->database = $database; } function GetCon(){ $con = mysql_connect($this->host,$this->user,$this->pass); if($con && mysql_select_db($this->database,$con)) return $con; else return NULL; } } class TEST{ var $con; var $sql; var $data; function TEST($user,$pass,$host,$database){ $d = new State($user,$pass,$host,$database); $this->con = $d->GetCon(); } function MakeSQL(){ $this->sql = "SELECT user,host FROM user "; } function RunSQL(){ $rst = mysql_query($this->sql,$this->con); if($rst) for($i=0; $col=mysql_fetch_array($rst) ; $i++) $this->data[$i] = $col; else return NULL; return 1; } } class MAIN{ function MAIN($user,$pass,$host,$database){ $obj = new TEST($user,$pass,$host,$database); if($obj->con){ $obj->MakeSQL(); $obj->RunSQL(); $this->ShowData($obj); } else printf("error"); } function ShowData($obj){ for($i=0;$i<sizeof($obj->data);$i++) printf("%s,%s<BR>",$obj->data[$i]["user"],$obj->data[$i]["host"]); } } ?> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> </HEAD> <BODY> <?php $d = new MAIN(MySQLユーザー名,MySQLパスワード,"localhost","mysql"); ?> </BODY> </HTML> >11 PHPでやるとこんな感じ? ひねりやセキュリティーは無視したけど 概念だけならこんな感じで十分だと思う ま、アクセス権の関係で動かないかもね static $con; if ( $con === null ) { とか、やりたくならんか? >>17 なぜJavaScript? >>22 それだとインスタンスごとにコネクションを保持っていうスタンスから外れるね。 どっちかっていうと static $instance = false; if ($instance === false) { $inctance = new . . . じゃないのphp4ならだけど >>24 それってもしかしてシングルトンの話じゃ・・・? >>17 普通にプロトタイプOOできるよ アクセス制限したければprototype.js使うとか JSって名前の隠蔽が関数かブロックのローカルスコープでしかできないからOO的な隠蔽は無理だよね。 あの言語は興味としては面白いけど、OOを生かした開発向けじゃないと思うけど。 つーかサーバーサイドでJSやってる奴いるの? シラネ。 隠蔽やポリモーフィズムは他言語と変わらん。 このスレ、ネタがないね。 とりあえず思ったことを書いてみるテスト。 MVCのM(MVCフレームワークに寄りかからない場合でもビジネスロジックをつっこむ部分)の設計について。 Webの場合は細かいエンティティをModelにしてしまうとかえって見通しが悪くなるから、割と大雑把なくくりでModelにした方が設計しやすい+実装しやすい+パフォーマンス的にも良いんだよね。 でもそうすると、関数でもいいものがメソッドになっただけで、ベタ書きロジックのラッパに過ぎないような実質シングルトンがいくつもできたりして。 それってオブジェクト指向という考えから反対方向に行ってしまってる。 形だけがオブジェクト指向風になってるって感じ。 もうちょっと勉強してくるわ。 単に設計がいまいちなだけじゃね? ちゃんと考えて組めば、Mだけ客によって取り替えてウマーに出来ると思う。 まあ外向けとかで見栄えも気にするならMに加えてVも弄るから、分けずにMV+Cでもいいじゃんって発想? PHP5でオブジェクト指向プログラミングって、 仕事ではまだほとんどやってない? PHP 5 がまだなのかオブジェクト指向がまだなのか どっちを聞きたいんだろ PHP5からオブジェクト指向とったら何も残らないじゃん。 PHP5の仕様を学びながら同時にオブジェクト指向も学べるっていう 素敵本ってないですかねぇ? >>39 OOやるならJavaのがいいと思う。 実際のところPHPだけでOO理解できた奴いるの? まぁいいサンプルがあればいいんじゃないの? おれは知らないけど PHP5で__CLASS__ってやるとクラス名を取得できるけど、staticメソッド内で abstract class Hoge { static public function method() { echo "Fuga"; } } class Fuga extends Hoge {} Fuga::method(); これで"Fuga"って表示させる、みたいな。 ごめん、日本語が中途半端だった。 × これで"Fuga"って表示させる、みたいな。 ○ これで"Fuga"って表示させるにはどうしたらいいですか? あ、飽くまでecho "Fuga"っていうのを使わずに__CLASS__とかgetなんちゃらname()とかそういう類で"Fuga"を取得したいという意味です。 get_class($this)のstatic版みたいなのはないですかね? ムリ 俺もこの仕様はなんとかならんものかと思ってる 但しその例だと Fuga::method() →Fugaにない→親クラスのメソッドが呼ばれる オーバーライドされていないため実際にはHuga::method()がコール されるわけで親クラスの名前(Hoge)が表示されるのは正しい動作だと思う staticはクラスメソッド的なニュアンスだしな 下で隠蔽しなきゃそのまま晒される みなさんどうもです。 無理ですかねぇ。ちょっと頑張ってみたけどやっぱ無理でした。 abstract class Hoge { static public function method() { echo self::getMyName(); } abstract static protected function getMyName(); } class Fuga extends Hoge { static protected function getMyName() { return __CLASS__; } } Fuga::method(); staticメソッドってオーバーライドできないんですね・・・。 self::でサブクラスのメソッドが呼ばれるわけなかろ。 OO的には、staticメソッドは各クラスに固有のものだから オーバーライドという概念自体が存在しない >>38 オレ自身は半信半疑だけどスピード上がってるんでしょ? >>50 >>51 納得。そうなんですか。継承はされるのに・・・、と考えるとむつかしいですね。 まあとりあえずできました!! abstract class Hoge { static public function method() { $bt = debug_backtrace(); for ($i = 1; $i < count($bt); $i ++) if (empty($bt[$i]["type"]) or $bt[$i]["type"] != "::" or $bt[$i]["function"] != __FUNCTION__) break; echo $bt[$i - 1]["class"]; } } class Fuga extends Hoge { static public function method() { parent::method(); } } Fuga::method(); 超微妙・・・。デバッグでもなんでもないのにdebug_backtraceとか超微妙。 >>42 なんで、そういうことをしたいか?って書けば 別解がでるんじゃね? >>54 返事が遅れて申し訳ない。・・・といってもその間にレス来てないけどw 実際にはデバッグの目的でログを取るのに、staticメソッド内で呼び出したサブクラス名を__CLASS__みたいに手軽に取得できないかを探し始めたのがきっかけでした。 その意味ではdebug_backtraceを発見したのでそれで問題解決なんだけど、元の質問をしたときには確か似たような問題を見た記憶があって、もうちょっと一般的な問題のように扱えるかも・・・とでしゃばってみた限りですorz まあ時間的に少し余裕があったし、今後似たような状況(例えば可変クラスとか)も起こらないとは言えないってこともあって、色々考案してみました。 以下は一般的にはこうするのが(ベストとは言えないまでも)一番マシじゃないかなぁ〜という、ちょっとした提案 abstract class Hoge { static public function method($name = __CLASS__) { echo $name; } } class Fuga extends Hoge { static public function method($name = __CLASS__) { parent::method($name); } } Hoge::method(); Fuga::method(); サブクラスにメソッドの実装を強制できない点が痛いけど>>53 よりマシかなって程度で。 まだマニュアルを引きつつ勉強中な身なんで、つっこみとかあったらよろしくです。 Movable Typeの11行目の、 use MT::Bootstrap App => 'MT::App::CMS'; って、どういう意味ですか? 分かるエロくない人、どうかお教えください。 すみません、MT 3.2(日本語版)のmt.cgiの話です。 あと、勝手にMovable Typeがオブジェクト指向と判断してます。 Javaライクな(クラスの)パッケージ管理はPHPではでけへんの? __autoload() を使おうとするとどうしても一つのフォルダに クラス定義ファイルを全部ぶち込むことになるんだけど >>60 __autoloadの中を頑張ってつくればある意味Javaのパッケージより柔軟に色々できると思う。 今即興で考えてみたけどこんなのどう? function __autoload($class, $newdir = "") { static $dirs = array(); if ($newdir) $dirs[] = $newdir; if ($class) foreach ($dirs as $dir) { $file = "$dir/$class.class.php"; if (file_exists($file)) { require_once $file; return; } } } function add_import_dir($dir) { __autoload("", $dir); } なんか書いてて虚しくなってきたよ・・・ 自クラス内のプロパティーにも セッターゲッター介してアクセスする? あるいは自分の中のことだから 直アクセスする? Dotch? >>63 自分のクラス内なんだから直アクセスでしょ。 クラス内でもセッタゲッタしたいってことは、そのプロパティによっぽど整合性が必要なんだろうから、場合によっては必要な部分だけabstractなクラスとして抽出して問題のプロパティをprivateにする。 ってそれWebプログラミングとどういう関係があるの? なんか仕込みがあるならともかく 別段論争になるようなことじゃないと思うけど >>>64 やっぱりそっか。 さんくすこ。 >>65 そんなわけナス Ruby on Railsとかいうのがお目見えしたことだし スクリプト系はMVC的に糞ってなことにはもうならないな >>70 RoRはぶっちゃけあんまり流行る気しないんだが。 あれってMVC? PHPじゃそうかもな。rubyやperlはもうコレで決まりだと思う。 いやRuby自体がWebプログラミング方面でそれほど伸びないと思う。 Rubyの方がPHPより先に世の中に知れ渡ってたらRubyの圧勝だったかもしれないが、今更PHPと比較して生産性高いとも思えないし(飽くまでWeb方面では)。 rubyは構文が特殊すぎるし、まんまオブジェクト指向だから、phpのような流行り方をすることはそもそもありえなかったと思う。 unixハッカーな人たちにはperlやrubyが今後も支持されていくでしょう。phpは違う層の人たち向け。 ちょwww unixハッカーってなんだwww そりゃC使いry WebでOOするときってどんなクラスつくるの? MVC以外で。 オブジェクト指向言語は、OOがphp使うような素人の馬鹿避けになってる所は有るね。 phpの生産性って、素人を安い人件費で大量に使えるってだけだからねえ。 RoRは馬鹿には理解出来ないから、流行る事は無いだろう。流行るためには馬鹿でも理解出来る事が必要だし。 RoRのレベルが高いと思ってるおばかさんが一人いるぞw Lisp信者にもその考えの奴多いんだよなぁ。 ユーザのレベルなんて人それぞれだし、スレ違いでは? phpしか書けない香具師に、LispやRoRは無理。 この言いっぱなしの駄レス連発してるやつって一人でやってんの? はいはいわろすわろす って言ってほしいんだろきっと。 LispはまだしもRoRを難しいとか言う奴初めて見た。 PHPしかできない奴のレベルが低いってのはまあ当たり前の話だが。 >>57-58 すみません、エロくても大丈夫になりましたのでどなたか教えてください。。。 分かった事 MT/Bootstrap.pmが関係? あ、これはただ単にハッシュを渡しているだけなのですか?^^; >>90 まあアレだ、Ruby厨には聞いていないから帰れということらしい。 >>57-58 Bootstrap.pmでimport関数に%param{App}を渡していると思うのだがその辺調べてみてくれ。 ここで解説はイラネ。 配布スクリプトの読めない部分を解説しちゃる ttp://pc8.2ch.net/test/read.cgi/php/1094842959/l50 >>85 なんというか、馬鹿丸出しな発言だな。 そもそもRoRが使えれば、Ruby使えるわけだから、 PHPしか使えないなんてことは成り立たないわけで。 逆にRoRしか使えないやつはPHP使えないしな。 でもPHP使いよりRuby使いの方が仕事出来るのが事実。 >>94 まじ? 俺、今、Rubyを勉強しているんだけど、プロになれる? >>94 はじめからそう言えばいいのに、頭が悪いから>>85 みたいな言い方になってしまったんだね。 「○○使い」なんて言語限定してる時点でそいつは使えない RubyでWeb開発とか趣味以外でやってる人いるの? >>98 とりあえず、仕事で使われてるのをみたことがないな あと、Ruby関連は書籍がちゃんとしたのが少なくない? ってかすれ違いなんで、こういうのはマ板で PHPのthrowって例外オブジェクトがどこまでも飛んでいくから便利だね。 でもスパゲティの原因になったりしない? いったいいつcatchされるんだろう・・・?みたいな。 もしくは、ここのcatchは何のためにあるんだろう・・・?みたいな。 Javaの場合throws書かないといけないけど。 そのまま便利さを享受すべきか、全てのメソッドにthrows相当のものをコメントとして加えておくべきか、ご意見いただけると幸いですw 俺の場合は、catchした上で処理を継続できるような場合はコメントに @throws で記述しておく。 処理を続行できないような致命的な例外の類は一切キャッチしない or トップレベルですべての Exception を catch するようにしてる。 使い捨てなら気にせずthrowしまくるけど、ある程度規模が大きくなってきたら問答無用で@throws書いたほうがいい。 自作のphpフレームワークを公開して見ました。 一応MVCモデルとオブジェクト指向プログラミングに基づいて作成しています。 もしよろしかったらご覧いただければ幸いです。 http://pharon.lolipop.jp/ >>108 Webサイトが思い切りテーブルレイアウトで萎えた。 普通に見出しと本文でいいじゃん。 なんか怪しげなローマ字とか使ってるし。 詳しくは読んでないけど、まずはその素人臭さを払拭しないと 使ってみる気にもなれんね。 あちこちにマルチし過ぎだしな。 まぁ、本人とも限らないが…。 期待age。 で、 Web サイトを PHP で組もうと思ってるんだけどオブジェクト指向でやったほうがベター? まだ覚えてないけどな 。 PHPっていったら、HTMLを直に操作する軽快感が一番重要でしょ。 クラスとか使いはじめると、この足取りの軽さが激減するし、だったらJAVA使ったほうが賢いのでは。 大体WEBプログラミングでオブジェクト指向を得意げに使うこと自体が、スパゲティ大好きって言ってるようなもんだな。 >>120 「だったら Java」ってやつは最初から PHP なんか使わないか、 PHP も Java も分かってないかのどっちかだな 私も以前は PHP で OOP なんてする必要ねーよと思っていた。 特に PHP4 のクラスの実装はクソなので OOP するのも面倒だなと思っていた。 しかし、デスマってるプロジェクトに投入されて、 そのプロジェクトが index0001.php4 とか index0134.php4などと 200個くらいのファイルを羅列しているのを見たとき、 たとえ、PHP4 であろうとも OOP を導入すべきだという主張にかわったよ。 OO でなくとも、Logic と View は分けるべきだ。 できるなら、MVC でお願いします。 >>1 Javaでは当たり前なことを なぜこんなスレタイをたてるのか。 どうせならStrutsやJSF< Tapestry, Seasar2など フレームワーク関係のスレタイにしておけばよかったのに。 >>17 一応JavaScriptでprivateにできるテクニックはあるあしい。 ローカル変数を使って。Ajaxに使われている Prototypeというフレームワークもどきに使われているようだ。 かなり小汚いテクニックで読みにくいソースコードだが。 >>21 PHP4と5では違う。 publicやprivate宣言を忘れているぞ >>122 しかし、PHPは未だに名前空間が無いから PHP5からJavaライクなオブジェクト実装が サポートされても使い勝手は相変わらず悪い。 ini_get()してからini_set()するのはもうウンザリ。 __autoloadだか忘れたがこれをうまくつかって Javaのimportそっくりなことできそうにみえるが、 それも使い勝手が悪い。 >>124 なんかムリにprivateにしなくていいじゃんと思うようになるよ Perl も PHP 4 も運用でカバーしてるんだし JSの場合はJava系みたいにインスタンス変数ごとにprivateっていう考え方よりも、Cのファイルスコープstaticみたいに、ファイルごと(モジュールごと)にローカライズ(隠蔽)するのが常套手段かな。 インスタンス変数はそもそも隠蔽する対象じゃないんだな。 2.0でclassとか拡張されてるから、また変わってくると思うけど。 >>122 MVCがいまいち理解できません。 どこがいいのか k w s k ! >>120 軽快感が重要というのは同意だけど、別にそれだけがPHPのメリットじゃないわけで。 クラスだって軽く使おうと思えば使えるし、お手軽なOOPという観点ならPHP>JAVAだと思う。 その分できないこともあるけどな。 あれー。MVCスレってなかったっけ? 寝ぼけてたか? PHPのような低機能な言語でさらにクラス機能まで減らすのはバカ。 そんなことしたら、バカみたいなコードしかかけなくなる。 >>135 そういうことはクラスを実際に何に使うのかあげてから言ってくれます? >>134 ぐーぐるさん的には PHP 2,320,000,000 件 Ruby 107,000,000 件 この圧倒的な差はいったい!? PHPは変数のスコープを分けれない。それだけでもクラスを使う理由になる。 スコープは分かれてるけど、、、 名前空間がないってことか? 変数のスコープは分けれるけど、クラス名・関数名・定数名(クラス定数除く)のスコープが分けられないんだと思われ。 OOPの最大の利点は、再利用性が抜群に高いことだと思う。 自分はアクセスカウンターとか掲示板など、いろんな汎用スクリプトを作ってるんだけど 今後新しいスクリプトが簡単に作れるように、クラスモジュールを構築しながら作成してるから 開発効率がどんどんよくなってきている。 でも気づいたら2、3行の処理でも関数にしてる自分がいたり・・・するのは俺だけか >>144 でもあながち間違いじゃないが クラスとは 一緒に使われる情報(データ・関数)をその中にまとめ、別々に使われる情報を除外するためのもの です。 PHP 限定で言えば global を書かずにコードを書く ためにあると思っておいて間違いではない コードにまとまりがないうちは不便だが、まとまりが ない段階でダメだと思えばいい perlみたいにパッケージがあれば関数ライブラリだけでやってけるかも知れないが、PHPにパッケージはない。 代わりにクラスを使うしかない。 >>147 むしろなぜ分類(除外)するのか、というところにOOの本質があるのでは? >>152 PHPのクラスがパッケージの代替でしかないなら、インスタンス化は無意味ってこと? $hoge = new Hoge; $hoge->kansuu(); より Hoge::kansuu(); の方が早いもんね 継承とかPHPで使ってるの見たことない。 グローバル変数使わないだけなら定数使うとかあるし ばりばり使いますよ フレームワークなんて継承前提だし >>150 普通の関数でいいと思うならそれでいけばいいじゃんてことでしょ つかそういうスレつけてる人はこのスレ覗く必要全然ない ・関数がいい人は関数でやればいい ・クラスがいい人はクラスでやればいい ↑ここまではおk。それじゃ、 ・クラスがいい人は何のためにクラス使ってるの?しかもPHPでw ←いまここ OOP関係の本なら大概載っている 1.カプセル化 2.継承 3.ポリモフィズム の、3つが何故良いのかを説明できれば、OOPの利点が見えるんじゃないの? 詳しい人↓よろ。 いまだにクラスを何に使ってるの、なんて聞く人がいるの? 1.カプセル化 2.継承 3.ポリモフィズム ならJavaのほうが初めからそういうふうに設計された言語だけあって有利じゃないの? PHPのクラスにそういう利点て見出せないな。 >>158 本当だ… ちゃんと親クラスの関数にアクセスできる。 てっきりインスタンス時点で合成されるのかと思ってた。 PHPはもともと関数志向?的な作りだから、 OOPに最適化されているとは言いがたいんだけど、 それでもクラスは使った方が便利だよ。 >>164 みんなのためだなんて嘘書かないの。 ぼく分からないから教えてって言え。 >>169 ぼく分からないから教えて これでいいか?さあ早く教えろ。 カプセル化 【encapsulation】 読み方 : カプセルか 分野 : プログラミング > オブジェクト指向 オブジェクト指向プログラミングが持つ特徴の一つ。 データとそれを操作する手続きを一体化して「オブジェクト」として定義し、オブジェクト内の細かい仕様や構造を外部から隠蔽すること。 外部からは公開された手続きを利用することでしかデータを操作できないようにすることで、個々のオブジェクトの独立性が高まる。 カプセル化を進めることによりオブジェクト内部の仕様変更が外部に影響しなくなり、ソフトウェアの保守性や開発効率が高まり、プログラムの部分的な再利用が容易になる。 で、PHPで実用的なカプセル化ってどんなのよ? >>171 PHP(4)ではカプセル化は無理。 だから、コメント上で、 どの情報にはアクセスできてどの情報はアクセスを禁止するかを明言する必要がある。 だからPHP(4)に関して言えば、OOPによるカプセル化の利点はない。 Singleton前提のクラスは インスタンス化する必要ないってことでOK? でもコンストラクタでの初期設定ができないか… >>173 例えば >>174 のソースの中にある euc_jp_reader クラスや shift_jis_reader クラスなんかは Singleton 前提のクラスですが、 char_iterator クラスのコンストラクタの引数となるため、インスタンス化してやる必要があります。 Singleton 前提のクラスを敢えてインスタンス化する利点の一つは、 ポリモルフィズムが応用できるってことかな。 >>175 なるほど ○他の関数の引数に出来る ○その結果クラス名を指定しないメソッド呼び出しも可能になる (ポリモーフィズム) ってことだね >>174 2つ質問がある。 ・そのスクリプトの中で、Webサイトを構築する上で有用な情報はどこにあるの? ・そのスクリプトの中で、JavaやRubyに対するPHPの優位性はどこにあるの? ・そのスクリプトの中で、Webサイトを構築する上で有用な情報はどこにあるの? ごめん。意味を正しく受け取ることが出来なかったんだけど、要は 「それを使って何か実際に役に立つものが作れるのか?」 ってことで良いですか? これは自作の XML 解析モジュールに応用してます。 レンタルサーバーみたいに、外部モジュールを自由に導入できない (すなわち libxml モジュールなどが使えない)環境のために作りました。 ・そのスクリプトの中で、JavaやRubyに対するPHPの優位性はどこにあるの? 知りません。もしかしたら Java や Ruby のほうが優れているんじゃないんですか? 別に PHP が Java や Ruby より優れてなきゃいけない理由なんてないし。 1つ目の質問についてだけど、いちおうWebProg板だしWebプログラミングでオブジェクト指向っていうのがテーマなスレだから、あんまりズレないようにしないとね。 XMLの解析に使ってる点はいいんじゃない。お疲れさん。 2つ目は他の言語でなくなぜPHPなのかって話題が出てたから聞いてみただけ。 PHPしか知らないってのも理由の1つとしてはいいけど、馬鹿にされるからあまり言わないほうがいいかもね。 >>171 の続き 継承 【inheritance】 読み方 : けいしょう 別名 : インヘリタンス 分野 : プログラミング > オブジェクト指向 オブジェクト指向プログラミングにおいて、既に定義されているクラスをもとに、拡張や変更を加えた新しいクラスを定義すること。 元になるクラスを「スーパークラス」(super class)、あるいは「基底クラス」「基本クラス」(base class)などと呼び、新たに定義されたクラスを「サブクラス」(subclass)、あるいは「派生クラス」(derived class)と呼ぶ。 スーパークラスの性質はすべてサブクラスに受け継がれ、サブクラスではスーパークラスとの違いを定義するだけでよい。 複数のスーパークラスから新しいクラスを定義することを多重継承という。 で、PHPで実用的な継承ってどんなのよ? なんだこの流れ PHP のスレは大量にあるんだからどこでも使えよ 単に PHP をバカにしたいやつはもうこないでくれないか 本当に知らないのならもっと真摯に勉強しろ >>184 そう言い捨てて意味のあることを書かない(書けない?)人が多いんですよこのスレ。 >>181 >>174 で晒したソースは、 PHPでの実用的な継承 (っていうか、別に普通だけど) の例でもあると個人的に思うのですが、 これだけだと伝わりませんでしたか? この流れじゃあ 「オブジェクト指向意味ワカランから本買うけど何がいい?」 なんて厨な質問できねーYO! >>174 いや、そんな自己満コード晒してもらっても >>189 ぱっと思いつくのは 憂鬱なプログラマのためのオブジェクト指向開発講座―C++による実践的ソフトウェア構築入門とか >>188 OO分かってない奴にいきなりコードを見せても チンプンカンプンだと思う >>128 JavaやC++のように大規模開発でも使う場面が 多い言語ではprivateは重宝するよ。 なにせprivateをうまく使うとデバッグがしやすいしバグもとりやすく テストもしやすくソースコードの信頼性も上がる。 >>137 PHP使えるレンタル鯖が多いからだろ。 Ruby使える鯖は少ないし Rubyというだけで日本人が作った言語だから ショボイと思われがてで不キュしていなかったと思われる。 >>156 おれはよく継承を使いまくってる。 将来拡張する予定があるものは かならず(空でもいいので)スーパークラスを作って 継承してつかっている。 継承は使い方を間違えたり勘違いしている人間が使うと 継承=拡張そのものだと 誤解してだたやみくもに継承しまくることがあるので、 継承を使いこなしたければ デザインパターンについてよく勉強した方が良い。 >>160 > ・関数がいい人は関数でやればいい > ・クラスがいい人はクラスでやればいい > ↑ここまではおk。それじゃ、 > ・クラスがいい人は何のためにクラス使ってるの?しかもPHPでw ←いまここ 大規模化する可能性のあるソフトをPHPで作るとき。 顧客がPHPを使えと言ってきたら PHPを使わざるを得ない。けれどもオブジェクト指向を 使わないで開発すると一体どんなとんでもない目に あうのか散々味わってきたので 漏れはかならずオブジェクト指向でPHPコードを書く。 継承 = inheritance 拡張 = extends なんだよな・・・・ >>163 それに関してはPHPでもJavaでも同じように実現できている。 PHPで問題なのは名前空間と型安全性問題。 メソッド引数に型指定もクラスしか使えないこと。 integer型やstring型などをメソッド引数に指定できないのが 今のPHP5の難点。Javaでいえば引数の型をObjectにしているようなものだ。 Perlでも同様だが。 >>171 PHP5はどうみてもJavaのパクリとしか 思えないほど十分にオブジェクト指向できるような 言語となった。問題なのは上でも述べているとおり 名前空間と型指定の曖昧さ、ほかに戻り値の型を指定できないことだね。 >>199 PHP6もgoto付けるとか言ってないで そのへん整備すりゃいいのにな >>174-175 そんなに汚くないコードだけど ちょっと抵抗があるソースコードだな。 クラス名が全部小文字で 名前空間の替わりの役割を果たしているわけでもないのに 区切り文字に_(アンダースコア)つかうという 表記を未だに使っているとは・・・・。 やっまりキャメルケース(CamelCase)がわかりやすいと思うのだが。 それから一ファイルにつき一クラスにしておくのがベスト。 一つのファイルに複数のクラスを入れておくことはお勧めしない。 ファイル名とクラス名も一致させておく。名前空間が使えないので そこだけ例外的にクラスだけ名に_(アンダースコア)を使う。 詳しくはPEARライブラリのソースコードを見てみてくれ。 それから文字コードがEUCだとは。 Unicode(UTF-8)で統一してくれれば DBとのやりとりも楽なのだが。 >>188 悪いがあなたが書いたソースコードが実用的な例だとは とても思えない・・・・。 あのコードがPHPで有ろうとJavaに置き換えようと実用的になるとは とても思えない。 >>190 オブ脳 オブジェクト脳のつくりかた で良いんでないかな? >>198 PHPやJavaではextendsで継承しているともいうし拡張するともいう。 しかしクラスそのものを拡張しているだけであって それによってそれだけで簡単にソフトウェアの拡張性が高まるとは限らない。 という落とし穴に気をつけないといけない。 その辺りを素早く理解するにはデザインパターンを学ぶことをお勧めする。 この本は初心者には非常にわかりやすいので かなりお勧め。 増補改訂版Java言語で学ぶデザインパターン入門 http://www.hyuki.com/dp/ >>201 gotoか。Javaみたいに例外処理限定や ラベル付きbreak, continue文だけにgoto同様の機能を 限定的に持たせるだけにしてくれればいいのだが・・・・。 C#みたいにJavaのラベル付きbreakやcontinueをgotoキーワードで 実装すると言うだけのレベルだろうか? 188はTemplateMethodの実例を見せたかったんだろ 俺は悪いコードだとは思わないが >>205 結城本はガチだな ただOOPはじめたばかりの人がいきなり分かるほど 簡単だとも思わないが… 何でいまどきgotoなんだろ。 俺的には無限再帰を可能にしてwhileとforみたいなダサいもんも排除した 関数言語にして欲しいと前から思っているんだけどそんな人いませんか。 PHPで継承はあんまり必要ないな。 使い道がないから。 ウェブでオブジェクト指向するなら、JavaScriptが一番使いどころが多い。 >>193 そりゃあれば使うよ ないものねだりしてもしゃーないでしょってこと finalとabstractとinterfaceが とりあえずどんなものかは わかったけど実際にどうやって それを有効利用できればいいか わからない香具師に結城本はおすすめだと思う。 >>211 > ウェブでオブジェクト指向するなら、JavaScriptが一番使いどころが多い。 まてまてw それはJavaの間違いではw >>212 privateの利点が解らない香具師はあっても使わない。 デフォルトがprivateだったらすげー便利だったのになぁ。 Javaだったらデフォルトでpackage privateになるのにな。 publicと明示的につけないとパッケージ外部からアクセスできなくなる ってことが名前空間がないPHPではできないから デザインパターンの実装も中途半端になる。 >>215 そんなやつの話を持ち出されても知らない ダメコーダに強制できないとかいう話ならご愁傷さま としか言いようがないですな >>213 俺も最初そのへん「これ必要か?」と思ったな 他の人(近未来の自分含む)に対しての「使われ方の説明」を ソースの中に機能的として組み込むものだとわかって 得心した。 PHP6のgotoは、gotoというキーワードが実装される訳ではなくて、 for () { if () { break foo; } print "bar\n"; foo: print "baz\n"; } こんな感じに書けるようになるもの。 >>199 ,200 型安全性ならis_arrayとかis_stringとかinstanceofでチェックすればいいだけじゃないの? それはそうだが 何が求められているのかを知るために 中身まで見ないといけないのはあまりよろしくないだろう。 動的型付け言語であるPHPで、型を指定したいってのがそもそも可笑しな話なんだよな。 それでもタイプヒンティングみたいにオブジェクトの型を動的にチェックしてくれるようにする構文はいいアイデアだと思った。 Javaでいう変数の静的な型指定(つーかC/C++からだけど)と構文を似せたってのも良い。 JavaScript2.0なんかもそういう方向に行ってるね。 >>199 > integer型やstring型などをメソッド引数に指定できないのが たぶんだけど、統一性の問題があるからだと思う。 例えば引数にintを指定したメソッドがあったとして、呼び出すときにstringを渡したからってエラーにすべきではないでしょ。 その辺の仕様がうまくいかないんじゃないかな。 >>220 普通にJavaのパクリじゃないか。 Java自体もCあたりからパクッタ者だが >>222 以前もどこかのスレで議論があったが。 それだけでは以下の問題を解決できない。 $number = 9; $value = 1; $x = $number + value *2; $y = $x * $x + 4 * $number; $number = 1000; $z = $x / ($y + $number); とした適当なコードがあったとき、 あとから $x = $number + value *2; の部分を $x = $nunber + value *2; と書きかえても $numberと$nunberとの違いの に気づかない。 そして路頭に迷ったあげくにデバッグに無駄に時間をかけることになって 開発速度が衰える。 >>225 Javaみたいにラッパークラスを作ってしまえばいいかもしれんな。 final class Integer extends Number { $private $value; __construct($value){ if($valueがint型であれば){ $this->value = $value; } else { throw new NumberFormatException("整数以外入力するんじゃねえぞこのバカ野郎氏ね!"); } } } privateに$が余分についていた。 あとは適度に必要な変換メソッドを追加しておくべし。 intValue()とか >>228 お、いい方法じゃん!って一瞬思ったけど、 function method(Integer $param) を呼び出すときmethod(10)って書けないし>< >>227 えーっと、それは型安全性の問題なの・・・? >>227 コンポーネントに対する入力値と戻り値をちゃんとチェックするような ユニットテストを書いとけばいいんじゃないの? >>230 ひとこと「それだとAUTO-BOXINGが欲しくなるな」と言えばいいのにw >>233 つ 「それだとAUTO-BOXINGが欲しくなるな」 満足戴けたかな? PHPみたいな型なし言語なら、Javaみたいなプリミティブ型とそのラッパークラスのオートボクシング/アンボクシングだけでなく、もう少し汎用的な自動型変換が欲しいところだな。 function method(int $x) {} を method("100"); っていうふうに呼び出したならintにキャストするくらいの自動化はあってもいいと思う。 (今あるPHPのタイプヒンティングだと、型が違うとエラーっていう設計だから) もともとPHPは変数の実行時における型が文字列か整数かを意識しなくても適宜変換してくれるように設計された言語なわけだし。 >>234 type hintingのメリットが台無しじゃね? >>234 それなら、 function method($x) { $x = (int) $x; } でいいんじゃないの? >>232 型宣言しておけばミスに即座に気が付く、 のだけれどあれだと気づかない。 >>235 メリットって? >>236 間違えて配列やオブジェクトを渡したときに自動的にエラーを出してくれるかもしれない。 もちろんis_intで確認してエラー出せば同じことだから絶対なければならないっていう必然性はないけど、あったら便利かとは思う。 あとタイプヒンティングでintやstringなどの基本型だけは指定できないっていう今の状況より統一感あるかと。 オートボクシングや構文糖と考え方は一緒ね。 PHPでそんなことするくらいなら、素直にJava使うわ。 普通のclassと、 abstractなclass, interfaceは、 クラス名から変えた方がいいんかな? どうやってる? >>241 俺はabstractもinterfaceも普通の名前にしてる。 abstractやinterfaceをある特定クラスの仕様だけ抽象したことを表現したい場合に限り「Abstract〜」とか「〜Interface」にするかも。 例外だったら「〜Exception」てつけるけど。 >>241-242 というか、C#やC++みたいに継承も実装もおなじ::をつかっているわけではなく PHPはjavaのようにちゃんと継承はextends、インターフェース実装はimplements を使うように指定されているから 名前を見ただけでインターフェースかクラスかわかるようにまでしなくてもええと思う。 IDE使えば名前指定しなくてもさらに一目でわかるし。PHPのIDEはよくわかんないけど >>242-243 レスさんくす あんまり考えすぎなくてもいっか 質問です。 ビジネスロジックとドメインロジックとアプリケーションロジックは、プレゼンテーションロジックと対比的な位置づけですが、基本的に同じものですか? >>245 使用する分析・設計手法によって、使われる用語とその定義は違ってきます。 こういうインフォーマルな場では、それぞれが別の立場・定義で勝手に用語を使う ことが多く、基本的な認識がすれ違ったまま不毛なレスが飛び交うのが常です。 まずは専門書で系統立った知識を得てから、自分なりの経験と知見を積んでいけば その類のどーでもいい疑問は解決すると思われます。 プロパティをtrue/falseにするメソッド名ってそれぞれどんな命名にする? >>247 setTrue、setFalse setOn、setOff >>247 どんなクラスのプロパティを作るかがわかれば 自ずとそれに見合った名前がわかると思うんだが。 どうしても名前がわからないときは>>248 のようになるが。 そのプロパティがオセロの駒であれば、 setWhite(), setBlack() みたいな名前にするだろうし。 もしくはset(Color.WHITE). set(Color.BLACK)など。 表、裏を表すなら setHeads(), setTails()など 0か1なら setZero(), setOne()または>>248 のように。 あと、メソッドを複数にする必要も、メソッドに引数を 割り当てる必要もないケースであるケースもありうる。 trueだったらfalse, falseだったtrueに反転するだけのメソッド public void reverse(){ this.flagment = !this.flagment; } を定義するだけのものとか。 スレを読まずに書くけど。 俺オブジェクト指向ってよくわかんないのね。で、 PHPでさ、テーブルごとにクラス作ってその中で SQL発行してるソース見て思ったんだけど。こういう のってテーブルのJOINはどう扱ってんの? だからそれはテーブルじゃなくてデータオブジェクトです >>247 enableXXX/disableXXX >>251 railsのactiverecordとか調べてみればいい テーブル同士の関係の属性を設定して取れるようになっている でもSQLを元にデータを取得することもできるし 複雑なJOINの場合はSQL書くのが推奨 OOPを0から学ぶとすると、やはりJavaが最適なのでしょうか? Railsで有名になったRubyでもよさそうですが、 どれを勉強しようか悩みます。 どちらも実行環境を整えるのが自分にとって一苦労な気がするので、 今まで環境が作りやすいPHPに逃げていましたが、 一向にOOPの概念がわからずじまいで、 本格的にJavaかRubyを入れてやってみようと考えています。 >>255 つ ttp://smalltalk.cincom.jp/scripts/smalltalk.dll/tutorials/index.ssp オブジェクト指向プログラミングの学習が目的なら、ウェブアプリやっても無駄だと思うよ。GUIのあるデスクトップアプリ作った方がいい。 > オブジェクト指向プログラミングの学習が目的なら、ウェブアプリやっても無駄だと思うよ。GUIのあるデスクトップアプリ作った方がいい。 はいはいわろすわろす。 GUIのプログラミングで身に付くのはオブジェクト指向よりむしろイベントドリブンだよね。 >>258 ある意味>>257 は言い得てると思うぞ。 WebアプリはWebならではの都合で、本来のオブジェクト指向には反する設計を 強制される場面も少なくない。 webアプリでがちがちのオブジェクト指向やると重くならね? リクエストがあったらhtml吐き出して終わり、なタイプのwebアプリでは オブジェクト指向はあまり身につかない。 なにしろ、インスタンスの寿命が短かくて、全員が突然死するわけだから、 時間軸がそっくり抜けてるのだよ。 気にしながらライブラリを作れば、ソースの構造的な部分はある程度身につくかな、くらいだろう。 JavaでWebアプリしかやらない人は、J2EEパターンとかDIコンテナとか使って 「オブジェクト指向」と思っているんじゃないかな? 今のJavaのWebはレイヤー構造や ドメインモデル(エンティティ)とビジネスロジックを完全に分離した設計、 ステートレス・スレッドセーフ・request/sessionスコープなどが優先されて、 本来のオブジェクト指向信者から見ると、論理的にあまりきれいな設計ではない。 とは言える。 言語レベルを超えた「モデリング」(UML等は使っても良いが)を そのまま実装にまで落とすには無理がある。 要するに Java なんかつかうやつはばかですってこと? JavaでWebなんて業務外では使わないしどうでもいい。 >>266 OOPを極めたいという目的だけのために JavaでWEBをやるならバカと言えよう。 本気でオブジェクト指向やりたいならウェブでは役者不足ってこと。 OOの概念を把握したりOOの組み方を学ぶだけなら PHPでもそれなりに勉強できると思うけどな PHP5で書かれたフレームワークやライブラリのコードを眺めてみたら それOOをまったく理解できなかった俺が買ってみた どうなるか人柱になるわw 著者でググったらブログが一番上にヒットした PHPのデザパタ入門ってどうなんだろうか。 レビュー期待www >>272 その言葉を信じて眺めてるんだが、 なんかごちゃごちゃしてて返ってわかりづらい・・・ コメント英語で何書いてるかわからないし。 やっぱ俺みたいな凡人は丁寧に解説してるサイトに限るな。 一口にオブジェクト指向って言ってもメッセージ主体かクラス主体かで変わってくるからね。 C++, Java, PHP は後者。前者は Smalltalk, Objective-C, io とか。 >>276 簡単なライブラリから眺めていけばいいよPEARのDBとか OOPを一番手っ取り早く理解する方法は OOで適当な分野のライブラリを自分でコード書いてみる事 当然よく分からないうちはコードは汚い なのでPEARで同じような分野のライブラリコードを眺めて どういう構造なのかを調べてみながら自分のコードを書き直す それの繰り返しで把握していくもんだと思う いきなりデザパタの勉強とかやってもあんまり意味がない OOPを理解していく上でどういう局面で どういうパターンを使ったら良いという事がわからないから パターンってのは結局ノウハウの事だし ノウハウってのは必要に応じて生まれて出来上がっていくもんだから ノウハウ自体を先に説明されてもピンとこないはず 英語は勉強するしかないがまめに単語の意味を引くようにしておけば 文法を正確に理解してなくてもだいたい把握できるようになるはず ネットならすぐに調べられるんだからそのコストは無駄にはならない コードは万国共通だ ごちゃごちゃしてても所詮はPHPのコード、Cやアセンブリじゃない ゆっくり読んでいけばわかる 小さなライブラリでもよくできてるライブラリはたくさんある その区別がつくようになっていけば 自ずといいコードも書けるようになるだろう オブジェクト指向について語るとき、 「どのような概念か」と「どう使うのか」 を分けないで話すとひどいことになる、 ということだな。 >>278 PEARってOOPで書かれてるの? クラスからインスタンスをnewして使うってのが多いですね。 >>279 って>>273 の本の説明の仕方がごっちゃでよくないってことなんですか? 昨日本を読んでみた。 サンプルコードが載っていて分かりやすかった。 UMLの説明はさすがに他書で勉強しないと、このページ数じゃフォローできんね。 (ないよりましだけど…) デザインパターンが活用できるようになれば、OOPが楽しくなるだろうなー☆\(^o^)/ 届いたよ! 眠くてまだ読んでない ちょっと開いたけど このスレ、 サーバサイドプログラミングでのOOかよ 期待して損した・・・ >>283 クライアントサイドのOOPっていうと、JavaScriptでやるんですか? WebObjectsがフリーになるから 勉強しといたほうがいいぜ 半分くらい読んだけど、7章が無いのが残念だった そこらへんは著者さんのブログやサイトを参考に補完することにしようorz >>273 それ買って読んでみてる。 今5章の途中だけど いまいちピンと来ない。 おれがアホだからだと思う。 PHP5のマニュアル(オブジェクトとクラスの項)とJava入門書を読み始めたばかりなんだけど、 PHP5とJavaのメソッドオーバーロードって全然別物なの? >>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で良いのか。だとして、ユーザー情報との同期はどうとれば良いのか。 分からないところだらけですが、よろしくお願いします。 それは自分でも重々承知しているわけで、 だからこそ質問しているわけですが・・・ 質問できるレベルにさえ達していない。 前提知識がないから、回答する側も途方にくれてしまう。 入門書等でWEBアプリってどういう風に作るのか、大まかにつかんだ方がいいかも。 うわー オブジェクト重視っぽく書いていったらソースコードが500行余裕で超えた。 class hogeClassUnit extends dbConnectBase{ private var $name; // 以下20項目くらい public function set_name($str){ // 受け取ったデータを加工したり精査したりでこれも20項目くらい public function get_name(){ // クラスから取り出すだけ 以下20項目くらい public function register(){ // ここまできて、登録とか何たらとかの処理を書き始める。 こういう風に細かくやるのが普通なのでしょうか? 単純なことが多いとはいえ、ずいぶんとソースコードが長い 律儀だなw OOPの表面だけ真似るんじゃなくて本質を学んだほうがいいと思うぞ class a { function getA(){ { return new b('hoge'); } } class b{ public $a; protected $_z; public function __construct($data) { $this->a = $data+$data; $this->_z = $data; } } 上記のような、クラスがあって、aから、bが返されるのですが、bのprotected のデータを取得したい場合はどうすればいいでしょうか。 たとえばbを継承したb'を作成し、zを取り出すメソッドを作っても、bのャCンスタンスを麹�ャしているのbヘ aなのでb'のインスタンスは作られないですよね。 よく分からんが >たとえばbを継承したb'を作成し、zを取り出すメソッドを作っても、bのインスタンスを作成しているのは >aなのでb'のインスタンスは作られないですよね。 aでb'のインスタンスを作るように変更すればいいのでは。 >上記のような、クラスがあって、aから、bが返されるのですが、bのprotected >のデータを取得したい場合はどうすればいいでしょうか。 getZというメソッドを作るのはだめなの? ああ何となく分かった、既存のaにもbにも手を加えたくないのか 変更しないで挙動を変えたいなら、それこそa'とb'を作ってメソッドをオーバーライドするしかないかと やっぱりオーバーライドするしかないですか。 有難う。 おいおいおい!!こんなのあるのかよ! http://okamikakushi.net/jp/wbiyhi1 俺やってみたけど、マジ寝てるだけで金くれたぞ!! 他のプロジェクトで作成したフレームワーク、クラス、抽象クラス、インターフェースを 再利用したも猛者はいるか? ていうか再利用できない/しないフレームワークなんて嫌だな javascriptでツールチップを作れっ!オブジェクト指向チックによろしく! って言われたら、どのようなオブジェクトを作りますか? まず クライアントサイドプログラムはWeb制作板へ って言います <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script> //<!-- window.onload = function(){ kanako = createGirl('かなこ'); miku = createGirl('みく'); haruhi = createGirl('ハルヒ'); }; /* * クローンを作成 */ function createGirl( name ) { var superClass = new girlClass(); var superClone = function(){}; superClone.prototype = superClass; //これで他に影響ないクローン完成 var instanse = new superClone(); //いわゆるコンストラクタ instanse.myName = name; return instanse; }; /* * おんにゃのこクラス定義 */ function girlClass() { //プロパティ宣言 girlClass.prototype.myName = ""; //振る舞い girlClass.prototype.writeMyName = function() { document.write("私は"+this.myName+"だよ。<br />"); }; } //--> </script> </head> <body> <input type="button" value="Execute" onclick="onClickExecute()" /> <script type="text/javascript"> function onClickExecute() { //おんにゃのこに名前を言ってもらう。 kanako.writeMyName(); miku.writeMyName(); haruhi.writeMyName(); } </script> </body> </html> >>413 そんな事する意味が全くわからんwwww なんのメリットがあるの??wwww プロパティ宣言とかめっちゃウケルwww オブジェクトなんちゃのサンプルの悪いところはそこなんだよな。 なんでそんなことしなくちゃいけないんだよってやつ。 window.onload = function(){ kanako = new girlClass('かなこ','girlmessage'); miku = new girlClass('みく','girlmessage'); haruhi = new girlClass('ハルヒ','girlmessage'); }; function girlClass( name , target ) { girlClass.prototype.myName = name; girlClass.prototype.target = target; って書いたら全員ハルヒになったぞ そうか、プロトタイプとはそういう事ね 親クラスとして定義されている関数は触るなと。 了解した。 >>415 >プロパティ宣言とかめっちゃウケルwww ねーと使い方わからねーだろ屑 残念だなあ。 君は何か勘違いしている様だけど、聞いて揚げ足取りをしたいんじゃなくて、 単純に君の意見が面白そうだから聞いてみたかっただけなんだよ。 もっとまともなレスを期待してたんだけど。ごめんね。 ちなみに君は揚げ足を取られる事を恐れているようだけど、それは違うと思う。 揚げ足を取られるのは、君に隙があるから。 隙だらけの人間ってのはそうやって余計な所でつまらない恥をかく事になるもんだよ。 他人につっこまれる事は、自身の知識をより客観的で多角的なものとする為に 有益な指針となるものだと思うな。 オブジェクト指向って単純にいうと パラメーターと処理を 外部からひっかきますことができない思考ってことですか? パラメーターと処理を外部からひっかきますことができない思考 →カプセル化 CSSのカスケードみたいにカプセルを別のカプセルに引き継ぐ思考 →継承 ?????? 思考 → ポリモーフィズム オブジェクト指向のクラスの中身は、 手続き型の記述がカプセリングされて入ってる・・・ と思って間違いないですか? ポリモーフィズムってなんですか? 継承元の親クラスが、なんなのか?によって、 同じ名前のクラスが 全く違う動きをする みたいなかんじですか? となると子クラスには、親クラスがこうの時はこう、 親クラスからこういうパラメータが取ってこれてたらこう みたいな処理がかかれてるんですか? >>429 特定のインターフェース規格に準じるということです。 >同じ名前のクラスが 全く違う動きをする そんなことされたら困ります オブジェクト指向が良く分からないので質問。 例えば、部署を選択すると社員を一覧表示する機能を考えた場合、 社員テーブル(社員NO、社員名、部署NO)と部署テーブル(部署NO、部署名)を作成し、 単にSQLで一覧を取得すれば良いと思うけれど、オブジェクト指向では違うと認識。 そこで、「社員クラス」「部署クラス」「社員部署クラス」を作成。 社員クラス(社員NO、社員名、[社員コード、社員名を返すメソッド]) 部署クラス(部署NO、部署名、[部署コード、部署名を返すメソッド]) 社員部署クラス(社員NO、部署NO、[社員NO、部署NOを返すメソッド]) とりあえずテーブルも上記3テーブル。 また機能毎に「選択画面クラス」と「一覧表示クラス」を作成。 @選択画面クラス 1.部署クラスをnew 2.[部署コード、部署名を返すメソッド]で部署コード、部署名を取得 A一覧表示クラス 1.社員部署クラスをnew 2.選択画面で選ばれた部署コードをもとに[社員NO、部署NOを返すメソッド]で社員NOを取得 3.社員クラスをnew 4.[社員コード、社員名を返すメソッド]で社員コード、社員名を取得 これで考え方としてはあってますか? 部署コードを社員クラスに持たせるのは変? とりあえずはDBのことは忘れて考えればいいのか 明らかに勘違いしていることが分かった 1秒でわかるオブジェクト指向 こりあん えくすてんど こっくろーち いんぷりめんと ないんせんちみーたーかのん 受ける会社大丈夫? 下記の条件が全て当てはまる会社にご注意下さい。 ・IT系 in tokyo ・「社名 労基」でググると過去の2chスレが出てくる ・転職会議で2.5点 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 T8PRBRW3UD ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ プハァー ~~-v( =´o`=) 。o 〇 ○ read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる