【PHP】下らねぇ質問はここに 9

■ このスレッドは過去ログ倉庫に格納されています
2017/12/20(水) 18:00:20.28ID:1xaO/YRR0
PHPに関する質問スレです

前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 8
http://mevius.5ch.net/test/read.cgi/tech/1489506082/

次スレは>>980以降
本文の1行目に以下を追加すること
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/09/04(火) 22:55:22.87ID:JkSql3w10
>include('/path/file.txt');

/ から始まっているから、何かからの絶対パスかな?

プロジェクトルートか、公開サイトのルートからの絶対パスかな?
2018/09/04(火) 23:04:14.00ID:2slzjYMb0
上のは言ってみればfile://になるんじゃないの? 違う?
2018/09/05(水) 16:46:47.73ID:dwWFM3zt0
公式のmail()とmb_send_mail()のページを見ていたのですが、
mail()のsubjectは表題、messageはメッセージ、
mb_send_mail()のsubjectは件名、messageは本文となっていました。
これは何かが違うということでしょうか。
くだらない質問と思いますが、よろしくお願いします。
2018/09/05(水) 17:13:31.91ID:eC5bTWUj0
全く同じ意味ですが異なります
この事に気をつけて厳密に取捨選択し、
どっちでもいいから適当に使いましょう
2018/09/05(水) 17:23:40.98ID:HJ2kcLma0
mailはエンコードしてくれないから自分でしてから呼び出す。
mbはエンコードしてくれる。

というか、ググれよ!
2018/09/05(水) 17:28:21.76ID:+CD9GwZX0
どっちの関数も直接使うには勝手が悪いので、さっさと基礎理解してライブラリ使うようにしましょう。
2018/09/05(水) 17:46:40.68ID:dwWFM3zt0
アドバイスありがとうございました。
619デフォルトの名無しさん (ワッチョイ 969e-O+me)
垢版 |
2018/09/06(木) 17:01:57.65ID:kzkzi/Yy0
<form method="get" でsubmitした場合、
$_GETを使うのが普通だと思うのですが
$_POSTでも値が取れるのですが、そういうもんですか?
2018/09/06(木) 17:39:08.61ID:bmlthp5L0
普通だけど普通じゃなくなって来たから、filter_input使う。
このスレの上の方にも出てる。
2018/09/06(木) 19:14:57.47ID:xdo6cDUj0
>>619
それちゃんとGETメソッドで送ってる?
GETとPOSTでは受け渡し方法が違うから
ちゃんとやっていればPOSTでは受けとれないはず
622デフォルトの名無しさん (ワッチョイ 969e-O+me)
垢版 |
2018/09/06(木) 20:05:38.46ID:kzkzi/Yy0
>>621
WordPressなんですが、
form タグを埋め込んでbuttonクリックでsubmitしているので間違は無いと思います。
でも何故か$_GETでも$_POSTも値が取れるんです。
2018/09/06(木) 20:59:34.70ID:bmlthp5L0
GETとPOSTと両方送ってるとかじゃないの…w
624デフォルトの名無しさん (ワッチョイ 8b80-f65Y)
垢版 |
2018/09/06(木) 21:15:35.52ID:64ZwjQvb0
methodをgetでサブミットしてるなら
HTTPプロトコルではcontent bodyの部分は空になる
そういう仕様だからな
つまり通常postで取得できる部分はからっぽ

methodをpostでサブミットしてるなら
そういう状況はHTTPプロトコルでも十分にありえる
uriにurlエンコードされた文字列が含まれる状況でpostしたケースならありえるということになる

ちなみにオレはスクリプトの変数にその値がどう格納されるかは知らない

質問してるヤツは

 getでサブミットしてんのになんでそんなことがおきんの?

というのが質問の主旨と理解した
低学歴知恵遅れがその質問をどう解釈したかは知らない
2018/09/06(木) 21:39:08.51ID:xdo6cDUj0
>>619
サーバーのログって見ることは出来ない?
リクエストがどういうメソッドでやり取りされたか分かると思うけど
2018/09/06(木) 22:24:24.23ID:bmlthp5L0
>>624
冗談にムキになって… 低学歴知恵遅れとかw
主旨についてはわかってて書いてんの。
それが5chというところだから。
627デフォルトの名無しさん (ワッチョイ 8b80-f65Y)
垢版 |
2018/09/06(木) 22:27:25.22ID:64ZwjQvb0
はい低学歴知恵遅れ図星
ごまかそうとしても
もうバレてるからな

