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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/04/17(日) 16:55:57ID:iM4mgYnJ
PHP5になって本格的なOOPができるようになったので
PHPによるOOPについて語りましょう。
0413nobodyさん2005/06/27(月) 00:51:05ID:???
new $classname; でいけたかな?
できなくてもeval()使えば確実。
0414nobodyさん2005/06/27(月) 01:58:50ID:???
$aaa = new ClassA();

のように一度作ったオブジェクトを削除するにはどうしたらいいんですか?
unsetだとだめっぽいんですけど。
0415nobodyさん2005/06/27(月) 05:13:50ID:???
要するにあれだな。もともとカリフォルニアはメキシコ領だったからスペイン語風の綴りが残ってるっていう感じ?
0416nobodyさん2005/06/27(月) 08:41:54ID:???
>>414
unsetの何がダメなのさ?
0417nobodyさん2005/06/27(月) 08:45:57ID:???
>>415
いつの間にかアメリカの歴史の話になっている。
恐るべきスレだな・・・。
みんなもWebProgばっかやってちゃダメだぞ。
0418nobodyさん2005/06/27(月) 20:12:48ID:???
オブジェクト指向的に書くと、PHP4よりもPHP5でやった方が早いですか?
別に速度は変わらないんでしょうか。
0419nobodyさん2005/06/27(月) 21:33:03ID:???
自分で測れ
0420nobodyさん2005/06/27(月) 22:20:41ID:???
>>413
Thx, eval関数の中でnewすることで作ったよ!
PHP4は型制限が緩いから俺様フレームワーク作るのは結構簡単だーね。
他人に使ってもらって使いやすいってのは難しいけど。
インターフェイスとか無いし。
PHP5で追加されたんだっけ。
0421nobodyさん2005/06/28(火) 08:50:18ID:???
>>418
速度に関しては何とも言えんな。
PHP5のオブジェクト指向に関する利点は、カプセル化、抽象クラスとインターフェース、__autoloadあたりの「機能」面だと思う。
オブジェクトの参照をうまく扱うようになったみたいだからメモリの使用量は減ると思うけど、その恩恵が得られるのは大量のオブジェクトを生成した場合くらいだな。
まあ元々Webプログラミングではオブジェクトを無闇にガンガン生成しないってのが鉄則だから、メモリに関しても速度に関してと同様に大して利点と言えないかもね。
0422nobodyさん2005/06/28(火) 08:55:01ID:???
>>420
あのさぁ、マニュアルに思いっきり載ってるんだけど。
http://www.php.net/manual/ja/language.oop5.patterns.php

俺ならevalではなくnew $classnameだな。
0423nobodyさん2005/06/28(火) 09:37:48ID:???
>>422

お前馬鹿だろ
04244222005/06/28(火) 09:59:34ID:???
>>412
Mojavi3ではファクトリーの実装でINIファイルをパースして、適切なクラス名のオブジェクトを生成するPHPのコードを自動生成してるみたいだ。
INIを編集しない限りは生成されたPHPファイルをそのままrequireしてるね。

ま、Mojaviの場合はシングルトン実装するために結局はnewInstance($class)メソッドの中で
$object = new $class();
とやってるけど。

っていうかPHP5イイな。
シングルトンをラクラク継承できる。

>>423
はい。>>423の勘違いぶりよりは幾分マシですが。
0425nobodyさん2005/06/28(火) 11:04:43ID:???
勘違いしてるのはお前だ池沼
0426nobodyさん2005/06/28(火) 11:24:54ID:???
>>425
ずいぶんストレスがたまってるみたいだな。
もしくは頭が悪いのか?
0427nobodyさん2005/06/28(火) 13:05:11ID:???
ホントに頭悪いのなお前
0428nobodyさん2005/06/28(火) 13:29:41ID:???
シングルトンて継承できなくね?
staticな$instanceは、継承したところで基底クラスにしか存在しないだろ?
0429nobodyさん2005/06/28(火) 13:56:05ID:???
インスタンスメソッドからスタティックメソッド呼んだりしなきゃいけるんでね?
0430nobodyさん2005/06/28(火) 14:03:58ID:???
シングルトンは己の実体をstaticな変数に置くだろ?
継承したクラスからgetInstanceすると、すべて同じインスタンスをgetしてしまうから、
継承は出来ないんじゃないの?
424は自分でやってみてから言ってるのか?
0431nobodyさん2005/06/28(火) 14:06:54ID:???
Javaだとでけるな。親クラスのコンストラクタをprotectedにしたり、シングルトンを保持するスタティック変数と、それを扱う部分はオーバーライドせにゃならんが
0432nobodyさん2005/06/28(火) 14:28:51ID:???
$GLOBALに放り込むってのをどっかで見たな
0433nobodyさん2005/06/28(火) 14:31:48ID:???
つーか、違う変数に入れればいんでね?
04344242005/06/28(火) 14:42:27ID:???
>>428 >>430
基本的に基底クラスとそこから派生したクラス全てに関して、プログラムのなかで一つしかインスタンスが存在しないものを考えてた。

