X



PHP質問・雑談スレ4【初心者お断り(ROM歓迎)】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
垢版 |
2017/06/28(水) 21:34:09.26ID:???
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の改造
0542nobodyさん
垢版 |
2018/07/20(金) 17:26:34.38ID:???
$a = 10;
$b = $a || 20;
echo $b; //20
ごめんこれ10だわw
$a = 0って書いたつもり
0543nobodyさん
垢版 |
2018/07/20(金) 17:50:29.12ID:???
null合体演算子(??)を使え
短絡評価した結果何を返すのかなんて後から変えられるわけねぇだろ
0544nobodyさん
垢版 |
2018/07/20(金) 19:43:58.83ID:???
型ってもんがあるからtrue/falseで返してくれないと怖い
0546nobodyさん
垢版 |
2018/07/20(金) 23:26:40.30ID:???
>>545
いっそそこまで覚悟出来るならやればいいとは思う
混乱はあったけど結果としてPythonの決断は正しかったのだろう

とは言え短絡評価を結果をbooleanにするのも最終評価値にするのも良し悪しだからなぁ
0547nobodyさん
垢版 |
2018/07/20(金) 23:57:25.93ID:???
何が入るかわからないのがな
最悪を想定するなら短絡評価の前に中身の判別を入れなきゃならない
想定した型かどうか事前に判別するなら短絡評価要らない
0548nobodyさん
垢版 |
2018/07/21(土) 17:38:08.88ID:gWhxLgcg
$b = (!empty($a)) ? $a : 20;
NULL合体演算子はissetだからだめだな
0549nobodyさん
垢版 |
2018/07/21(土) 19:13:06.04ID:???
JavaScriptも三項演算子使えるんだからそれでよくね
短絡評価は言語ごとに差があるからあんまり使いたくない
0550nobodyさん
垢版 |
2018/07/21(土) 19:16:09.41ID:???
愚直でもわかりやすい判断分岐で書かれてると読む人間にはありがたい
0551nobodyさん
垢版 |
2018/07/21(土) 19:18:20.55ID:???
なんでも短絡や三項にすれば短いだろってより
素朴にIF文使って書いてある方が
読みやすい場合が多々あるな
0552nobodyさん
垢版 |
2018/07/21(土) 19:25:35.94ID:???
ネストしてないに限れば三項演算子は読みやすいな
条件部分を>>548のようにちゃんと()で囲ってればif文の変化形にも見えるし
コーディング規約で禁止してるとこは結構あるし賛否両論なのは確かだが
0553nobodyさん
垢版 |
2018/07/21(土) 19:33:59.72ID:???
phpで三項演算子のネスト書く奴は頭からカレーかけられても文句言えない
ネスト階層が深けりゃコーンスープ付き
0554nobodyさん
垢版 |
2018/07/22(日) 05:26:38.13ID:???
ifだとクロージャー使って即時実行したくならない?
if (!!$a) {
 $b = $a;
} else {
 $b = 20;
}

$b = (function() use ($a) {
 if (!!$a) {
  return $a;
 } else {
  return 20;
 }
})();

上だとなんか感覚的にいやだ
0555nobodyさん
垢版 |
2018/07/22(日) 05:45:59.43ID:???
何に代入しているのかを特に明示したいならそれでいんじゃね

単純な代入ならインデントで即わかるとは思うが

読みやすさわかりやすさを理由に(if等で)わかりやすい分岐を・・・って話の流れで
if使いながら$aそのまま(のbool変換値)ifに流すだけなところと
ifに渡すだけの箇所で!!$aってやってるところが意味不明だが
0556nobodyさん
垢版 |
2018/07/22(日) 06:26:18.55ID:???
> !!$a

これ、 $a == true と等価だよな?