分かりやすいわ。。。
2018/09/06(木) 22:52:05.75ID:bmlthp5L0
正解です。でも知恵遅れはないよ。
2018/09/06(木) 22:55:48.48ID:xdo6cDUj0
冗談は冗談が通じる相手にしないと

この質問者はPOSTとGETについて理解できていないんだから
冗談だとは受けとってないと思うぞ
2018/09/06(木) 22:59:57.65ID:bmlthp5L0
冗談とは言え、とりあえずパケットキャプチャしてみたら?に行き着いて欲しかったんだけどな。
その後、フレームワークなりの変数の検査するとか。

やり方を切り分けて絞り込んでいかないといけない。
2018/09/07(金) 09:44:56.47ID:9ghtkfrV0
PHPを始めたのですが分からないことがあるので教えてください。

https://qiita.com/mpyw/items/2f9955db1c02eeef43ea
上記ウェブサイトに次のコードがあるのですが、配列?を使用する理由を教えてください。

if (!isset($_POST['email'])) {
 $errors[] = 'Eメールアドレスが送信されていません';
} elseif ($_POST['email'] === '') {
 $errors[] = 'Eメールアドレスが入力されていません';
}

よろしくお願いします。
2018/09/07(金) 10:03:27.93ID:0+aYiLfb0
>>631
この例文の中では特に意味はない。post したページに戻る際、エラーをまとめて送る時に使う。
2018/09/07(金) 10:16:38.86ID:9ghtkfrV0
>>632
このような使い方もあるんですね。
教えてくださり、ありがとうございました。
634デフォルトの名無しさん (ワッチョイ 7ad0-O+me)
垢版 |
2018/09/09(日) 16:54:11.51ID:kcIkPUJb0
HTMLとPHPを使ってメールを送信するため、次のように書いたのですが、良いか悪いか判断ができません。
右も左も分からないため、どのようなことでも構いませんのでアドバイスをください。
メールは【入力】→【確認】→【送信】の流れで送信されます。
どうか、よろしくお願いします。

【input.php】
https://ideone.com/cEGHAA



【check.php】
https://ideone.com/R9GueN



【thanks.php】
https://ideone.com/R2mR1b
2018/09/10(月) 09:10:57.34ID:LEZi3nV80
form.php
confirm.php
send.php
こうすると良いと思う
636634 (ワッチョイ 7ad0-O+me)
垢版 |
2018/09/10(月) 14:59:46.15ID:Jh3v7l2E0
>>635
アドバイスありがとうございます。
辞書を引いたら納得しました。
さっそく反映したいと思います。
2018/09/10(月) 20:03:31.22ID:LEZi3nV80
ネタにマジレスしてるんで、仕方ないからチラ見してみた。
このスレのダメな例の集大成みたいだな。

受け取った値の長さに制限を掛けて、巨大データを受け入れないようにする。
HTML側でもmaxlengthやtype="email"やrequiredを使うと気休めになるかも。
PHP側でも長さをチェックする。

filter_inputの使い方が違う。
受け取った価をあえて$_SESSIONに入れてどうする?
それは使わずに$subjectとかに代入する。

mail関数に入れるデータはエンコードするか、mb_send_mailを使う。

あとは動いてるならいいんじゃない?
2018/09/10(月) 21:25:32.24ID:AQjUY5xrM
勉強のためならいいけどガチでサービスに導入とかはしない方がいいと思うよ
既存のサービス使った方が絶対に安全
639デフォルトの名無しさん (ワッチョイ 532a-5rD0)
垢版 |
2018/09/11(火) 12:49:51.36ID:swAVBRLl0
class内のプロパティに関数って指定できないでしょうか?

class Test {
public $date = date("Y-m-d");
}

というイメージです。これを記述しても
Parse error: syntax error, unexpected '(', expecting ',' or ';'

