- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
396 :デフォルトの名無しさん[sage]:2016/06/30(木) 02:55:36.63 ID:Uofv8D3y - 例えばクラス Hoge でログ出力が必要な場合、Hoge は Logger のインタフェースさえ知っていればよく、Logger が内部的にどんなものが必要かを知っている必要は無い。
もしクラス Logger がログ出力のためにクラス DBConnection が必要な場合、Logger は DBConnection のインタフェースさえ知っていればよく、DBConnection が内部的にどんなものが必要かを知っている必要は無い。 もちろん Hoge の処理の呼び出し元だって、Hoge が内部で Logger を使っていることなんて知っている必要は無い。 いやむしろ、知っている必要が無いというよりは、知っているべきではない。 仮に Hoge の呼び出し元(Controller とする)がそれらを知っていなければならないとしたら、Controller は Hoge が必要としている Logger、Logger が必要としている DBConnection をお膳立てしなければならない。 もし DBConnection がもっと他の何かを必要としていたらどうする? もし Logger が差し替わり、DBConnection ではなく LogFile を必要とするようになったらどうする? と、収集がつかなくなる。 だから Hoge は自身が必要な Logger は自分で取得し、Logger は自身が必要な DBConnection なり LogFile なりを自身で取得しなければならない。 これを系統だってやろうとすると >>394 の言うように DI になる。 DI によって末端のクラスが必要とするいろんなものを上流からたらい回しにする必要が無くなり、各層を純粋な処理のためだけのインタフェースで繋げられるようになる。 Controller になんでも置いとけというのは結局オブジェクト指向から逸脱するということ。 で自動的な DI を使えない環境では、同じようなことを実現するための取っ掛かりとしてクラスのスタティックメンバに頼ることになる(というほど大層なことではないが)。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
397 :デフォルトの名無しさん[sage]:2016/06/30(木) 02:56:09.75 ID:Uofv8D3y - ようは、$controller->getLogger() とか $controller->getDBConnection() を用意するということは、末端の処理に依存してしまっているからこれを止め、
Logger::getInstance() とか DBConnection::getInstance() を使えるようにし、使いたい処理が必要なもののインスタンスを勝手に取得すればよい。 次にクラスの実体として必要とされるものを選択するため、getInstance がコンフィギュレーション等に基づいてその時必要とされる具象クラスインスタンスを返すようにすれば DI みたいなものになる。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
401 :デフォルトの名無しさん[sage]:2016/06/30(木) 03:15:42.51 ID:Uofv8D3y - >>399
単純に >>367 は Hoge の中で他で使ってるのと同じ $mysqli を参照する方法を聞いてると思われ、 その選択肢としてはグローバル変数を使うか、Hoge の外から $mysqli を与えるのか、はたまたどんなやり方があるのか? という話からの流れで、これができれば何でも一応の正解だけど、そこから話を膨らませてる感じかな、個人的には。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
430 :デフォルトの名無しさん[sage]:2016/06/30(木) 18:07:05.46 ID:Uofv8D3y - >>426
それはそうなんだけど、>>425 をブルクォートにしてもうまく動いちゃうよね。 ダブルクォート内でエスケープが定義されてない文字をエスケープするとそれは元の文字列になり、エスケープできる文字はそれが表す文字に置換される。 たとえば "\t" は定義されてるからタブ1文字に置換されるし、 "\A" は定義されてないから文字列 \A という元のままの文字列になる。 正規表現で例示すれば、 "/\A.\t,\z/" → /\A.(タブ).\z/ "/\\A.\\t.\\z/" → "/\A.\t\z/ となって、異なる文字列になる。 でもどっちの書き方をしても、preg_match では同じようにマッチする。 だから正規表現のパーサーがうまいことやってるんだと思う。 でもこれって正直ややこしいなぁといつも思う。 \ 自体を表すときに数がわからなくなったりw
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
437 :デフォルトの名無しさん[sage]:2016/06/30(木) 19:03:06.38 ID:Uofv8D3y - >>436
んなことは分かってるさ。 分かってるけど \\\\ というのには少々おののくってこと。 若干話は逸れるが、シェルスクリプトでコマンドラインを構築する処理とかも目がチカチカしてくる。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
438 :デフォルトの名無しさん[sage]:2016/06/30(木) 19:10:30.08 ID:Uofv8D3y - >>435
グローバルな名前空間で参照できるクラスと、グローバル変数には決定的な違うがあると思うんだ。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
443 :デフォルトの名無しさん[sage]:2016/06/30(木) 19:44:17.77 ID:Uofv8D3y - >>440
なぜグローバル変数がいけないのか、これがその哲学の出発点になるのかな。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
446 :デフォルトの名無しさん[sage]:2016/06/30(木) 19:53:14.55 ID:Uofv8D3y - >>406
ちょっと話はそれるが、 > http://123456.uy.co.jp/index.php そういうインデックスまで URL に明示したらインデックスの利点半減だよね。 http://123456.uy.co.jp/ と省略すれば都合によって実体を index.php でも index.html でも他の CGI かなんかでも好きな方式を採れるし、後から切り替えることだってできるのに。 おれが関わってる某サイトも http://example.com/index.html なんて URL を印刷物なんかに示しちゃってるんだよな。 省略することを進言したけど、全く変わらんなぁ ちなみに、後で index.php に差し替えたくなったら .htaccess でリライトする予定w クソだよクソ
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
447 :デフォルトの名無しさん[sage]:2016/06/30(木) 20:01:23.13 ID:Uofv8D3y - >>445
そのたとえはあまりイケてるようには思えないなぁ まあ例え方には思想が表れるから、そこを突っ込んでいくと今度は宗教論争になりかねないがw なんにしても、まず当たり前だと思い込んでいたところに目を向け考えるということが肝心だと思うよ。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 6 [無断転載禁止]©2ch.net
450 :デフォルトの名無しさん[sage]:2016/06/30(木) 20:21:25.25 ID:Uofv8D3y - >>448
規模にもよるけど Web くらいだとコントローラに全部持たせてもなんとかなっちゃうかも。 仕様変更を重ねるといろんな取得メソッドが増えていき、いらなくなったものも判別つかず「念のため」残して謎のメソッドとして溜まっていき、 本当にやりたい処理では必要もないリソースもよく分からないから「念のため」確保をして CPU時間やメモリを無駄遣いすることになっても、まあ放置できたりする。 それをリプレイスする時に整理のチャンスが来るけど、結局読み解くことができず「念のため」謎のメソッドごと移植対象になって無駄なコストが発生するが、 予算を謎メソッド込のコード規模で見積もれるなら問題無い。
|