数文字タイプする手間を惜しんで2回反転させる計算コストを発生させてる?
0557554
垢版 |
2018/07/22(日) 06:58:19.63ID:???
booleanキャストのつもりで使ったが
確かにいらんな
0558nobodyさん
垢版 |
2018/07/22(日) 07:54:39.39ID:???
素直メンはイケメン
0559nobodyさん
垢版 |
2018/07/22(日) 08:21:29.99ID:???
!!って書けることを知らなかったw
!!!もできる?
0560nobodyさん
垢版 |
2018/07/22(日) 08:32:08.34ID:???
やってどうすんのよ
0561nobodyさん
垢版 |
2018/07/22(日) 09:22:46.00ID:???
エントロピーを増大させるのだ
0562nobodyさん
垢版 |
2018/07/22(日) 10:22:27.72ID:???
>>560
その発想がなかったから、そんな事できるんだって目から鱗なだけ。
0563nobodyさん
垢版 |
2018/07/22(日) 10:39:15.79ID:???
!!!$varは!$varと等価だろ
0564nobodyさん
垢版 |
2018/07/22(日) 11:57:10.28ID:???
いやだからさ、そんな事もできるんだ!
すごい面白い!
じゃあ何個まで重ねられるんだろう?って話だよ。
どこかでエラーにされて怒られるとは思うけどさ。
0565nobodyさん
垢版 |
2018/07/22(日) 13:15:13.80ID:???
eval()あんだから自分で試してみりゃいいじゃん
0566nobodyさん
垢版 |
2018/07/22(日) 13:35:16.79ID:???
>>554
下はJavaScriptが好きそうだな
「名前空間が汚れる」とか言って
でも上のシンプルな方が読みやすい

>>556
>$a == true
これもこの素朴な方が分かりやすい
「!!$a」とか多用すると読みにくい

トリッキーな書き方より
それを抑えて読みやすくする方が大事
0568nobodyさん
垢版 |
2018/07/22(日) 17:01:30.11ID:???
>>550
>>551
同意
書く方は短い方が書きやすいんどろうけど
0569nobodyさん
垢版 |
2018/07/22(日) 19:17:55.24ID:???
短く書くことが目的化してるコードはバグ出やすい上にデバッグし難いんだよなあ
0570nobodyさん
垢版 |
2018/07/22(日) 19:19:38.87ID:???
でもさすがにisset($_POST/$_GET)は三項演算子使うでしょ?
0572nobodyさん
垢版 |
2018/07/22(日) 19:35:16.04ID:???
まとめて初期化、まとめて確認って手もあるしなあ
スタンダードというわけじゃなし
0573nobodyさん
垢版 |
2018/07/22(日) 19:40:11.51ID:???
filter_inputってバリデーションでしょ?
issetしたあとに使うものだよね?
0574nobodyさん
垢版 |
2018/07/22(日) 19:56:43.65ID:???
転載アフィか何かなの?
0575nobodyさん
垢版 |
2018/07/22(日) 20:01:42.81ID:???
その辺の処理は各々好きにしろとしか
・NOTICEが出ない
・その後の処理でバグを生まないようにする(デフォルト値設定、検証除去etc)
これが出来てれば良いわけで
0576nobodyさん
垢版 |
2018/07/22(日) 20:10:17.68ID:???
>>573
マニュアル読んでみ。幸せになれる。スーパーグローバルから開放されるぞw
0577nobodyさん
垢版 |
2018/07/22(日) 20:36:58.12ID:???
>>554
elseまでいかんでも
$b = $a;
if (!$b) $b = 20;
0578nobodyさん
垢版 |
2018/07/22(日) 20:41:29.86ID:???
>>575
後々、それが出来てるかどうか、バグを生んだのがそこかどうか確認するのに
文字数少ない代わりにわかりにくい書き方とか最悪だろって話
0579nobodyさん
垢版 |
2018/07/22(日) 20:47:50.31ID:???
$aの型が例えばintなどと保証されてるのか?

保証されてるなら!$aなんてint(0)の判別にしかならないのに直感的じゃない

保証されてないなら'abc'やarray(0)が来た時どうすんの
0580nobodyさん
垢版 |
2018/07/22(日) 20:52:50.72ID:???
三項演算子の何がわかりにくいのか理解に苦しむな
ワンライナーで書けるってだけでif-elseと変わらんのに
(condition)
?
 when-true
:
 when-false
;
0581nobodyさん
垢版 |
2018/07/22(日) 21:18:33.98ID:???
プログラム書く上で1行で書けるかどうかってなんか価値があるの?
コードゴルファーphp?
0582nobodyさん
垢版 |
2018/07/22(日) 21:22:28.39ID:???
if( ~~~~ ) ~~~~; else ~~~~;
三項演算子の特権じゃないじゃん
0583nobodyさん
垢版 |
2018/07/22(日) 21:25:51.63ID:???
>>581
1行だ短いだなんだじゃなくて、何がわかりにくいのか理解不能
0584nobodyさん
垢版 |
2018/07/22(日) 21:34:23.08ID:???
ワンライナーって見ただけで私アホですと脳内変換されるわ
0586nobodyさん
垢版 |
2018/07/22(日) 21:39:59.36ID:???
>>585
ワンライナー
-rオプション使いまくってる人?えっ違うのですか?