というエラーが出るので無理だと思っているのですが、
できる方法があれば教えてください。
2018/09/11(火) 13:07:18.10ID:B2tEflKb0
やり方はいろいろあるが、一般的にはコンストラクタの中で代入するんじゃないかな
2018/09/11(火) 13:07:35.88ID:7DNsPvsqM
やり方はいろいろあるが、一般的にはコンストラクタの中で代入するんじゃないかな
642634 (ワッチョイ 7ad0-O+me)
垢版 |
2018/09/11(火) 17:53:48.50ID:sA/7deNB0
>>637
アドバイスありがとうございます。
次を課題に学習を進めたいと思います。
・HTMLとPHPで値の長さに制限を掛ける
・filter_inputの使い方を理解する

mail関数に関してもmb_send_mail関数と合わせて考え直します。
セッション変数については入力されたデータを持ちまわる体で使用しようと考えているのですが、type="hidden"の方が良いのでしょうか。
今は自身の理解が不足しているので、もう一度最初から取り組みます。

アドバイスありがとうございました。

>>638
アドバイスありがとうございます。
やはり既存のサービスの方が安全ですか。
今は自身のために勉強したいと思います。

アドバイスありがとうございました。
2018/09/11(火) 19:04:42.02ID:Of5zYKw20
>>642
hiddenよりはセッションを使ってください。
なんか勘違いしてそうだから。
https://teratail.com/questions/63786
2018/09/11(火) 20:24:28.80ID:NY6FXi0j0
このくらいのフォームなら hidden の方がいいんじゃね。
セッションでなんかメリットある?
2018/09/11(火) 21:33:19.08ID:Of5zYKw20
使い方を間違えてるから正した方が良いと思っただけ
646634 (ワッチョイ 7ad0-O+me)
垢版 |
2018/09/12(水) 08:16:38.34ID:uWMSldyR0
>>643
参考URLありがとうございます。
hiddenとセッションの使い分けを勉強します。
2018/09/12(水) 08:31:17.86ID:t1WfAWi+0
>>646
う、うん。
でも一番はそこじゃないんだな。
スーパーグローバル変数を書き換えるべきではないのに、
そらをしてしまっているところね。
そもそもスーパーグローバルを使わないためのfilter_inputだから。
最初は誰でもそんなもんだから頑張ってね。
648634 (ワッチョイ 7ad0-O+me)
垢版 |
2018/09/12(水) 08:36:21.52ID:uWMSldyR0
>>647
さっそく勘違いしてしまいました。
アドバイスありがとうございます。
2018/09/12(水) 11:26:01.33ID:/jhmkHwQ0
どうしてもわからないので質問お願いします。

私はWindows7でxamppを使いPHPを動かしています。
類似画像の比較のため「libpuzzle」というライブラリを使いたいのですが、インストールのやり方がわかりません。
インストールが簡単とのことで下記のページを参考にしようと思っているのですが、何をやっているのかわかりません。

https://fei-yen.jp/maya/wordpress/blog/2011/05/05/php%E3%81%A7%E7%94%BB%E5%83%8F%E3%81%AE%E9%A1%9E%E4%BC%BC%E5%BA%A6%E5%88%A4%E5%AE%9A%E3%81%AE%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/

ひとまず「libpuzzle-0.11.tar.bz2」はダウンロードしました。
2018/09/12(水) 12:09:08.51ID:t1WfAWi+0
そのURLを見たけど、tarファイルを展開してLinuxでコンパイルしてるよね。
この時点でWindowsはまったく該当しないので見てもわかるわけない。
Windows用のコンパイル済みバイナリをインストールするのが正解かと。
それか、そのファイルをWindowsで自前コンパイルするか。
2018/09/12(水) 12:24:56.89ID:/jhmkHwQ0
ありがとうございます。

いくつか調べてlibpuzzleがC言語で作られているはわかりました。
Windowsだとsoファイルではなくdllファイルで動かすみたいだから
libpuzzle.cをコンパイルしてdllにする、という感じなのでしょうか?
2018/09/12(水) 12:36:07.34ID:t1WfAWi+0
はい。恐らく…
2018/09/12(水) 14:11:08.65ID:/jhmkHwQ0
C言語は…、ちょっというかさっぱりわからないですね…。

GitHubでlibpuzzleの解凍されたフォルダが有りました。

