PHPでオブジェクト指向プログラミング
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/04/17(日) 16:55:57ID:iM4mgYnJPHPによるOOPについて語りましょう。
0554nobodyさん
2005/07/07(木) 09:35:01ID:???みなさんは、このレベルだったら30分もあれば理解できるんでしょうね。さすがだと感心しました。
自分もこれから精進しようと思います。でも自分がプログラマだとは騙りませんの御安心ください。
0555nobodyさん
2005/07/07(木) 09:48:10ID:???さっそく自分がなにか理解違いしていましたか、失礼しました。
一応自分の理解では、多能性(たのうせい:ポリモーズヒズム)を以下の意味で使っています。
異なるオブジェクトに同じメッセージを送った場合に
そのオブジェクトの特性に会わせて振る舞いを設定できるということなので
>>550の場合、親クラスであるtestクラスのshowメソッドと
子クラスであるsub_testクラスのshowメソッドという同じ名前の
異なる振る舞いをするメソッドを実装しました。
testクラスでは、valueプロパティの値をそのまま戻り値として返しますが
sub_testクラスでは、valueの値の前後に"[]"を付けた値を戻り値として返します。
0557553
2005/07/07(木) 10:20:42ID:???×多能性(たのうせい) - ポリモーズヒズム(?)
○多態性(たたいせい) - ポリモーフィズム
「能」の下に心をつけるのを忘れないでください。
解釈としては>>555でおk。
狭義には「同じインスタンスに同じメッセージを送った場合にオブジェクトに応じた振る舞いをすること」
という風にもとらえられるけど、大した問題じゃない罠。
0559nobodyさん
2005/07/07(木) 12:19:52ID:???知らなかった。
0560nobodyさん
2005/07/07(木) 12:32:56ID:???狭義の多態性(こんどは間違って無い)が気になったので、自分なりにサンプルを書いてみました。
PHP4を使っているためか、自分が未熟なためか(たぶんこちらでしょう)、
最終的にevalに頼らざる状態になりましたが、一応動くものができました。
こんな感じの実装でいいでしょうか?
受取ったオブジェクトの種類によってsub_testクラスのshowメソッドの振る舞いが変化します。
<?PHP
class test{
var $value;
function test($argv){
$this->set($argv);
}
function set($argv){
$this->value = get_class($argv)?$argv->value:$argv;
return $this;
}
function show(){
return $this->value;
}
}
0561nobodyさん
2005/07/07(木) 12:33:22ID:???function sub_test1($argv){
$this->test($argv);
}
function show(){
return "[".parent::show()."]";
}
}
class sub_test2 extends test{
function sub_test2($argv){
$this->test($argv);
}
function show(){
return "{".parent::show()."}";
}
}
0562nobodyさん
2005/07/07(木) 12:33:37ID:???var $show_class;
function test($argv){
$this->test($argv);
}
function set($argv){
$this->show_class = get_class($argv);
return parent::set($argv);
}
function show(){
eval("\$tmp = $this->show_class::show();");
return $tmp;
}
}
$str = 'Hello OOP World';
$test1 = new sub_test(new sub_test1($str));
$test2 = new sub_test(new sub_test2($str));
print $test1->show()."<br>";
print $test2->show()."<br>";
?>
0563nobodyさん
2005/07/07(木) 13:08:12ID:???こんな感じでどうでしょ?
print get_value(new sub_test1($str)) . "<br>";
print get_value(new sub_test2($str)) . "<br>";
function get_value($obj) { return $obj->show(); }
// 同じインスタンス($obj)に同じメッセージ(show)だけど違う結果が返る
0564nobodyさん
2005/07/07(木) 13:32:11ID:???PHPにおけるポリモーフィズムの是非に関するアフォ話はこのスレの前半にチラホラでてるよ。
0565nobodyさん
2005/07/07(木) 14:09:28ID:???なるほど、いちいちコンストラクタ経由で初期化しなくてもいいわけでなんですね。
インスタンス・メソッドで直接オブジェクトを受取ってそのまま受取ったオブジェクトのメソッドをコールしちゃうわけですね。
つまり用語の定義を理解してその実装ができていればいいわけで、こうであるべきという実装方法というのはないわけなんですね。
ただ、シンプルに実装できれば、後のメンテナンス性とか考えた場合はいろいろ利用価値がありますよってことですね。
サンプルコード大変参考になりました。
>漏れの書いた「狭義の」ポリモーフィズムなんて敢えてPHPで実現する必要ないと思う。
ふつふつと好奇心が涌いてやってしまいました。
>PHPにおけるポリモーフィズムの是非に関するアフォ話はこのスレの前半にチラホラでてるよ。
ちょっと読んではみたんですが話の流れが不毛だったので途中で断念しました。
また色々試してみます。助言ありがとうございました。
0566nobodyさん
2005/07/10(日) 01:55:11ID:FkUTlorqエラーにしたいのですが
どのような方法があるでしょうか?
0567nobodyさん
2005/07/10(日) 02:45:33ID:???このサイトを見ると「Abstract::set」でJavaでいうところの
abstractを実装しているみたいなんだけどこれってPHP4でもできるの?
初めて知ったんだけど。
0568nobodyさん
2005/07/10(日) 06:31:47ID:???PHP4じゃ難しいかもね。
ま、それがprivateにしたいメソッドまで外から呼び出せてしまうPHP4の難点だ罠。
基本的にSingletonは無理だと思ったほうがいいかも。
>>567
PHP4ではオーバーライドし忘れのメソッドコール時に初めてエラー吐いて対処するしかないんだよね。
Mojavi2もそれだな。
0571nobodyさん
2005/07/11(月) 06:21:36ID:1O09a/aM今、あるクラスのクラス名を考えているのですが、いい名前が思いつきません。
このクラスは時間と文字列をメンバ変数に持つだけの単純なものなのですが(Java風に書くと↓)、
いろいろな用途に使われるため、安易に名前が付けられないのです。
class X{
Date date;
String note;
}
インスタンスの具体例…
・Webページの更新履歴 (date=2005-07-06, note="ギャラリーにCGをアップしました")
・スケジュール (date=2005-07-13 18:30, note="会議室にてミーティング")
・アクセスカウンタ (date=2005-07-11, note="34")
はじめは Schedule っていうクラス名だったのですが、
上に挙げたように後々になっていろいろな応用例が出てきたので、
別の名前に変えたいと思っています。
「ある時間と、その時間に関連づけられた情報を表すデータ」という意味を表すような
よさげな名前って何かありませんでしょうか?
0572nobodyさん
2005/07/11(月) 06:50:28ID:OE7FRRXhほざくよな・・・・そんなの知らなくても、十分食っていける
俺はしらないが、職業プログラマとして食ってるぞ。
かっこつけたがるんだよな、そういうの使ってさ
0573nobodyさん
2005/07/11(月) 06:55:56ID:???こんなスレもあるが
クラス名・変数名に迷ったら書き込むスレ。Part5
http://pc8.2ch.net/test/read.cgi/tech/1109330204/
0574571
2005/07/11(月) 07:15:14ID:???Notation というのはどうだろうか?
0575nobodyさん
2005/07/11(月) 13:06:05ID:???nodame
0576571
2005/07/11(月) 14:27:29ID:???0577nobodyさん
2005/07/11(月) 16:41:59ID:???0582nobodyさん
2005/07/11(月) 23:54:30ID:???これ真理。
0585nobodyさん
2005/07/12(火) 09:35:21ID:???0588nobodyさん
2005/07/13(水) 02:00:38ID:???>>576のリアクションができて意味不明もないと思うが
>>586と一緒に>>587の友達になるべきだな。
0589nobodyさん
2005/07/13(水) 22:16:27ID:???再生成は防げるやん。
class hoges{
function & hoges () {
static $done = NULL;
if ($done){
trigger_error("既にありんす");
exit;
}
$done = TRUE;
}
}
0590589
2005/07/13(水) 22:17:35ID:???0591nobodyさん
2005/07/14(木) 03:49:28ID:???再生成を防いだってSingletonにはなりませんな。
PHP4では無理。
$x = new hoges();
$y = $x; // アチャー
命名規則とかこじつけて、>>570の言うように「注意する」しかない。
実体の保持方法も微妙なとこだな。
考え付く限りでは、ゲッターの中で静的変数を宣言して入れとくくらいかな。
function & getInstance() {
static $instance = null;
if (! $instance) $instance = new hoges(); // コンストラクタは>>589を使うとしますか
return $instance;
}
しかしこれでは外部で先にnewされてた場合、今度はgetInstance内のnewがエラー吐くね。
結局newしないように注意するしかなくなってしまう。
そうなると再生成を防ぐコンストラクタも役に立たないな。
残るは苦肉の策でグローバル変数に保持か・・・。
0592nobodyさん
2005/07/14(木) 05:07:14ID:???ここでSingleton使ってますよという明示的な記述はできるでしょ。
言語仕様でしょうがない所は別のやり方でカバーしろよ。
0593nobodyさん
2005/07/14(木) 05:42:25ID:???まあ他の言語でもいえることだけど。
0594591
2005/07/14(木) 06:20:14ID:???> PHPの場合Singletonに強制力は持たせられないけど、
そうだね。漏れの話の論点はそういうこと。
> ここでSingleton使ってますよという明示的な記述はできるでしょ。
当たり前だね。
> 言語仕様でしょうがない所は別のやり方でカバーしろよ。
言われなくてもしますが。
0595nobodyさん
2005/07/14(木) 06:33:34ID:???0596nobodyさん
2005/07/14(木) 23:10:54ID:???メソッド内でgetInstanceする?
コンストラクタでプロパティーとして保持しておいて
以後そこ経由でアクセスする?
どっちがいいんかな。
0597nobodyさん
2005/07/15(金) 00:47:11ID:???SingletonのgetInstance内で、
$instance =& new ClassName();
と書いた時、Singletonにならないことを発見しました。
どういう原理でこうなるのでしょうか?
通常new時には&は付けてはいけないのでしょうか?
0598597
2005/07/15(金) 00:50:30ID:???一体なにゆえ…
0599nobodyさん
2005/07/15(金) 01:44:09ID:???リファレンスは静的に保存することはできない。
http://www.php.net/manual/ja/language.variables.scope.php
0600597
2005/07/15(金) 07:23:40ID:???なるほど…。PHPのリファレンスはエイリアスみたいなものだから、
異種な入れ物である静的変数とイコールにはできないということですかね。
ありがとうございました。
0601nobodyさん
2005/07/29(金) 19:03:11ID:???$self->書き忘れでいつもバグが発生するのは漏れだけ?
0602nobodyさん
2005/07/30(土) 00:08:49ID:???0603601
2005/07/30(土) 00:18:51ID:???思ったとおりに動かない、という人為的なバグがおきるんだけど。
0606nobodyさん
2005/07/30(土) 02:28:57ID:???OOP云々の問題じゃねえよ
0609nobodyさん
2005/08/21(日) 20:39:39ID:R+xir7FSそれを指定しておくのがよさげ。
0610nobodyさん
2005/08/21(日) 23:44:39ID:???エラーとして警告されるという諸刃の剣。
0611nobodyさん
2005/08/22(月) 15:45:30ID:???そういう互換性保ってるスクリプトは全部E_STRICTでは通らない。
0612nobodyさん
2005/08/22(月) 17:30:30ID:???結局E_STRICTは表示しないようにした
0613nobodyさん
2005/08/23(火) 13:54:53ID:???って分けてるんだけど
どこまでをDAOに入れるか、
どこまでをロジックに入れるか結構迷うなぁ。
そういうとこないですか?
0614nobodyさん
2005/08/23(火) 16:17:26ID:???PofEAAを原著で読むか、邦訳「エンタープライズ アプリケーション
アーキテクチャパターン」を読めばそのあたりの区切り方はわかってくるかも。
とりあえずは以下のWikiのTableDataGatewayとかActiveRecordとかを
読んでみては?
ttp://capsctrl.que.jp/kdmsnr/wiki/PofEAA/
0615nobodyさん
2005/08/23(火) 18:54:21ID:???ありがとう 参考にします
ちょうどJ2EEパターンの本買ってきたとこ
はっきり言ってPHP周辺の知識だけで
モダンなOOPを理解するのは不可能に近いね
0616613
2005/08/24(水) 03:22:41ID:???複雑な検索をする場合はValueListHandlerを間にかませて
キャッシュした結果セットに対して検索かけるのが流儀みたいだね…
ってPHPでそこまでやる人いるのか??
ムズカシス
0617nobodyさん
2005/08/24(水) 20:18:29ID:/VK1IBL20619nobodyさん
2005/08/24(水) 23:33:02ID:zsqtWDV8その改造内容というものは、Aサイトで開催している箱庭からBサイトで開催している箱庭にコマンドが実行できるようにするものです。
AサイトでBサイトの島にミサイルを打てたり、食糧援助をできるようにしたりできたら面白いものができると思うんですね。
しかし、私にはアイデアだけでそれを実現する力があまりません。
どうかプログラムが出来る方、これを実現していただけないでしょうか?
以上、宜しくお願い致します。
0621nobodyさん
2005/08/24(水) 23:38:34ID:zsqtWDV8私はここにしか書き込んでいませんのでコピペではありません。
0623nobodyさん
2005/08/25(木) 00:16:12ID:???Perlで擬似的にそういう要素を実装したものはコレ
http://bya.lib.net/yk_/index.html
0624nobodyさん
2005/08/25(木) 00:56:18ID:???受け取り側が処理すれば良いだけだし。
0625nobodyさん
2005/08/25(木) 13:04:09ID:???受け側の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アプリを作ることによって
ソフトウェア工学の基礎を学ぶという
授業があった。取らなかったけど。
0631629
2005/08/25(木) 23:21:52ID:???法人なら yahoo.co.jp なアカウントからメールを送るようなことしないと
思うんだが、世間一般の常識から考えてどうなんでしょう。
0632nobodyさん
2005/08/25(木) 23:23:39ID:Kc8uytHF>>629
お返事有難う御座います。
>>629さんにはメール送りました。
>>627さんで出来ればメール下さい。
[email protected]です。
メール頂けたらシステムの説明と料金の方お伝え致します。
宜しくお願いします。
0635629
2005/08/25(木) 23:29:45ID:???0636nobodyさん
2005/08/25(木) 23:33:22ID:Kc8uytHFやっぱり無理ですか??
一応ある程度はHPの製作会社に依頼したのですが、
システム部分となると、値段が張りすぎて・・・
これから立ち上げようと思ってるサイトなんですけどね。
0637nobodyさん
2005/08/26(金) 01:18:29ID:???同じように勉強中の人たちで勉強をかねて。
面白そうだったら私もやりたい。
0638nobodyさん
2005/08/26(金) 01:43:57ID:???0639nobodyさん
2005/08/26(金) 02:07:20ID:???レベルが極めて低い。
0640nobodyさん
2005/08/26(金) 05:30:11ID:Pl5RTNiw確かにオープンソースで共同開発するのもいいとは思うんですけど、
結構お金掛かってまして、実際は既に170万円くらい掛かってます。
そろそろ予算がオーバーしそうなので誰かに協力してもらおうと思って!
ここらで公開してしまうと、いくら「著作権あります」と歌っても、
無いに等しくなるし・・・特に今回私が立ち上げようと思ってるサイト
は確実に収入になってくるのでオープンソースでの開発は難しいかと思
います。偉そうな事言ってすいませんでした。
0641nobodyさん
2005/08/26(金) 05:40:31ID:???なんか黎明期のネットゲームのような印象しかなかったんだけど
0642nobodyさん
2005/08/26(金) 10:40:52ID:???どの学生が、使える人間かどうかの評価に関しては、
当該無知な雇い主さんには無理かもね。
0643nobodyさん
2005/08/26(金) 11:27:43ID:???$.hoge ← これぐらいの長さにしてくれよ・・・
0644nobodyさん
2005/08/26(金) 12:21:52ID:???0647nobodyさん
2005/08/26(金) 12:26:55ID:???0649nobodyさん
2005/08/26(金) 12:42:51ID:???0653nobodyさん
2005/08/26(金) 13:54:20ID:???当該人物が、顔を真っ赤にしていたとして、この議論には何ら関係ありませんが。
■ このスレッドは過去ログ倉庫に格納されています