トップページ⇒php
1001コメント362KB

PHPでオブジェクト指向プログラミング

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/04/17(日) 16:55:57ID:iM4mgYnJ
PHP5になって本格的なOOPができるようになったので
PHPによるOOPについて語りましょう。
05985972005/07/15(金) 00:50:30ID:???
と思ったらMojavi内にも「=& new」がたくさんある…
一体なにゆえ…
0599nobodyさん2005/07/15(金) 01:44:09ID:???
>>597-598
リファレンスは静的に保存することはできない。
http://www.php.net/manual/ja/language.variables.scope.php
06005972005/07/15(金) 07:23:40ID:???
>>599
なるほど…。PHPのリファレンスはエイリアスみたいなものだから、
異種な入れ物である静的変数とイコールにはできないということですかね。
ありがとうございました。
0601nobodyさん2005/07/29(金) 19:03:11ID:???
PHPでOOPやろうとすると、
$self->書き忘れでいつもバグが発生するのは漏れだけ?
0602nobodyさん2005/07/30(土) 00:08:49ID:???
$self->書いてもバグは消えないとおもうな
06036012005/07/30(土) 00:18:51ID:???
クラス変数指定するときに、$self-> つけわすれて単なるローカル変数になり、
思ったとおりに動かない、という人為的なバグがおきるんだけど。
0604nobodyさん2005/07/30(土) 01:14:46ID:???
>>603
$this->ですか?
self::ですか?
まー前者だとは思うけど。
06056012005/07/30(土) 01:15:51ID:???
$self じゃなくて $this だった orz
そういうことか…>>602

議論の主旨は変わりませんが
0606nobodyさん2005/07/30(土) 02:28:57ID:???
E_ALLにしとけカス
OOP云々の問題じゃねえよ
06076012005/07/30(土) 03:42:23ID:???
>>606
notice出せばよいのか。ごもっともです。すみませんでした
0608nobodyさん2005/07/31(日) 03:57:50ID:???
>>601
おまえは他にどんな言語でOOPやってんだ?
0609nobodyさん2005/08/21(日) 20:39:39ID:R+xir7FS
PHP5ならE_ALLより厳しいエラーレベルが追加されたから
それを指定しておくのがよさげ。
0610nobodyさん2005/08/21(日) 23:44:39ID:???
E_STRICTは、PEARをはじめ外部ライブラリのコードがことごとく
エラーとして警告されるという諸刃の剣。
0611nobodyさん2005/08/22(月) 15:45:30ID:???
PEARはPHP4でも動くからね、
そういう互換性保ってるスクリプトは全部E_STRICTでは通らない。
0612nobodyさん2005/08/22(月) 17:30:30ID:???
classのvarを書き換えろとかnewを参照渡しするなとかうるさいからな
結局E_STRICTは表示しないようにした
0613nobodyさん2005/08/23(火) 13:54:53ID:???
Action(コマンドパターン)-ロジック-DAO
って分けてるんだけど
どこまでをDAOに入れるか、
どこまでをロジックに入れるか結構迷うなぁ。
そういうとこないですか?
0614nobodyさん2005/08/23(火) 16:17:26ID:???
>>613
PofEAAを原著で読むか、邦訳「エンタープライズ アプリケーション
アーキテクチャパターン」を読めばそのあたりの区切り方はわかってくるかも。