https://github.com/jedisct1/libpuzzle

もし参考になれば
2018/09/12(水) 16:38:39.22ID:bjh9HqnE0
>>647
そこで言ってるスーパーグローバルの書き換えって $_SESSION のこと?
2018/09/12(水) 19:23:24.37ID:t1WfAWi+0
>>654
そう。
言われてハッとしたんだが、もしかして俺すげー嘘ついてる?
フレームワーク無しなら$_SESSIONに代入せざるを得ないか?
何かもう忘れたわ。

適当な記憶でたまに嘘ぶっこくから少し自重する。
2018/09/12(水) 19:28:11.72ID:WDc70fCa0
面白い議論だと思ってたんだけど
できれば続けてくださいな

セッションは使用禁止にすべきかどうかまで
2018/09/12(水) 21:31:55.13ID:bjh9HqnE0
>>655
うん、$_SESSION はこれを直接触る以外のアクセス方法は無いと思う。
そしてセッションのクリアとか考えるのも面倒なので、今回のケースだと hidden の方が手軽だと思う。
2018/09/12(水) 23:14:04.91ID:/jhmkHwQ0
libpuzzleはインストールが困難と判断したので、
他のものを調べたところ、Perceptual Hashが良さそうだったので変更しました。

コンポーザーをダンロードして、インストールはできました。

ですが、実行すると「Uncaught Error: Class 'Jenssegers\ImageHash\ImageHash' not found」といったように認識されません。
Windows7のXAMPPだとuseの書き方が違うのでしょうか?
ソースは以下の通りです。


use Jenssegers\ImageHash\ImageHash;
use Jenssegers\ImageHash\Implementations\DifferenceHash;

$hasher = new ImageHash(new DifferenceHash());
$hash = $hasher->hash('path/to/image.jpg');