class Singleton
{
  private static $instance = null;
  protected function __construct() {}
  public static final function newInstance( $className )
  {
    if ( self::$instance !== null )
      throw new Exception( '2つ目のインスタンス' );
    
    self::$instance = new $className();
    
    if ( ! ( self::$instance instanceof Singleton ) )
      throw new Exception( 'クラス名が変' );
    
    return self::$instance;
  }
  public static final function getInstance()
  {
    if ( ! isset( self::$instance ) )
      throw new Exception( 'まだ生成されてない' );
    
    return self::$instance;
  }
}

派生クラスで個別にインスタンスほしいなら、finalを消して>>431のようにやればできるけど、それじゃこの親クラス意味ないね・・・。
コンストラクタに引数渡したい場合ちとツライが、Mojaviでは引数を共通の方法(連想配列)で渡すことで対処してた。
0435nobodyさん2005/06/28(火) 15:21:04ID:???
うーんと、親クラスで子クラスのインスタンスを管理するんであれば、
protectedなスタティックメソッドつかえばなんとかなるかな?(てきとう)
04364242005/06/28(火) 16:07:50ID:???
一応カンタンな使用法。

class ChildSingleton extends Singleton
{
  public function saySomething()
  {
    echo 'something';
  }
}

$obj = Singleton::newInstance( 'ChildSingleton' );
$obj->saySomething();

// 以下は全てエラー
$obj2 = new Singleton();
$obj3 = new ChildSingleton();
$obj4 = Singleton::newInstance( 'Singleton' ); // 2つめのインスタンス
$obj5 = Singleton::newInstance( 'ChildSingleton' ); // 同様

その他のメソッドもスタティックではなく、通常のインスタンスメソッドでOK。
ちなみに今の状態だと、Singletonクラスの派生クラスにpublicなコンストラクタを書くと、そいつはシングルトンでなくなる。
それを禁止したい場合は、基底クラスのコンストラクタをfinalにすればよい。
0437nobodyさん2005/06/28(火) 17:45:05ID:???
ひとつ見えたことがある。PHP 5では基底クラスのコンストラクタが呼ばれないことがあるよね?
そこが穴になりそうな予感。でもそんなことなかったらすまぬ。