ぺちぱー
吠えてるだけ
0587nobodyさん
垢版 |
2018/07/22(日) 21:42:00.36ID:???
関数型言語で発狂してこいよ
0588nobodyさん
垢版 |
2018/07/22(日) 21:42:30.07ID:???
価値はある
行数ベースで費用計算してるとき安くなる
0589nobodyさん
垢版 |
2018/07/22(日) 21:43:56.87ID:???
三項演算子は短く書くためのものじゃないが。
その程度の理解なのなら自分で言ってるように使わないのが無難だな。
無駄にマウント取ってるのは笑えるがw
ifelseは組み込み制御構文で三項演算子のように式が要求されるところには置けない(評価されて値になれない)
0590nobodyさん
垢版 |
2018/07/22(日) 22:05:07.77ID:???
同じことが実現できる場合の書き方の比較であって
誰もそんな当たり前の話しとらんのだが
0592nobodyさん
垢版 |
2018/07/22(日) 22:09:52.68ID:???
ドヤ顔マウンターぺちぱー(笑)
0593nobodyさん
垢版 |
2018/07/22(日) 22:25:04.60ID:???
で、1行でかけることになにか価値あるの?
0594nobodyさん
垢版 |
2018/07/22(日) 22:29:44.80ID:???
ないよ。正確にいうと関係ない。
一行で書くためにあるものじゃないからね。三項演算子は。
0595nobodyさん
垢版 |
2018/07/22(日) 22:34:07.28ID:???
なんで話の流れと関係ないのに、三項演算子だけの特権でもないのに、ワンライナーで書けるってことをわざわざ書いたの?
0596580
垢版 |
2018/07/22(日) 22:39:48.38ID:???
ん?俺がワンライナーとか言ったのがまずかったのか?
普通三項演算子はワンライナーで書くもんだからそう言っただけなのだが
別にそこはメインじゃないし主題ではない

?:という2つの演算子しか使っておらず、間違い探しをするようなものでもなく
何がわかりづらいのか理解できないって話をしただけ

ちなみに会話してんの俺じゃないぞ・・・
0597nobodyさん
垢版 |
2018/07/22(日) 22:40:24.80ID:???
少ない行がいいなら最期に¥rと¥nを置き換えて1行にすればいいやんm
0598nobodyさん
垢版 |
2018/07/22(日) 22:44:10.15ID:???
>普通三項演算子はワンライナーで書くもんだから

俺ルール広めようとしないでくれない?
0599580
垢版 |
2018/07/22(日) 22:49:21.00ID:???
主観ではあるけど
googleで画像検索したりしても、実際ワンライナーが多数派じゃない?
そもそもネストするようなケースじゃほとんど使われないし
これも主観だけど感覚的に正しいと思う
0600nobodyさん
垢版 |
2018/07/22(日) 22:53:20.12ID:???
改行とインデントで整えないなら1層ですら可読性低いんだけど

しかし、なんで一行・1行などと書かないでワンライナーって書くのかね
文字数多いじゃん検索用ってか
0601nobodyさん
垢版 |
2018/07/22(日) 23:10:04.34ID:???
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'
0602580
垢版 |
2018/07/22(日) 23:14:53.52ID:???
可読性の定義は人によってさまざまだけど
長ったらしいのはかえって可読性が下がると俺は思う
>>601では真ん中が一番読みやすい
0603nobodyさん
垢版 |
2018/07/22(日) 23:16:56.10ID:???
ビットにしてswitchしよう
0604580
垢版 |
2018/07/22(日) 23:19:58.63ID:???
一番上がおかしかった
if (age < 18) {
  if (gender == 'male') {
    title = 'Master';
  } else {
    title = 'Miss';
  }
} else {
  if (gender == 'male') {
    title = 'Mr';
  } else {
    title = 'Ms';
  }
}