echo $hash;
// or
echo $hash->toHex();
2018/09/12(水) 23:14:32.81ID:/jhmkHwQ0
参考にしたURLは以下の通りです。
https://tech.unifa-e.com/entry/2017/11/27/111546
https://github.com/jenssegers/imagehash
2018/09/13(木) 00:39:50.34ID:Mmakf2Wk0
ちゃんとautoload.phpをrequireしてるか?
2018/09/13(木) 07:41:47.23ID:WElsz8IU0
>>648
>>657だって! 本当に申し訳ないです。
2018/09/13(木) 08:13:46.95ID:1dHQYyj40
投稿フォームは、確認画面なくすと session 使う必要がなくて、スマートな実装になるよ。
そもそも確認が必要な内容かどうか検討してみると良いです。
確認が必須なら、モーダルで一旦表示させて投稿させると UX も向上して happy。
ただ、画面はちょっとややこしくなるけどねぇ。。。
2018/09/13(木) 09:25:37.97ID:Rrxby3/D0
>>660
何それ…
やってない
帰ったらやってみる
2018/09/13(木) 17:07:19.50ID:yxnhKk7t0
>>634のfilter_inputって使い方間違ってるん?(´・ω・`)
2018/09/13(木) 18:13:28.78ID:WElsz8IU0
美しさはともかく、間違ってはいない。
勘違いしていたのは俺…
申し訳ないです。
666デフォルトの名無しさん (スッップ Sdbf-t6RF)
垢版 |
2018/09/14(金) 11:13:27.37ID:LYVyvVvXd
提唱者が逃げ出したから、
こういう時にどう使ったら良いか
教えてくれない
2018/09/15(土) 11:16:20.77ID:h4tGgfju0
ユーザー入力を画面上に表示する場合、どんな時でもhtmlspecialchars関数を使った方がいいんですか !?
2018/09/15(土) 11:29:57.48ID:4K9/kzuG0
>>667
個人的にはここの説明が納得しやすかった
https://qiita.com/mpyw/items/19e6fed835ccdbcb0d6d

画面表示で Content-Type: text/plain の時は、当然だけど必要無い。
text/html な中で、text/plain はちょっと思いつかなかった。
だれかフォローよろしくw
2018/09/16(日) 09:00:18.99ID:yeSA5Nar0
考えられるパターンとしては
1.入力値の検証はせずそのまま出力する
2.入力値の検証はせずhtmlspecialcharsを使う
3.入力値の検証→問題はないのでそのまま出力
4.入力値の検証→問題なのでhtmlspecialcharsを使う
5.入力値の検証→問題はないがhtmlspecialcharsを使う
6.入力値を出力前に無害化してそのまま出力

1は当然やっちゃだめ
6は元の入力値と異なる可能性が生まれるので使うなら重要でない箇所限定(非推奨)
5は冗長だが5が一番おすすめ
2018/09/16(日) 19:43:02.43ID:Fs79WbqO0
phpの質問じゃないかもしれないんだけど
URLから指定のディレクトリにアクセスした時に
ファイル名が何だろうと指定のファイルを参照させることって出来ますか?

hoge.com/rand/test.txt
hoge.com/rand/aaa.jpg

randディレクトリにアクセスしたら
ファイルの有無に関わらず
hoge.com/rand/index.phpを参照させて
test.txtやaaa.jpgのURL文字列に応じて
phpが振る舞いを変えてコンテンツを表示させたいです

そんなこと可能でしょうか?
2018/09/16(日) 19:57:17.91ID:Fs79WbqO0
要するに
hoge.com/rand/aaa.jpg
を見てるつもりで
hoge.com/rand/index.php?q=aaa.jpg
で内部的に処理して返したいってことです
2018/09/16(日) 20:17:40.26ID:xrMzIoGe0
mod_rewrite使うとか
2018/09/16(日) 20:28:28.45ID:Lgam3puB0
file(”aaa.jpg”)
で表示できたような
2018/09/16(日) 20:31:03.90ID:Lgam3puB0
print file($_GET[q])
だったかな
忘れた
2018/09/17(月) 01:27:02.97ID:aY8QKU/10
>>671
mod_rewriteを使って、

RewriteCond %{REQUEST_FILENAME} hoge.com/rand/(.*)$
RewriteRule ^hoge.com/rand/(.*)$ %1/%2/index.php?q=$1

こんな感じでリクエストを書き直す?
うまく行くかちょっと自信ない
2018/09/17(月) 11:11:17.62ID:B1zUo4Ps0
PHPの処理はHTMLの外で行い、結果だけをHTMLの中に表示する方法が良いんですか?(´・ω・`)
2018/09/17(月) 12:21:19.45ID:hbuTlOjm0
>>676
その方がいいと思うよ。
HTMLを修正する理由と処理を修正する理由は大抵違うから、それぞれ分けておくと都合がいいと思う。
分業の面でもいいし、処理の見通しも良くなる。

ただそう作るなら、表示(見た目)のためのコードは処理側から排除するのがいいと思う。
エスケープはもちろん、例えばマイナスの数値を表示するのに▲を付ける仕様だったとして、それを行うコードはHTML側に実装する感じ。
処理側で▲付きの文字列を作るようなことするとカオスになっていく。
2018/09/17(月) 12:29:30.95ID:hbuTlOjm0
>>676
そしてPHPはHTMLを分けるというのが非常に簡単にできるから、やらなくちゃ損くらいに思った方がいい。

<?php
:
いろいろ処理;
:

include 'gamen.html';
?>

みたいに include するだけで表示されるんだから。
実際には gamen.html にはわずかなPHPコードも入る純粋な HTML ではないから拡張子を .html とするよりは、.php なり .tpl(テンプレート)なりそれっぽいのにしておくといいと思う。
案外 .php にしておくと、ブラウザからそれを直接見てもPHPのコードは直接見えないから手軽な安全策かも。
2018/09/17(月) 15:38:02.41ID:B1zUo4Ps0
>>677
>>678
分けた方が管理しやすいですか(゜-゜)
ありがとうございました。
680デフォルトの名無しさん (アウアウカー Saeb-Gwc+)
垢版 |
2018/09/18(火) 18:36:46.23ID:LS9+DTCza
今回乗っ取りが可能な脆弱性が発見されましたが、その脆弱性を試したいです。
どうすればいいのでしょうか?
2018/09/19(水) 12:22:09.46ID:hsm6EpoV0
Bug #76582が原因らしいからバグレポート読んでみたら?
再現コードも書いてるよ
まぁ単にXSSが可能だったってだけでそれ以上でもそれ以下でもないが
682デフォルトの名無しさん (ワッチョイ bf4b-72gh)
垢版 |
2018/09/19(水) 20:12:04.29ID:2g+A18ll0
laravelを始めようと思うのですがrailsと比べて何が良くて何が悪いのか聞きたいです
僕自身railsはチュートリアルやったくらいしか知りません
683デフォルトの名無しさん (ワッチョイ 2d8a-Lcjh)
垢版 |
2018/09/20(木) 08:52:56.46ID:2cUVSblD0
set_file_buffer (stream_set_write_buffer)が動作しないということが2003年ごろから言われているみたいですが
今さっき検証してみたところやはり-1が返ってきて動作していないようです
何故こんな関数が未だに存在しているのか、わかる方よろしくお願いします
http://jp2.php.net/stream_set_write_buffer
2018/09/21(金) 10:36:19.22ID:0nwAv71v0
POSTされた値を最初に変数に代入してから検証するのと、
検証してから変数に代入するのとでは安全性に違いはありますか?