↓ここの例だと、基底クラスのコンストラクタが必ず呼ばれることを利用して派生クラスを縛ってる。
http://www.hyuki.com/techinfo/singleton.html
0438nobodyさん2005/06/28(火) 21:06:20ID:???
>>437
その人の本、分かりやすくていいけど
変な宗教のプロパガンダやってるのはどうなのか…
0439nobodyさん2005/06/28(火) 21:12:59ID:???
>>422
5のSingletonは__cloneも防がなきゃならなかったのか。
これはしらんかった。
0440nobodyさん2005/06/28(火) 21:32:15ID:HyE/S+PB
MからVへのエラーコンテナってどう実装してる?
モジャはRequestオブジェクトに一括してほりこんでるけど。
俺はRequestとResultも分けてるから、
Errorクラスも別に作った方がキレイかなとも思う。
しかしErrorはResultの一部とも考えられるし…とか思うと
無駄に迷う。
0441nobodyさん2005/06/28(火) 22:06:19ID:cNCUVPCu
Java言語による主の祈り。。。。なんだこれは?
0442nobodyさん2005/06/28(火) 22:10:50ID:???
HolySpiritualOutputStreamワロス
0443nobodyさん2005/06/28(火) 22:51:32ID:???
>>440
mojaviのようにビューへ処理の結果が通知されるようになっている。エラーならエラーと。
んで、エラーの内容はResultにぶち込んでる。
大規模な開発になったら考えるけど、あまり変に凝らない方が結局
保守しやすいコードになったりする。
0444nobodyさん2005/06/28(火) 23:34:22ID:???
結城浩位知っとけよ。
0445nobodyさん2005/06/28(火) 23:36:32ID:???
>>436
あ、そうか。つーか「コンストラクタにfinal」の意味が飲み込めなかったが、それが裏技的にアリなわけか。
そうするとコンストラクタはテンプレメソッドにしておいて、派生クラスごとの初期化には
コンストラクタから一定の初期化メソッドを呼ぶようにすればよいとかそういう感じかな
0446nobodyさん2005/06/28(火) 23:37:30ID:???
>>443
確かにOOPの罠の一つは「凝りすぎる」ことだと思う
純文学的プログラミングに陥ると
いつまでたっても完成しないもんなぁ…
0447nobodyさん2005/06/28(火) 23:40:58ID:???
>>443
うん、それで充分だね。やばい方向に行ってた。
さんくすちんぽ。
0448nobodyさん2005/06/29(水) 00:49:31ID:???
>>444
彼が書いたWikiのソースコードを読んでみたことがあるんだが、
とてもじゃないけどOOを理解してる人のコードじゃなかったね。
昔のコードなのかもしんないけど、名前空間がとっ散らかってて
ロジックも一貫性がなくて悪いコードの見本みたいな感じだった。

>>446
コードを書くたびにどんどん仕事量が減っていくようなら正しいプログラミングが出来てる。
汎用ライブラリを作ったはいいけど、何だかんだで案件をこなすたびに書き直しを余儀なくされて
バージョンが分散してどれがどれやら分からなくなっちゃってる人、自分が書いたコードなのに、
時間が経つと内容が把握するのに時間が掛かっちゃう人は何かが間違ってる。

あと凝ることは大事だと思うけど、OOに囚われるあまり手段が目的化しちゃってる人は多いね。
「1)納期に間に合って2)正確に動いて3)保守が簡単」ならば手段は問わないわけで。
その手段としてOOが提供されているのであって、OOであることを目的にしちゃいかん。
「上の3つの要素を満たすコードを書いた結果、たまたまOOになってた」ってのが正解。
0449nobodyさん2005/06/29(水) 03:51:33ID:???
最近特にWebプログラミングにおけるOO化が進んでる気がする。
ちょっと前までPerlでガリガリ系のプログラマがPHPに以降し始めて
OOPを必死で習得しようとしてるのかな。(俺もそうだけど)
一世を風靡したKENTさんなんてビジネスロジックとプレゼンテーションの
分離すら理解できてないみたいだけど今は苦労してるんだろうな。
もう隠居したかなw
0450nobodyさん2005/06/29(水) 04:50:32ID:???
>>446の場合はただスキルが足りないだけだと思う。
0451nobodyさん2005/06/29(水) 06:28:54ID:???
>>450がOOPを使いこなすための目から鱗なコメントを準備中ですので、
みなさん、お楽しみに!
0452nobodyさん2005/06/29(水) 07:05:05ID:???
必死な>>446がきましたよ
04534512005/06/29(水) 07:34:24ID:???
はっはっはっ!
漏れは>>446じゃないがなw
0454nobodyさん2005/06/29(水) 07:57:21ID:???
誰かモジャ3の使い方を解説しているサイト知りませんか?
本家のサイトにはチュートリアルみたいなのないし、ググってもモジャ2が中心で・・・。
日本語か英語で解説してあるサイトが知りたいです。
よろしくお願いします。

>>363
Viewの中にあるdecorate()メソッドはどういうときに使うのですか?
モジャパッケージ内のクラスでも使用している箇所はないようなのですが。
0455nobodyさん2005/06/29(水) 10:34:58ID:???
>>449
> ちょっと前までPerlでガリガリ系のプログラマがPHPに以降し始めて 
> OOPを必死で習得しようとしてるのかな。(俺もそうだけど)