とりあえずは以下のWikiのTableDataGatewayとかActiveRecordとかを
読んでみては?
ttp://capsctrl.que.jp/kdmsnr/wiki/PofEAA/
0615nobodyさん2005/08/23(火) 18:54:21ID:???
>>614
ありがとう 参考にします
ちょうどJ2EEパターンの本買ってきたとこ
はっきり言ってPHP周辺の知識だけで
モダンなOOPを理解するのは不可能に近いね
06166132005/08/24(水) 03:22:41ID:???
どうもDAOは抽象度の高いシンプルなメソッドのみを提供し、
複雑な検索をする場合はValueListHandlerを間にかませて
キャッシュした結果セットに対して検索かけるのが流儀みたいだね…
ってPHPでそこまでやる人いるのか??
ムズカシス
0617nobodyさん2005/08/24(水) 20:18:29ID:/VK1IBL2
フロントコントローラってコントローラが一つあるだけってことですか?
0618nobodyさん2005/08/24(水) 20:33:09ID:???
>>617
コントローラの前の受付嬢
0619nobodyさん2005/08/24(水) 23:33:02ID:zsqtWDV8
箱庭諸島SEの改造お願いしたく、書き込みます。
その改造内容というものは、Aサイトで開催している箱庭からBサイトで開催している箱庭にコマンドが実行できるようにするものです。
AサイトでBサイトの島にミサイルを打てたり、食糧援助をできるようにしたりできたら面白いものができると思うんですね。
しかし、私にはアイデアだけでそれを実現する力があまりません。
どうかプログラムが出来る方、これを実現していただけないでしょうか?
以上、宜しくお願い致します。
0620nobodyさん2005/08/24(水) 23:37:52ID:???
>>619
コピペ?
0621nobodyさん2005/08/24(水) 23:38:34ID:zsqtWDV8
>>620
私はここにしか書き込んでいませんのでコピペではありません。
0622nobodyさん2005/08/25(木) 00:02:52ID:???
>>619
スレ違い
0623nobodyさん2005/08/25(木) 00:16:12ID:???
よそのサーバーのデータまでアクセスできるような機構をPHPって持ってたっけ?

Perlで擬似的にそういう要素を実装したものはコレ
http://bya.lib.net/yk_/index.html
0624nobodyさん2005/08/25(木) 00:56:18ID:???
データにアクセスする必要無いだろ。
受け取り側が処理すれば良いだけだし。
0625nobodyさん2005/08/25(木) 13:04:09ID:???
こういう場合ってHTTPプロトコルで受け取りするよりも
受け側のDB直接叩けるようにした方が確実だよね。
DB使ってない&セキュリティの問題でこのケースじゃ無理だけど
0626nobodyさん2005/08/25(木) 21:33:57ID:???
何処に書き込みしたら良いか解らないので、
ココにも書き込みさせて頂きます。
実はPHPについて私自身今から勉強しても
かなりの時間がかかるかと思いまして、
って言うか多分無理に等しいと思い、
どなたか親切な方に小規模なシステムを製作
して頂きたいのですが、ダメでしょうか??
勿論報酬は致します。交渉させて下さい。
もしやって頂ける方おられましたらお願いしたいのですが?
ノークレームと言う条件で構いませんので!!
詳しい内容はやって頂ける方がおられましたらご説明
致しますので、宜しくお願いします。
0627nobodyさん2005/08/25(木) 21:41:06ID:???
やりますけど、どんなシステムで、どのくらい払えるか教えてください。
0628nobodyさん2005/08/25(木) 21:44:41ID:???
なんでこんなところに書いてるのか分からない
楽天ビジネスとかに投げたら見積もり結構もらえるよ
0629nobodyさん2005/08/25(木) 21:48:06ID:???
請け負いますよ?
[email protected]
0630nobodyさん2005/08/25(木) 22:12:38ID:???
学校の宿題なんじゃないの?
PHPを使ってWebアプリを作ることによって
ソフトウェア工学の基礎を学ぶという
授業があった。取らなかったけど。
06316292005/08/25(木) 23:21:52ID:???
なんかメール来てる。
法人なら yahoo.co.jp なアカウントからメールを送るようなことしないと
思うんだが、世間一般の常識から考えてどうなんでしょう。
0632nobodyさん2005/08/25(木) 23:23:39ID:Kc8uytHF
>>627
>>629
お返事有難う御座います。
>>629さんにはメール送りました。
>>627さんで出来ればメール下さい。
[email protected]です。
メール頂けたらシステムの説明と料金の方お伝え致します。
宜しくお願いします。

06336292005/08/25(木) 23:24:41ID:???
>>627 == >>629 だったりするわけだが。w
0634nobodyさん2005/08/25(木) 23:29:22ID:Kc8uytHF
>>>627 == >>629 だったりするわけだが。w
そうでしたかすいませんでした。
06356292005/08/25(木) 23:29:45ID:???
個人で金を扱うシステムとはますますあやすぃでつね。
0636nobodyさん2005/08/25(木) 23:33:22ID:Kc8uytHF
>>635
やっぱり無理ですか??
一応ある程度はHPの製作会社に依頼したのですが、
システム部分となると、値段が張りすぎて・・・
これから立ち上げようと思ってるサイトなんですけどね。
0637nobodyさん2005/08/26(金) 01:18:29ID:???
仕様とか全部公開してオープンソースで開発するのはだめ?
同じように勉強中の人たちで勉強をかねて。