変な質問で申し訳ない(´・ω・`)
2018/09/21(金) 12:16:47.46ID:CXW/z+bx0
一概には言えないが、値の検証はその値を使う直前にやるのが一番良い
検証の後に不用意に値が書き換わってたら検証の意味がない
2018/09/21(金) 16:41:58.26ID:0nwAv71v0
>>685
いただいたレスを参考に考えた結果、値を使う直前に検証することにしました。
アドバイスありがとうございました。
2018/09/21(金) 18:17:31.43ID:2dxDcAKa0
>>658です。
お返事遅くなってしまい申し訳ないです。

>>660
うまくいきました。
XAMPPだと相対パスだとうまく行かなかったのですが、
絶対パスだとうまく行きました。

どうもありがとうございます。
2018/09/25(火) 17:01:58.96ID:CUEvMMrT0
if($A === $B){
 $A;
}else{
 $B;
}



if($A !== $B){
 $B;
}else{
 $A;
}

って どっちが良いですか !?
って聞かれても俺にはわかんねーよ(´・ω・`)
というグチ
2018/09/25(火) 17:46:06.44ID:NyMQ4nya0
名前がつかない例外を受け取ることは難しいね
2018/09/25(火) 20:15:13.42ID:yenf1piQM
>>688
!== より === の方がタイプする労力が小さいから前者
2018/09/25(火) 20:25:06.12ID:YkAMOZHs0
結果は同じでもどちらに主軸をおくかによってニュアンスが変わる
例えばコンサート会場でチケットを持っている人は通し持ってない人は通さない場合

チケットを持っている人を通したいに主軸を置くと普通のスタッフを連想するが
チケットを持ってない人を通さないに主軸を置くと警備員のようなもっとお硬い物を連想する

$A===$Bを比較したいのか$A!==$Bを比較したいのか
自分が何をやりたいのかどこに主軸をおきたいのか考えれば自ずと答えは出るでしょう
2018/09/26(水) 01:33:34.79ID:QPkmxTlR0
thenが通常処理、elseが異常(エラー)処理ってイメージ
通常処理がn種類(複数)あるって感じな場合は、二択だったとしてもswitchにしてる
2018/09/26(水) 14:54:46.71ID:eJD5a6UK0
$var = getA();
if (!$var) {
 $var = getB();
}
if (!$var) {
 $var = getC();
}
if (!$var) {
 $var = getD();
}
if (!$var) {
 return false;
}

return $var;

こういうコードをもっとスッキリさせる書き方ってないですか?
2018/09/26(水) 15:24:24.44ID:aA/f+lgF0
orを使うといいかも
2018/09/26(水) 18:40:59.41ID:we9WvBjb0
get($ident)的な関数作って
$var=false;で初期化して
["A", "B", "C", "D"]をぶん回して見つかれば$var上書きしてbreak
2018/09/26(水) 19:38:26.60ID:Rr41G2Hg0
短絡評価でbooleanが返ってくる言語だからなぁ

return getA() ?? getB() ?? getC() ?? getD() ?? false;