PerlでもOO的な書き方はできるし、(Jcode.pmがOO的なので
大抵のPerl書きはOOの恩恵にあずかってるはず)、逆にPHPも
ロジックが混在した汚いコードは多いよ。一概に言えないんでは?
0456nobodyさん2005/06/29(水) 11:45:23ID:???
俺もMVCを自分なりに考えてやってた頃はVとMを
どう分けるのかがいまいち分からなかった。
MからCに制御を戻さずにそのままVに移してたから一つのクラスになってた。
Mojavi見てやっとイメージが掴めた。
あと体得してきたノウハウ↓
・オブジェクトを擬人化して考える
・インターフェイスから考える(インターフェイスが出来たら実装は出来たようなもん)
0457nobodyさん2005/06/29(水) 11:48:29ID:???
>>454
APIリファレンス見ながら地道にソース読んでいくしかないと思う
0458nobodyさん2005/06/29(水) 12:33:25ID:???
Mojaviのソースは確かに参考になるね。
俺はStrutsとか触ったことないからよくわかってないのかもしれないけど、なるほどと思えるところがたくさんあった。

しかしMojavi3でどうしても解せないのがActionやViewのexecuteが、Controllerの中ではなくFilterの中で呼ばれていることだな。
いやむしろExecutionFilterの存在自体が謎だ・・・。
Controllerの中でやってしまえばよかったのでは?
まーこれに関してはMojavi内部での処理なのでどーでもいいといえばどーでもいいのだが。

あとFilter書くとき、条件が通ったら$filterChain->execute()呼んで、ダメだったときは$controller->forward()ってのもちと解りづらい気がするが、ちまたのMVCでもそういうものなの?

もう一つついでに、Viewとか他のクラスの中からその時々のActionをContextから直に取得できないのがツライな。
$this->getContext()->getController()->getActionStack()->getLastEntry()->getAction();
ってちょっと待ってくれよ・・・。
取得しないほうが吉ってことなのかな?
それとも俺なんか見逃してる?
0459nobodyさん2005/06/29(水) 17:30:50ID:EqNehqGX
データベース使うとSELECTとかWHEREとかそういうのがダラダラしちゃうんですけど
こういうのうまいことする方法ってないですか
0460nobodyさん2005/06/29(水) 18:00:50ID:???
>>459
おーい!スレがちがいますよーっ!
SQLを隠蔽したクラスを作るor使いましょう。
0461nobodyさん2005/06/29(水) 19:04:41ID:YzX/r9Gn
おまいら!最近出たWeb+DBプレスはおすすめですよ
Ajaxの記事が気になって買いにいったら
PHPのフレームワークについてかなり詳しく書いてた
そこで俺は勘違いに気付いたのだが
Actionクラスはプレゼンテーション層だから
あまりロジックは書かない方がいいんだな。
Actionに書いた方がいいのかとロジッククラスをバラして
もりもり書いてたよw
0462nobodyさん2005/06/29(水) 19:08:09ID:???
>>458
コマンド実行は
フィルタと本質的な違いはないからでは?>ExecutionFilter
俺はソース見た時、なるほどなぁ〜と思ったよ。
0463nobodyさん2005/06/29(水) 19:56:34ID:???
MojaviのContextクラスのアイデア(基幹オブジェクトの参照のコンテナ)
ってなかなか便利だな。各オブジェクトにこいつだけ渡せばいいもんな。
04644582005/06/29(水) 20:11:59ID:???
>>461
やべ、俺も誤解してた部分あるかも。
頭に入れとこ。THX。

>>462
フィルタってキタナイやつをストップさせて、キレイなやつを通してやるのが目的じゃないの?
コマンド実行ってのはどうとらえたらよいのだろうか・・・?
まーMojaviのソースって、手本になるような美しさがあるかは別として、発想力に富んだ内容だと思う。
うなづける部分が多いね。