面白そうだったら私もやりたい。
0638nobodyさん2005/08/26(金) 01:43:57ID:???
ヒント:2chで共同開発は成功した試しが無い
0639nobodyさん2005/08/26(金) 02:07:20ID:???
無くはないが、WebProg板では無理そうだ。
レベルが極めて低い。
0640nobodyさん2005/08/26(金) 05:30:11ID:Pl5RTNiw
>>637
確かにオープンソースで共同開発するのもいいとは思うんですけど、
結構お金掛かってまして、実際は既に170万円くらい掛かってます。
そろそろ予算がオーバーしそうなので誰かに協力してもらおうと思って!
ここらで公開してしまうと、いくら「著作権あります」と歌っても、
無いに等しくなるし・・・特に今回私が立ち上げようと思ってるサイト
は確実に収入になってくるのでオープンソースでの開発は難しいかと思
います。偉そうな事言ってすいませんでした。
0641nobodyさん2005/08/26(金) 05:40:31ID:???
箱庭諸島ってそんなに人気あるの?
なんか黎明期のネットゲームのような印象しかなかったんだけど
0642nobodyさん2005/08/26(金) 10:40:52ID:???
ふつーにバイトの学生雇って、作らせればいいじゃん。

どの学生が、使える人間かどうかの評価に関しては、
当該無知な雇い主さんには無理かもね。
0643nobodyさん2005/08/26(金) 11:27:43ID:???
$this->hoge ← 何でこんなに長いの?
$.hoge ← これぐらいの長さにしてくれよ・・・
0644nobodyさん2005/08/26(金) 12:21:52ID:???
新しい言語作って解決。
0645nobodyさん2005/08/26(金) 12:23:38ID:???
>>643
「$」を冗長だと思わないところがPHPプログラマらしくて素敵。
0646nobodyさん2005/08/26(金) 12:24:58ID:???
>>645
ruby 厨?
0647nobodyさん2005/08/26(金) 12:26:55ID:???
変数宣言がないんだから必要なのは当然だろ。
0648nobodyさん2005/08/26(金) 12:39:28ID:???
>>646
すぐ顔真っ赤にすんなよ PHP厨

>>647
論点ずれてるよ
0649nobodyさん2005/08/26(金) 12:42:51ID:???
それならJavaとかのが、よっぽど長いじゃん。
0650nobodyさん2005/08/26(金) 12:44:36ID:???
>>647
まったくその通り。
0651nobodyさん2005/08/26(金) 13:15:42ID:???
>>648
$が冗長とした場合の解決策は?
0652nobodyさん2005/08/26(金) 13:26:35ID:???
>>646
変数に接頭字が必要な言語の方が圧倒的に少ないと思うが……。
PHPとrubyしか知らないのか?
0653nobodyさん2005/08/26(金) 13:54:20ID:???
> すぐ顔真っ赤にすんなよ PHP厨

当該人物が、顔を真っ赤にしていたとして、この議論には何ら関係ありませんが。
0654nobodyさん2005/08/26(金) 14:52:34ID:???
そういえば何で変数の頭には$をつけるんだ?
何かに対しての混同を避けるためだと思うけど、その何かとは何?
0655nobodyさん2005/08/26(金) 14:56:10ID:???
>>654
Perlの真似しただけだろ
0656nobodyさん2005/08/26(金) 15:19:31ID:???
$で始まれば変数だって事がわかるんだから
パフォーマンスも上がるだろ。
0657nobodyさん2005/08/26(金) 15:44:37ID:???
>>656
予約語と関数と変数を見分るため?
0658nobodyさん2005/08/26(金) 17:15:30ID:???
ウザ
0659nobodyさん2005/08/26(金) 17:38:13ID:???
rubyだってインスタンス変数には@が必要だけど。
0660nobodyさん2005/08/26(金) 17:41:59ID:???
>>659
$this->hoge に比べたら、べらぼうにシンプルで(・∀・)イイ!!
0661nobodyさん2005/08/26(金) 18:28:00ID:???
その辺は趣味ってコトで。
0662nobodyさん2005/08/26(金) 23:12:41ID:???
>>654
exit;
$exit;

