Webでオブジェクト指向プログラミング
サーバーサイドWebプログラミングのOOスレです。
・OOP、MVC、デザパタなどのコンセプト的な話題
・OOにまつわる言語比較(言語批判はその言語で開発してる人に失礼にあたることが多いのでなるべく禁止でお願いします)
・保守、再利用、生産性、開発環境などの実践的な話題
・Webサーバ、DBなどの外部との親和性に関する問題
・学習、教育などの方法論
などなど。
前スレ
PHPでオブジェクト指向プログラミング
http://pc8.2ch.net/test/read.cgi/php/1113724557/
オブジェクト指向っていうものは聞いて覚えるもんじゃない。
体で感じるんだ。 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を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