PHP質問・雑談スレ4【初心者お断り(ROM歓迎)】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
PHPに関する質問や雑談をするスレです。
初心者お断り(ROM歓迎)と書いてますが、初心者用のスレが用意されているからで、
難しい質問や話題をしなければいけないわけではありません。
PHPマニュアルの読み方を概ね理解していて、関数リファレンスが正しく読める方用のスレです。
PHP未導入の方や、手取り足取りが必要な初心者の方はム板のくだスレへどうぞ。
http://mevius.2ch.net/tech/ (【PHP】で板内を検索)
前スレ
http://medaka.2ch.net/test/read.cgi/php/1486956982/
その他リンク
・PHPマニュアル
https://secure.php.net/manual/ja/index.php
・コードテスト・貼り付け用
http://ideone.com/
・プログラミングのお題スレ (求PHPer参戦)
http://mevius.2ch.net/test/read.cgi/tech/1480579110/
このスレで扱う話題
・PHPのコード,設定や設定値に関する質問
・常識的範囲内でのコードレビュー依頼・改良相談
・PECL,PEARに関する質問
・PHP新機能やPHP関連トレンドの話題
(FWや非公式ライブラリの話題や特徴比較は良いが使い方から先の話題は専スレへ)
・PHPのバグ発見報告・公式に報告する前の検証依頼
このスレで扱わない話題
・直接関係ない○○特有の質問(専スレへ)
(HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等)
・PHPの改造 $a = 10;
$b = $a || 20;
echo $b; //20
ごめんこれ10だわw
$a = 0って書いたつもり null合体演算子(??)を使え
短絡評価した結果何を返すのかなんて後から変えられるわけねぇだろ 型ってもんがあるからtrue/falseで返してくれないと怖い >>545
いっそそこまで覚悟出来るならやればいいとは思う
混乱はあったけど結果としてPythonの決断は正しかったのだろう
とは言え短絡評価を結果をbooleanにするのも最終評価値にするのも良し悪しだからなぁ 何が入るかわからないのがな
最悪を想定するなら短絡評価の前に中身の判別を入れなきゃならない
想定した型かどうか事前に判別するなら短絡評価要らない $b = (!empty($a)) ? $a : 20;
NULL合体演算子はissetだからだめだな JavaScriptも三項演算子使えるんだからそれでよくね
短絡評価は言語ごとに差があるからあんまり使いたくない 愚直でもわかりやすい判断分岐で書かれてると読む人間にはありがたい なんでも短絡や三項にすれば短いだろってより
素朴にIF文使って書いてある方が
読みやすい場合が多々あるな ネストしてないに限れば三項演算子は読みやすいな
条件部分を>>548のようにちゃんと()で囲ってればif文の変化形にも見えるし
コーディング規約で禁止してるとこは結構あるし賛否両論なのは確かだが phpで三項演算子のネスト書く奴は頭からカレーかけられても文句言えない
ネスト階層が深けりゃコーンスープ付き ifだとクロージャー使って即時実行したくならない?
if (!!$a) {
$b = $a;
} else {
$b = 20;
}
$b = (function() use ($a) {
if (!!$a) {
return $a;
} else {
return 20;
}
})();
上だとなんか感覚的にいやだ 何に代入しているのかを特に明示したいならそれでいんじゃね
単純な代入ならインデントで即わかるとは思うが
読みやすさわかりやすさを理由に(if等で)わかりやすい分岐を・・・って話の流れで
if使いながら$aそのまま(のbool変換値)ifに流すだけなところと
ifに渡すだけの箇所で!!$aってやってるところが意味不明だが > !!$a
これ、 $a == true と等価だよな?
数文字タイプする手間を惜しんで2回反転させる計算コストを発生させてる? booleanキャストのつもりで使ったが
確かにいらんな !!って書けることを知らなかったw
!!!もできる? >>560
その発想がなかったから、そんな事できるんだって目から鱗なだけ。 いやだからさ、そんな事もできるんだ!
すごい面白い!
じゃあ何個まで重ねられるんだろう?って話だよ。
どこかでエラーにされて怒られるとは思うけどさ。 eval()あんだから自分で試してみりゃいいじゃん >>554
下はJavaScriptが好きそうだな
「名前空間が汚れる」とか言って
でも上のシンプルな方が読みやすい
>>556
>$a == true
これもこの素朴な方が分かりやすい
「!!$a」とか多用すると読みにくい
トリッキーな書き方より
それを抑えて読みやすくする方が大事 >>550
>>551
同意
書く方は短い方が書きやすいんどろうけど 短く書くことが目的化してるコードはバグ出やすい上にデバッグし難いんだよなあ でもさすがにisset($_POST/$_GET)は三項演算子使うでしょ? >>570
filter_input 使うから、使わない まとめて初期化、まとめて確認って手もあるしなあ
スタンダードというわけじゃなし filter_inputってバリデーションでしょ?
issetしたあとに使うものだよね? その辺の処理は各々好きにしろとしか
・NOTICEが出ない
・その後の処理でバグを生まないようにする(デフォルト値設定、検証除去etc)
これが出来てれば良いわけで >>573
マニュアル読んでみ。幸せになれる。スーパーグローバルから開放されるぞw >>554
elseまでいかんでも
$b = $a;
if (!$b) $b = 20; >>575
後々、それが出来てるかどうか、バグを生んだのがそこかどうか確認するのに
文字数少ない代わりにわかりにくい書き方とか最悪だろって話 $aの型が例えばintなどと保証されてるのか?
保証されてるなら!$aなんてint(0)の判別にしかならないのに直感的じゃない
保証されてないなら'abc'やarray(0)が来た時どうすんの 三項演算子の何がわかりにくいのか理解に苦しむな
ワンライナーで書けるってだけでif-elseと変わらんのに
(condition)
?
when-true
:
when-false
; プログラム書く上で1行で書けるかどうかってなんか価値があるの?
コードゴルファーphp? if( ~~~~ ) ~~~~; else ~~~~;
三項演算子の特権じゃないじゃん >>581
1行だ短いだなんだじゃなくて、何がわかりにくいのか理解不能 ワンライナーって見ただけで私アホですと脳内変換されるわ >>585
ワンライナー
-rオプション使いまくってる人?えっ違うのですか?
ぺちぱー
吠えてるだけ 価値はある
行数ベースで費用計算してるとき安くなる 三項演算子は短く書くためのものじゃないが。
その程度の理解なのなら自分で言ってるように使わないのが無難だな。
無駄にマウント取ってるのは笑えるがw
ifelseは組み込み制御構文で三項演算子のように式が要求されるところには置けない(評価されて値になれない) 同じことが実現できる場合の書き方の比較であって
誰もそんな当たり前の話しとらんのだが ないよ。正確にいうと関係ない。
一行で書くためにあるものじゃないからね。三項演算子は。 なんで話の流れと関係ないのに、三項演算子だけの特権でもないのに、ワンライナーで書けるってことをわざわざ書いたの? ん?俺がワンライナーとか言ったのがまずかったのか?
普通三項演算子はワンライナーで書くもんだからそう言っただけなのだが
別にそこはメインじゃないし主題ではない
?:という2つの演算子しか使っておらず、間違い探しをするようなものでもなく
何がわかりづらいのか理解できないって話をしただけ
ちなみに会話してんの俺じゃないぞ・・・ 少ない行がいいなら最期に¥rと¥nを置き換えて1行にすればいいやんm >普通三項演算子はワンライナーで書くもんだから
俺ルール広めようとしないでくれない? 主観ではあるけど
googleで画像検索したりしても、実際ワンライナーが多数派じゃない?
そもそもネストするようなケースじゃほとんど使われないし
これも主観だけど感覚的に正しいと思う 改行とインデントで整えないなら1層ですら可読性低いんだけど
しかし、なんで一行・1行などと書かないでワンライナーって書くのかね
文字数多いじゃん検索用ってか if (age < 18) {
if (gender == 'male') {
title = 'Master';
} else {
title = 'Miss';
}
} else {
if (gender == 'male') {
title = 'Mr';
} else {
title = 'Ms';
}
if (age < 18) {
title = (gender == 'male') ? 'Master' : 'Miss';
} else {
title = (gender == 'male') ? 'Mr' : 'Ms';
}
title = (age < 18) ? (gender == 'male') ? 'Master' : 'Miss' : (gender == 'male') ? 'Mr' : 'Ms' 可読性の定義は人によってさまざまだけど
長ったらしいのはかえって可読性が下がると俺は思う
>>601では真ん中が一番読みやすい 一番上がおかしかった
if (age < 18) {
if (gender == 'male') {
title = 'Master';
} else {
title = 'Miss';
}
} else {
if (gender == 'male') {
title = 'Mr';
} else {
title = 'Ms';
}
}
やっぱこれは俺にはあってないな >>605
これPHPじゃないし
三項演算子の可読性について、stackoverflowで引き合いに出されてたコード
PHPは評価の仕方が他の言語と違うので
そもそも一番下のようなコードは書いたことがない >>602
同意
ネストしないなら3項演算子がシンプルでよいがネストさせるヤツは死ねと思ってしまう 俺Pythonistaだけど、{}が読みづらい原因だから、こうするといいよ。
if ($age < 18)
if ($gender == 'male')
$title = 'Master';
else
$title = 'Miss';
else
if ($gender == 'male')
$title = 'Mr';
else
$title = 'Ms'; $titles = [
'male' => [ 'u18' => 'Master', 'other' => 'Mr' ],
'female' => [ 'u18' => 'Miss', 'other' => 'Ms' ],
];
$age_category = ( $age < 18 ) ? 'u18' : 'other' ;
// もしくは
if( $age < 18 )
$age_category = 'u18';
else
$age_category = 'other';
$title = $titles[ $gender ][ $age_category ];
一定以上複雑なときはこうしておくかな
判断が増えたとき処理構造を大変更したくないから
というか、性別やu18かどうかをフラグで持っておくのが普通だと思うが
三項演算子だとすごく短い2つの文字列どちらか選択とかならまだいいけど
関数や式が絡むと : の区切りがわかりづらくなるんだよな 実務的にはそれぞれ属性を自分のobjectに聞いて、って感じのが多いかな stackoverflow探してみたけどそれっぽいのが見つからないわ echo 'こんにちは、' . ($name && strlen($name) > 0) ? trim($name) : "anonymous" . "さん";
$name = ($name && strlen($name) > 0) ? trim($name) : "anonymous";
echo "こんにちは、{$name}さん";
var = a ? b : c;を徹底して、
それ以外を組み込んだ、上のような使い方をしなければ問題ないと思う。
Viewには処理済み変数のみを埋め込むのを徹底すればいい。 表示名の場合はだいたい
$nameを先に'anonymous'で初期化しておいて
セッションがあってDBから取ってくる等の時に$nameを上書きする
ってやるよね 条件2つ処理する2x2の構図でも
条件1の結果によって条件2の式自体が変わる場合は
Balancedケースでも可読性落ちるよね 三項演算子を使うときに可読性が落ちない条件を突き詰めていくと
一重であることと
代入される部分が簡潔で統一されてることのほかに
条件部分が簡潔で統一されてることも必要だと思うんだ
18<=ageのときは性別にunknownやnewhalfが追加されたら、途端に難解になるし
age<18ではgender==='male'だけど18<=ageではchecktitle(age,gender)の戻り値だったりすると、わりとめちゃくちゃ
でもそうするとvar=(a)?a:20;みたいな条件になりがちになって
短絡評価のわかりにくさの話に戻るんだよね
$var = (expr) ?
value1 :
value2 ;
みたいな書き方だったら多少複雑でもいい 簡潔じゃないと1重なのか2重3重になってるのかパッと見てわからないからな
その辺ifでは迷ったことがあまりない > 18<=ageのときは性別にunknownやnewhalfが追加されたら
そこまでくると>>603が良さそう
1(under18)
2(over18)
4(male)
8(female)
16(unknown)
32(newhalf)
ちなみにnewhalfじゃなくて
shemaleとかladyboyが正しいおっぱいおちんちんMAN なんだそれは
ageもgenderも1つに閉じ込めてbit演算するならunder18/over18は下位1bit、genderは以降上位bit、ってとこだろう
maleやfemaleを両方選択可能の並存状態にしてどうするんだよ
2値が1種、4値が1種なら3bitで済むだろう そもそも話題が>>618の趣旨とは離れることだが、1点付け加えると
条件がどう動くかわからず拡張性を考えるのであれば
愚直にifやswitchで構造化するか
>>610のように1つ1つ条件を絞れば引き当てられるtableを作るのが筋だろう
ageの判定処理は完全固定と断定できないだろうし
age自体を現在日付とユーザ誕生日設定によって動的に取得させることになる可能性がある
フラグ化してのbit演算では柔軟性・拡張性に乏しい、全然良さそうじゃない elseifを使えばネストなく簡略化できる
sql のselect case見たいな表記できる
if ($age < 18 and $gender == 'male') {
$title = 'Master';
} elseif ($age < 18){
$title = 'Miss';
} elseif ($gender == 'male') {
$title = 'Mr';
} else {
$title = 'Ms'
} $title = [
5=>'Mr', 6=>'Master',
9=>'Ms', 10=>'Miss',
17=>'Mr/Ms', 18=>'Master/Miss',
33=>'Mx', 34=>'Mx'
];
switchは伸びがちになるしテーブル作るより遅くなるけど
可読性の面では
case GENDER_TS+AGE_UNDER18:
case GENDER_TS+AGE_OVER18:
$title = 'Mx';
みたいに出来るから考えようによってはいいかもね あ
配列も出来るらしい
$title = [GENDER_TS+AGE_UNDER18 => 'Mx'];
みたいに
知らなかった >>610と比較して1次元になるだけでメリットはないな >>625
ぱっと見何やってるのかよくわからない
三項演算子もそうだけど結局読む人のレベル次第だな >>629
三項演算子だと処理が煩雑になるほど記述が鬱陶しくなるか難しいかのトレードオフじゃん Pythonにすれば良い
$bar = $fooVal == 10 ? $trueVal : $falseVal
の代わりに
$bar = $trueVal if $fooVal == 10 else $falseVal
みたいに書けてちょー分かりやすい phpどころかビット演算というプログラムの基本すら知らない奴が居付いている 関数型言語では同じ変数に何度も代入するって事は基本やらない
明示的に値を変更可能な変数にすれば再代入可能だが
乱用すると関数型使う意味が無くなる
なぜ再代入を避けるかって言ったら
理由は色々あるが
一番はバグの原因になるから
ScalaにもPythonのような式扱いのif文があったり
switchが無く代わりにmatchを使うのもそれが理由 ビットフラグ立ててるだけでビット演算をしてるわけじゃないからな 初見のわかりやすさってのはシンボルか単語かの違いってのが大きいのだろうけど
みんな大嫌い正規表現だって慣れれば大したことはない
三項演算子はネスト出来ることが問題なのであってネストしなければ問題はないのである 正規表現わけわかんないよ
慣れるしかないんだろうね どこまでが条件部かどこが区切りか
誰が見ても即座にわかる単純明快なケース限定ならいいかもね
それかキッチリ改行入れること 改行が減る=行数ベースの料金が下がる
文字数が減る=文字数ベースの料金が下がる プログラムがより単純化するのは流れであって
コード単価あげるか 成果物に対して報酬をもらえばおk ■ このスレッドは過去ログ倉庫に格納されています