やっぱこれは俺にはあってないな
0605nobodyさん
垢版 |
2018/07/22(日) 23:20:56.62ID:???
一番下もおかしいんだが
php書けないのか
0606580
垢版 |
2018/07/22(日) 23:25:42.57ID:???
>>605
これPHPじゃないし
三項演算子の可読性について、stackoverflowで引き合いに出されてたコード
PHPは評価の仕方が他の言語と違うので
そもそも一番下のようなコードは書いたことがない
0607nobodyさん
垢版 |
2018/07/22(日) 23:33:07.26ID:???
>>602
同意

ネストしないなら3項演算子がシンプルでよいがネストさせるヤツは死ねと思ってしまう
0608nobodyさん
垢版 |
2018/07/22(日) 23:37:49.88ID:???
俺Pythonistaだけど、{}が読みづらい原因だから、こうするといいよ。

if ($age < 18)
  if ($gender == 'male')
    $title = 'Master';
  else
    $title = 'Miss';
else
  if ($gender == 'male')
    $title = 'Mr';
  else
    $title = 'Ms';
0610nobodyさん
垢版 |
2018/07/22(日) 23:59:30.06ID:???
$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つの文字列どちらか選択とかならまだいいけど
関数や式が絡むと : の区切りがわかりづらくなるんだよな
0611nobodyさん
垢版 |
2018/07/23(月) 00:00:45.23ID:???
実務的にはそれぞれ属性を自分のobjectに聞いて、って感じのが多いかな
0612nobodyさん
垢版 |
2018/07/23(月) 00:14:43.72ID:???
stackoverflow探してみたけどそれっぽいのが見つからないわ
0614nobodyさん
垢版 |
2018/07/23(月) 01:16:15.86ID:???
echo 'こんにちは、' . ($name && strlen($name) > 0) ? trim($name) : "anonymous" . "さん";

$name = ($name && strlen($name) > 0) ? trim($name) : "anonymous";
echo "こんにちは、{$name}さん";

var = a ? b : c;を徹底して、
それ以外を組み込んだ、上のような使い方をしなければ問題ないと思う。
Viewには処理済み変数のみを埋め込むのを徹底すればいい。
0615nobodyさん
垢版 |
2018/07/23(月) 01:22:26.76ID:???
表示名の場合はだいたい
$nameを先に'anonymous'で初期化しておいて
セッションがあってDBから取ってくる等の時に$nameを上書きする
ってやるよね
0617nobodyさん
垢版 |
2018/07/23(月) 01:27:21.03ID:???
条件2つ処理する2x2の構図でも
条件1の結果によって条件2の式自体が変わる場合は
Balancedケースでも可読性落ちるよね
0618nobodyさん
垢版 |
2018/07/23(月) 01:44:19.98ID:???
三項演算子を使うときに可読性が落ちない条件を突き詰めていくと
一重であることと
代入される部分が簡潔で統一されてることのほかに
条件部分が簡潔で統一されてることも必要だと思うんだ

18<=ageのときは性別にunknownやnewhalfが追加されたら、途端に難解になるし
age<18ではgender==='male'だけど18<=ageではchecktitle(age,gender)の戻り値だったりすると、わりとめちゃくちゃ


でもそうするとvar=(a)?a:20;みたいな条件になりがちになって
短絡評価のわかりにくさの話に戻るんだよね
$var = (expr) ?
  value1 :
  value2 ;
みたいな書き方だったら多少複雑でもいい
0619nobodyさん
垢版 |
2018/07/23(月) 01:46:11.40ID:???
簡潔じゃないと1重なのか2重3重になってるのかパッと見てわからないからな
その辺ifでは迷ったことがあまりない
0620nobodyさん
垢版 |
2018/07/23(月) 06:55:36.75ID:???
> 18<=ageのときは性別にunknownやnewhalfが追加されたら
そこまでくると>>603が良さそう
1(under18)
2(over18)
4(male)
8(female)
16(unknown)
32(newhalf)

ちなみにnewhalfじゃなくて
shemaleとかladyboyが正しいおっぱいおちんちんMAN
0621nobodyさん
垢版 |
2018/07/23(月) 07:10:51.79ID:???
なんだそれは
ageもgenderも1つに閉じ込めてbit演算するならunder18/over18は下位1bit、genderは以降上位bit、ってとこだろう
maleやfemaleを両方選択可能の並存状態にしてどうするんだよ
2値が1種、4値が1種なら3bitで済むだろう
0622nobodyさん
垢版 |
2018/07/23(月) 07:29:32.52ID:???
そもそも話題が>>618の趣旨とは離れることだが、1点付け加えると
条件がどう動くかわからず拡張性を考えるのであれば
愚直にifやswitchで構造化するか
>>610のように1つ1つ条件を絞れば引き当てられるtableを作るのが筋だろう