$some_func();
some_func();

print(abc);
print($abc);

どれも$のあるなしで挙動が違うだろ。あと、$なし言語は

print "abc $def ghi";

みたいな真似ができない。

>>655
えーっと、そこは笑うところなのか?

>>656
パフォーマンスの問題じゃないと思うが……。
0663nobodyさん2005/08/27(土) 09:43:05ID:???
phpの基本はPerlの真似だからな

今はJavaの真似を中途半端にしてるけど
0664nobodyさん2005/08/28(日) 09:27:12ID:BIgcJ0fJ
パフォーマンスの問題だよ、$を見つけたら変数だってすぐコンパイラ・インタープリターが判別できるだろ
0665nobodyさん2005/08/28(日) 10:57:46ID:???
おまいら配列参照渡ししてますか?
しているとすれば
する/しないの境界はどこ?
0666nobodyさん2005/08/28(日) 11:23:32ID:???
境界はそれが速度のボトルネックになるとわかったとき。
通常はする必要なし。
0667nobodyさん2005/08/28(日) 11:59:04ID:???
ナルホド
さんくすちんぽ
0668nobodyさん2005/08/30(火) 10:18:32ID:???
$があってもなくても結局シンボルテーブルを作って参照するんだから
パフォーマンスは関係ない気がする。
あると主張するなら字句解析や構文解析のどういう部分でメリットがあるか
理由を説明して欲しい。

awkとかpythonとか$の必要ないスクリプト言語は現にあるし
それらと比較しても特に$にメリットがあるわけじゃない

php は perl の真似をした
perl は sh の真似をした

それ以上でもそれ以下でもない
0669nobodyさん2005/08/30(火) 10:50:09ID:???
>>662
> あと、$なし言語は
> print "abc $def ghi";
> みたいな真似ができない。

変数の文字列埋め込みなんてフォーマッティングや文字列連結で代替できるじゃん。
0670nobodyさん2005/08/30(火) 12:38:03ID:???
人間にとって
ぱっと見分かりやすいからだろ
0671nobodyさん2005/08/30(火) 13:11:54ID:4hyOkdNt
>662
>$なし言語は
>print "abc $def ghi";
>みたいな真似ができない。

そういうメリットを主張する割には
defineで定義した名前は""内で使うことができないんだよな。
この辺のいいかげんさがPHPの特徴。
0672nobodyさん2005/08/30(火) 21:44:33ID:???
>>670
俺もそう思う。機械にとってどうって事じゃなくて、人にとってどうかだと思う。
ただでさえ素人(俺含む)が多いPHPerにとって、ぱっと見「あ、これ変数ね。」って思えるのは結構重要だと思う。
0673nobodyさん2005/08/30(火) 22:05:46ID:???
おまいらシェルスクリプトって変数名の後に空白入れちゃいけないんですね
まぎらわしいんじゃボケ!
0674nobodyさん2005/08/31(水) 12:00:09ID:???
>>668
php は perl の真似をした 
perl は csh の真似をした 
cshはshの真似をした

の方が正確ではない?

>>669
> 変数の文字列埋め込みなんてフォーマッティングや文字列連結で代替できるじゃん。 

TMTOWTDI。
それらに比べてタイプ量が少なく済み、見通しがいいのは充分メリットだと思うが。

>>671
> defineで定義した名前は""内で使うことができないんだよな。 