でnullが返ってくると順次後ろに落ちていくようには出来る
falseが返ってくると打ち切られて結果もfalseになる
2018/09/26(水) 23:01:39.30ID:eJD5a6UK0
みなさんレスありがとうございます
実際はもっとメソッド名が長く、引数が複数あり、一つ一つが若干重い処理なので
現状が一番スマートのような気がしてきました
2018/09/27(木) 00:21:34.56ID:PI1koV5V0
Cなら関数ポインタを配列にツッコんでぶん回す
危険かどうかは触れない
2018/09/27(木) 10:36:27.42ID:kbPnGc7o0
メソッドに応じて引数も可変ならcall_user_func_array()使えばいいだけじゃない?
そんな大層な話しか?30秒で書けるがw

function hoge()
{
  $methodArr = [
    'A' => ['a', 'b'],
    'B' => [],
    'C' => ['c', 'd'],
  ];

  foreach ($methodArr as $method => $params) {
    if ($result = call_user_func_array($method, $params)) {
      return $result;
    }
  }

  return false;
}
2018/09/27(木) 10:42:54.79ID:kbPnGc7o0
行数的には>>693と大差ないが
$methodArrのところを定数にでもしておけば
動作に変更が入ってもそこの定義を変えるだけで済むわな

さすがに>>693はないわ
見ただけで頭がクラクラするw
2018/09/27(木) 10:50:13.05ID:kbPnGc7o0
>>688みたいに

if(){

}else{

}

と詰めて書く人ってPSRなんか読んだ事ないんだろうな

if () {

} else {

}

と書きなさい
2018/09/27(木) 12:20:21.79ID:mllxUQ0M0
>>700
>>693 の方がシンプルでスッキリしてて速くて分かりやすいコードだと思うよ。
>>699 の利点てなに?
2018/09/27(木) 13:37:29.99ID:7B8reSZgd
メソッドや引数が減ったり増えたり順序が変わったりした時に
699なら”コード”を触らず”定義”の修正だけで済むが
693だと”コード自体”を修正する必要があるな
2018/09/27(木) 13:54:32.47ID:PI1koV5V0
call_user_func_arrayなんてあったんだね。
じゃあこれ一択だわ。
理由は>703
2018/09/27(木) 13:55:31.21ID:mllxUQ0M0
>>703
hoge が呼び出す関数達の引数は hoge に渡された引数だったり別の変数だったりを含むんじゃないの。
それを事前に定義するって?
仮に定義できたとして、そんな内部のロジックに直結した定義を修正するのはコードを修正するのに加えてそんなに気安いことなの?

>>693 のコードを大体そのまま hoge.conf にでも書いて、

function hoge()
{
if(!@include_once 'hoge.conf') {
retur false;
}
return $var;
}

とでもする方がまだマシなんじゃね。
2018/09/27(木) 14:00:23.22ID:kbPnGc7o0
>>703
>>700に同じ事書いたんだけどなw

>>704
だよね

>>705
頭固いねw
理解できないならもういいわw
2018/09/27(木) 14:04:14.99ID:mllxUQ0M0
>>706
定義と称してロジックを別の形で書いてるなら、ロジックをそのまま書けばいいだろう?
んで引数に変数はどうやって渡すの?
2018/09/27(木) 14:06:18.58ID:PI1koV5V0
これは絶対にこうだって話でも何でもなく、おおよそこれまでの経験に基づく好みの方がデカいと思うけど。
>>693の実際のコードや運用保守まで知り得ないから、絶対こうだと第三者が結論づけるのはナンセンスだと思う。

自分は実際にこのようなケース(Cで)楽にメンテできた実績があるからこっちを選ぶけど、
こういう方法もあるよってディスカッションならどんどんやればいい。
2018/09/27(木) 14:09:57.57ID:7B8reSZgd
今更include_onceなんかを使ってるしむしろ693より悪化してるという
699みたいに動作定義を配列変数にしておけばその中に更に変数やメソッドの返り値を持たせることだってできるだろうに
2018/09/27(木) 14:10:07.99ID:mllxUQ0M0
>>708
うん、方法としては知っていていいものだからどんどん上げればいいと思うが、>>700 この言い草だからな。
2018/09/27(木) 14:12:14.74ID:mllxUQ0M0
>>709
その変数やメソッドの返り値を定義した具体例を挙げてみてよ。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況