ageの判定処理は完全固定と断定できないだろうし
age自体を現在日付とユーザ誕生日設定によって動的に取得させることになる可能性がある
フラグ化してのbit演算では柔軟性・拡張性に乏しい、全然良さそうじゃない
0624nobodyさん
垢版 |
2018/07/23(月) 10:47:42.67ID:???
$age+$genderでやれば拡張も容易
0625nobodyさん
垢版 |
2018/07/23(月) 11:17:26.62ID:???
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'
}
0626nobodyさん
垢版 |
2018/07/23(月) 11:34:04.40ID:???
$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';

みたいに出来るから考えようによってはいいかもね
0627nobodyさん
垢版 |
2018/07/23(月) 11:39:51.37ID:???

配列も出来るらしい
$title = [GENDER_TS+AGE_UNDER18 => 'Mx'];
みたいに
知らなかった
0628nobodyさん
垢版 |
2018/07/23(月) 11:43:37.99ID:???
>>610と比較して1次元になるだけでメリットはないな
0629nobodyさん
垢版 |
2018/07/23(月) 11:48:06.16ID:???
条件使わなくて済むよ
下準備も大変になるけど
0630nobodyさん
垢版 |
2018/07/23(月) 12:06:46.43ID:???
>>625
ぱっと見何やってるのかよくわからない
三項演算子もそうだけど結局読む人のレベル次第だな
0631nobodyさん
垢版 |
2018/07/23(月) 14:58:02.10ID:???
>>629
三項演算子だと処理が煩雑になるほど記述が鬱陶しくなるか難しいかのトレードオフじゃん
0632nobodyさん
垢版 |
2018/07/23(月) 15:11:43.17ID:ci3EIyjd
Pythonにすれば良い

$bar = $fooVal == 10 ? $trueVal : $falseVal

の代わりに

$bar = $trueVal if $fooVal == 10 else $falseVal

みたいに書けてちょー分かりやすい
0634nobodyさん
垢版 |
2018/07/23(月) 15:19:01.63ID:???
phpどころかビット演算というプログラムの基本すら知らない奴が居付いている
0635nobodyさん
垢版 |
2018/07/23(月) 15:21:44.19ID:KYWJiLD7
関数型言語では同じ変数に何度も代入するって事は基本やらない
明示的に値を変更可能な変数にすれば再代入可能だが
乱用すると関数型使う意味が無くなる

なぜ再代入を避けるかって言ったら
理由は色々あるが
一番はバグの原因になるから

ScalaにもPythonのような式扱いのif文があったり
switchが無く代わりにmatchを使うのもそれが理由
0636nobodyさん
垢版 |
2018/07/23(月) 17:34:07.95ID:???
ビットフラグ立ててるだけでビット演算をしてるわけじゃないからな
0637nobodyさん
垢版 |
2018/07/23(月) 18:00:32.66ID:???
初見のわかりやすさってのはシンボルか単語かの違いってのが大きいのだろうけど
みんな大嫌い正規表現だって慣れれば大したことはない
三項演算子はネスト出来ることが問題なのであってネストしなければ問題はないのである
0638nobodyさん
垢版 |
2018/07/23(月) 18:05:34.79ID:???
正規表現わけわかんないよ

慣れるしかないんだろうね
0639nobodyさん
垢版 |
2018/07/23(月) 18:17:28.84ID:???
どこまでが条件部かどこが区切りか
誰が見ても即座にわかる単純明快なケース限定ならいいかもね
それかキッチリ改行入れること
0640nobodyさん
垢版 |
2018/07/23(月) 19:16:40.02ID:???
改行が減る=行数ベースの料金が下がる
文字数が減る=文字数ベースの料金が下がる
0641nobodyさん
垢版 |
2018/07/23(月) 19:38:29.41ID:???
プログラムがより単純化するのは流れであって
コード単価あげるか 成果物に対して報酬をもらえばおk
■ このスレッドは過去ログ倉庫に格納されています

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