>>463
同意。Contextってネーミングもウマイ。
俺的にはgetAction()欲しかった。
自分で追加するのは簡単だけど、Mojavi3完成時に辻褄合わなくなるのも嫌だしな。
俺は根性なしだ・・・。
0465nobodyさん2005/06/29(水) 20:47:55ID:???
>>461
ガーン
俺も勘違いしてた。
ロジックは別に書くべきなのか。
04664612005/06/29(水) 21:20:57ID:???
そうそう、MVCと三層構造って別パラダイムなんだよな。
ごっちゃにしてる奴も多いと思う。
今ロジックの中でRequest読んでデータ処理するように書いてたんだが、
Requestは多分プレゼンテーション層かな?
Action段階で取り出して、ロジックに渡した方がいいのかな。
今度はActionとロジックの区分けに悩みはじめたよw
0467nobodyさん2005/06/29(水) 21:40:13ID:???
どうも四層になってるらしい。
中間層がWeb層とビジネスロジック層に分かれてるとか。
てことはやっぱりRequestはActionだろうな…ハァむづい。
0468nobodyさん2005/06/29(水) 23:37:36ID:???
Model = ビジネスロジック
View = プレゼンテーション
Control = コントローラー
ではないのか?
0469nobodyさん2005/06/30(木) 02:18:44ID:???
>>468
「Model = ビジネスロジック」ってのは間違ってまっせ。
0470nobodyさん2005/06/30(木) 03:26:39ID:???
>>469
じゃあModelとは何よ?
0471nobodyさん2005/06/30(木) 05:29:25ID:???
MVCのモデルの中に閉じ込められるビジネスロジックというのは、
業務のキモとしてのデータの取り扱い方という形だけになるんだと思う。
ビジネスロジック呼ぶものがそれ以外にもあったとしてもね。
0472nobodyさん2005/06/30(木) 07:04:12ID:???
>>471
Modelのその他の役割は?
0473nobodyさん2005/06/30(木) 07:45:00ID:???
そんな難しい話してないで感覚で作ろうぜ
0474nobodyさん2005/06/30(木) 08:59:34ID:???
MojaviってStrutsの劣化コピーだよ。
0475nobodyさん2005/06/30(木) 09:01:20ID:???
GUIのあるアプリケーションのMVCとWEBのMVCを一緒に考えるのはおかしい。
0476nobodyさん2005/06/30(木) 09:13:29ID:???
結城浩はオブジェクト指向プログラミングに関する書籍で実績がある人だから。
好き嫌いはあるだろうけど。
0477nobodyさん2005/06/30(木) 09:17:08ID:???
http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/app-arch/app-arch2.html
なんとなくまとまってるような気がするべ
0478nobodyさん2005/06/30(木) 15:37:35ID:???
SafafiでMojaviJapanのサイトを見ると化けまくりな件について
0479nobodyさん2005/06/30(木) 15:48:51ID:???
>>478
ソース見たら、11行目、metaのcopyrightのところが文字化けしてんな。
MSBが立ってる文字が3バイトあるのでUTF-8の「©」でも突っ込んだんではないかと。
0480nobodyさん2005/07/01(金) 00:13:28ID:???
http://pc8.2ch.net/test/read.cgi/php/1117945031/669
これ書いたの漏れなんだけど、なぜphpでMVCにこだわるの?
その答えは散乱しちゃうから、上のスレにレスくれれば良いとして
MVCについて出来る範囲で答えますよ。

漏れはphpは最近始めたばかりで、今まではJavaばっかり。

>>466
>今度はActionとロジックの区分けに悩みはじめたよw 
教科書のような説明だと、Actionにロジック書くのはNGだけど書いても
嫌がられない場合もあるよ。
それはロジックが大したこと無いとき。MVCで、なんで役割ごとにバラバラ
にするかって?それは、再利用性、保守性を上げるため。
再利用もしないし、コードの見通しが悪くなるほど量も無いし、
変更も頻繁に入らない。そんなコードは堂々とActionに書いちゃって良いと
思うよ。
0481nobodyさん2005/07/01(金) 00:28:02ID:???
>>461
>Actionクラスはプレゼンテーション層だから
>あまりロジックは書かない方がいいんだな。