そりゃそうだろ……。""の中の[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* を全部パースするのか?
第一""内で使えなくて困る場面なんてそんなにあるか?
0675nobodyさん2005/08/31(水) 12:29:45ID:???
ヒアドキュメント内とかね。
0676nobodyさん2005/08/31(水) 14:00:53ID:???
>>674
Perlの前にはawkが、その前にはsedが入ってくるような。
0677nobodyさん2005/08/31(水) 16:14:20ID:???
>>676
あれ?変数の$の話でしょ?
0678nobodyさん2005/09/02(金) 05:16:07ID:???
みんなdefine()使っているのか。

interfaceで定義したいんだけど
Javaのstatic final変数と違ってconstが使い物にならず。
PHPでJavaのstaticイニシャライザ、インスタンスイニシャライザを
真似することは不可能なんだろうか?
static メソッドを定義してSingletonパターンでなんとか
誤魔化してやるしかないんだろうか。

0679nobodyさん2005/09/02(金) 05:18:08ID:???
>>654
$をつけた理由はテンプレートとして使いたいからかと思われ。
Java用テンプレートエンジンJakarta Velocityは
テンプレート変数は$で始まるようになっている。
0680nobodyさん2005/09/02(金) 05:23:22ID:???
>>662
> >>654
> exit;
> $exit;
>
> $some_func();
> some_func();
>
> print(abc);
> print($abc);
>
> どれも$のあるなしで挙動が違うだろ。あと、$なし言語は
>
> print "abc $def ghi";


$がつくものとして上にあげたJakarta Velocityのようなテンプレートエンジン
として使うメリットはあるが、$なし言語でも
正規表現などが盛り込まれた関数や特殊な関数を使えば
その手の再現は簡単にできる。
JavaのTextFormatというクラスを思い出した。
あれを使い、かつリフレクションAPIを使えば、文字列中に$が現れたら値に変換してから表示する
というメソッドを作ることもできる。リフレクションは重たいけど。
0681nobodyさん2005/09/02(金) 05:30:42ID:???
>>665
これはまずい。
PHPはデフォルトでは配列は値渡しなのか?

Javaやりすぎて、デフォルトでは
配列やオブジェクトは参照渡しのみであり、基本型(プリミティブ型)のみ値渡し
であってこともあり、
PHPでは値渡しなどもできることを忘れていた。

やばい、バグが。


PHPではメソッドの引数にはC/C++のように値渡し参照渡しの設定はできないんだろうか?
Javaでは上と同じように、プリミティブ型のみ値渡しで
他(オブジェクトと配列)は参照渡し。

どうしても値渡しをしたい場合はObject#clone()を使ったり、オーバーライドしたりする。


PHPにはJavaのObject#clone()メソッドに相当する機能cloneもあるんだね。
これでPHPで深いクローニングができるわけか。

0682nobodyさん2005/09/02(金) 05:33:03ID:???
>>656
インタプリタ言語としてつかうならそうだけど、
JavaやC#のようなコンパイラ言語でかつ、VM上でさらにJITコンパイラによって
中間言語をさらにその場でコンパイルするような言語だと
それは最初の開発者によるコンパイルで最適化されるから
どうでもいいような気がする。

Zendエンジンなんてものもあるけど、タダで使えればねえ。
0683nobodyさん2005/09/02(金) 07:20:11ID:MBSmrOid
>>681
ごめん、何が言いたいかよく解らん。。
取り敢えず疑問は解決したの?
0684nobodyさん2005/09/02(金) 09:20:10ID:???
>>679
歴史的に見れば、裸の文字リテラルや予約語と衝突しないのが当初の目的でしょ。
shで裸の変数を許したらコマンドや引数はどうやって指定すりゃいいんだ。

あとは$があるとパーサが変数かどうかの判定に困らないので、文法の幅が広がる。
phpのexitみたいな括弧なしの言語構造や、Perl関数の戻り値にスカラが指定できるような
芸当は$なし言語だと厳しいでしょ。
0685nobodyさん2005/09/02(金) 09:22:02ID:???
exitは別に厳しくないか。exitって名前の変数が使えなくなるだけだな。
0686nobodyさん2005/09/02(金) 11:57:33ID:???
>>681
> PHPはデフォルトでは配列は値渡しなのか?
値渡しだけど、配列の要素を書き換えない限り、内部的には配列はコピーされないのでパフォーマンス的には参照渡しと同じ。
文字列やオブジェクトも同様。

> PHPではメソッドの引数にはC/C++のように値渡し参照渡しの設定はできないんだろうか?
&をつければ参照渡し。その点はC++に似てる。
C++では配列ならC式の参照渡し(アドレスの値渡し)で十分だけど。

とりあえず疑問文にだけコメントしといた。
0687nobodyさん2005/09/03(土) 00:10:51ID:???
http://www.zend.com/zend/art/ref-count.php
0688nobodyさん2005/09/03(土) 09:36:19ID:JcQXpRDz
最近PHP5に移行したんだが
たとえば。クラスtest,
メソッドtest($t){$this->t}と定義した場合
$test= class test;
でメソッドのひきすうに10を渡した場合
$test->test(10);
これでなにも表示されないんですね・・・なんかつかいずらい
いちいちメンバーを定義して
public $tみたいに・・・めんどくせえ・・・

0689nobodyさん2005/09/03(土) 10:52:27ID:???
>>688
public $t;書いてもそのままじゃ何も表示されないとおもうけど。
echoはないわ、$this->tに値いれてないわ。おかげで主張の内容がさっぱりわからん。
まずどの言語から移行したわけ?メンバ定義なしでメンバを使える言語ってまさか・・・?
0690nobodyさん2005/09/03(土) 11:17:01ID:???
>>688
その前にメソッド名がクラス名と同じならコンストラクタになるんじゃなかったか?
0691nobodyさん2005/09/03(土) 12:22:13ID:???
>>690
php5では
function __construct() { }
が優先される
<?php
class test {
function __construct() {
echo "testクラス作成<br>\n";
}

function test($t) {
echo $t;
}
}
$test = new test();
$test->test(10);
?>
こんなことも出来る
0692nobodyさん2005/09/03(土) 16:19:09ID:???
>>691
__construct()が優先されるけど、書いてないならこの場合test($t)が呼ばれるよ。
んで、インスタンス化した際に引数つけてないとWarningがでる。
>>688で書いてる、
$test= class test;
って書き方初めて見たのだが、それエラーするだろ?
それとも俺はPHP5しか知らないのだけど、4ではその書き方出来るの?
0693nobodyさん2005/09/03(土) 16:46:21ID:JcQXpRDz
>>688だが・・すまんまちがったソースかいてもうた

俺がいいたかったのは
class test;
{ pubclic funciton tes($a);
{
echo($this->a);
}}
で
st= new test();
ここでメソッドをよびだした場合
st->tes(10);なにも記述しなてくて
つまりメソッドの場合$this->aってできないんだな
public $a; $this->a=$a
みたいな・・二度手間だな・・・まぁいきなり$aならこれでも表示するんだが
本みるとこの二度手間をしてる・・


0694nobodyさん2005/09/03(土) 16:47:21ID:???
なんかコンストラクタの話になってるが>>688は
> $test->test(10);
と書いているので、コンストラクタの話題を意図していたわけじゃないんだろうけどな。

>>692
> 4ではその書き方出来るの?
んなわきゃないw
PHP Parse error: parse error, unexpected T_CLASS in (ry
極めて真っ当なエラーですな。
0695nobodyさん2005/09/03(土) 17:01:56ID:???
>>693
その本で何を解説してるのか知らないが、大方
・プロパティ名とメソッドの引数名は同じでも問題なし
・public $a と $this->a の「a」は同じ変数を表すが tes($a) の「a」は全く別の変数
ってな感じの内容じゃないの?
どこが二度手間なわけ?
0696nobodyさん2005/09/03(土) 17:35:38ID:???
>>693
PHPの前に日本語勉強してくれと思ったのは俺だけ?
0697nobodyさん2005/09/03(土) 18:15:04ID:JcQXpRDz
>>695
てことは
クラスの中に
メソッド pubulic funciton hell($a){ echo($a."さんこんにちは");}
こういう使い方はできるんだね。現にやったらできたけど
なんかPHP5の本ではさやたら$this->
って感じでやってるから。
PHP5の本どうでもいいけど少なすぎ><
0698nobodyさん2005/09/03(土) 18:18:07ID:JcQXpRDz
つづきだけど
本ではさ
public $a;
pubulic funciton hel($a){
$this->a=$a
echo($this->a."さんこんにちは")}
みたいな使いかたをしてたから
なんでこんな二度でまをふんでるんだろうかと
本がわるいのかもしかして
■ このスレッドは過去ログ倉庫に格納されています