別にそんなことはない。
0482nobodyさん2005/07/01(金) 00:36:04ID:???
50行くらいならActionの中に書いてもいいよ
0483nobodyさん2005/07/01(金) 00:38:57ID:???
mojaviの場合はaction自体も再利用しやすいじゃん。
だからそういうふうに書けばいいんじゃないの?
0484nobodyさん2005/07/01(金) 02:57:45ID:???
>>483
Actionクラスを再利用するケースなんてないと思うけどな。
再利用するくらいなら、そのActionにマッピングされたURLを使い回せばいいし。
0485nobodyさん2005/07/01(金) 12:31:12ID:???
諸君、Actionには何を書くんですか?
0486nobodyさん2005/07/01(金) 20:29:53ID:???
>>485
ビジネスロジック
0487nobodyさん2005/07/02(土) 02:01:02ID:???
前に誰かいってたけど
evalの動的クラス定義おもろいな
テンプレートだけ作れば、actionもviewも用意しなくてもいいようにでけた。
0488nobodyさん2005/07/02(土) 02:33:30ID:???
>>487
そうするとテンプレートのファイル名まで命名規則が必要だな
0489nobodyさん2005/07/02(土) 02:35:01ID:???
>>484
>>375
0490nobodyさん2005/07/02(土) 02:36:08ID:???
>>488
必要もなにも、普通規則つけてるだろ
0491nobodyさん2005/07/02(土) 02:46:23ID:???
>>487
> evalの動的クラス定義おもろいな
そこにevalを使いたがる香具師の心境がわからん罠
0492nobodyさん2005/07/02(土) 02:49:21ID:???
>>487
なんか恐ろしい穴になりそう
0493nobodyさん2005/07/02(土) 04:11:31ID:???
>>492
allowedActionListでも作れば無問題
0494nobodyさん2005/07/02(土) 06:23:41ID:???
>>487
キモ過ぎ。
あんたとは一緒に仕事したくないな。
0495nobodyさん2005/07/02(土) 06:28:06ID:???
>>494
もっと説得力のある批判なら受付可
0496nobodyさん2005/07/02(土) 06:48:22ID:???
>>487は本当に独り言の好きな香具師だな、
と漏れも独り言を言ってみる。
0497nobodyさん2005/07/02(土) 16:14:50ID:???
>evalの動的クラス定義おもろいな
$class()でいいやん。

>テンプレートだけ作れば、actionもviewも用意しなくてもいいようにでけた。
身の毛もよだつキモさだな。
0498nobodyさん2005/07/02(土) 17:50:42ID:???
↑new $class()とevalの根本的な違いが分かってない奴
0499nobodyさん2005/07/02(土) 18:47:26ID:???
evalイラネ
0500nobodyさん2005/07/02(土) 18:52:16ID:???
evalには無限の可能性がある
0501nobodyさん2005/07/02(土) 18:55:39ID:???
その通り。可読性を下げる可能性までもある
0502nobodyさん2005/07/02(土) 21:52:19ID:???
mojavi3で新規登録とかでよくある
パスワードと確認用パスワード
を比べるみたいな設定ってどうやったらいいの?
0503nobodyさん2005/07/02(土) 22:02:22ID:???
夢広がりんぐevalメディア
0504nobodyさん2005/07/02(土) 22:21:14ID:???
>>502
Action::validate()の中でやるかValidator書くかのどちらかかと思ふ。
0505nobodyさん2005/07/03(日) 14:01:39ID:???
evalは実行パフォーマンスも悪いし、ちゃんと対策ほどこさないと任意のコード実行される恐れがあります。
0506nobodyさん2005/07/03(日) 17:26:50ID:???
というわけで、まだeval使いたいアフォな人いますか?
0507nobodyさん2005/07/03(日) 18:15:06ID:???
eval なんて確実に自分が書いた変数しか入らない場合でしか怖くて使えない。
注意していても万が一ってのがある品・・
0508nobodyさん2005/07/03(日) 19:58:15ID:???
お前の関数ほど恐ろしいものは無いのにな。
0509nobodyさん2005/07/03(日) 20:07:47ID:???
mojaviって何を基準にモジュールを変えるもんなんですか?
掲示板なら管理画面と本体みたいな感じでいいんですか?
0510nobodyさん2005/07/04(月) 00:00:07ID:???
確かにモジュール分割悩むよな
てかモジュールいらなくね?とすら思う
0511nobodyさん2005/07/04(月) 13:52:14ID:???
eval使えない奴はチキン野郎
0512nobodyさん2005/07/04(月) 15:34:12ID:???
使えない奴なんか見たことない
使えるけど使わない
使う必要すらない
使う奴のほうがチキン
>>511は何にevalを使ってらっしゃるの?
0513nobodyさん2005/07/04(月) 15:37:50ID:???
>>512
うるせえカマ野郎
■ このスレッドは過去ログ倉庫に格納されています