[過去ログ]
【PHP】下らねぇ質問はここに書き込みやがれ 12 (1002レス)
【PHP】下らねぇ質問はここに書き込みやがれ 12 http://mevius.5ch.net/test/read.cgi/tech/1619667579/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
735: PHPerは糞 (ワッチョイ c17b-NIVl) [sage] 2021/08/11(水) 21:04:34.54 ID:C/NScrzP0 PHPでの参照渡しの「ノリ」が分からないのだが、どの辺が相場なのだ? なお、 https://tanakahisateru.hatenablog.jp/entry/2013/12/12/012728 は読んだ。これはいい記事だ。 そしてとりあえずコーディングルールを探してみたが、無い。 PSR/WordPress/Zend/Cakeのはさらっと見たが、文法だけで、動作については記述がないようだ。 だから、動作周りも含めての推奨コーディングルールがあればそれを教えてくれると助かる。 DBから読み出してフォーマットしてjsonで出力する場合、一番単純には、 $resultArr = fetch_from_DB(); format_for_API($resultArr); // 参照渡しで自己書き換え echo json_encode($resultArr); function &format_for_API(&$arr){ // ここで何かフォーマット return $arr; // 直上のコードでは必要ないが、直積み(以下)用にreturnしている。 } となる。ただしこのコードは以下の様な直積み echo json_encode(format_for_API(fetch_from_DB())); だと、 Notice: Only variables should be passed by reference が出る。(ただし動く) http://mevius.5ch.net/test/read.cgi/tech/1619667579/735
736: PHPerは糞 (ワッチョイ c17b-NIVl) [sage] 2021/08/11(水) 21:04:54.72 ID:C/NScrzP0 ここで、直積みコードを動かす為には format_for_API を「参照渡し」から「値渡し値返し」に変更する必要が有り、 コードは、 $resultArr = fetch_from_DB(); $resultArr = format_for_API($resultArr); // 再代入 echo json_encode($resultArr); となる。これだと結果としては速度/メモリ共に変化無い。ただし最近の『再代入禁止』には反するので、 $resultArr = fetch_from_DB(); $resultArr_formatted = format_for_API($resultArr); // 別名 echo json_encode($resultArr_formatted); と別名にすると、(今回の俺の場合、速度は大して変わらないが)使用メモリは増えてしまう。 これらから言えるのは、 A. format_for_APIは「参照渡し(参照返し)」が正しいはずだが、何故かNoticeが出されてしまう。 仕様としては、参照渡しに未初期化の変数が渡されたらそこでnull初期化される、ということだから、 直積みでも動くのは正しく、Noticeが過剰なように見える。(ただし以下7とは矛盾) (PHPの構造上 is_ref が変数上にしか持てないのが問題なのだろうが、 そこはボックス化みたく変数化すればいいだけで、このような右辺値を流し込んでいる状況なら危険性はないはず。 実際動いているし。だから何でNoticeなの?となる) B. 同名の変数に再代入する場合は(破棄されることが見えているから)最適化がかかり、問題はない。 C. 別名の変数に保存した場合、元の変数($resultArr)がそれ以降使われない場合でも、破棄されず、最適化がかからない。 結果、メモリを余分に消費する。 これについて、冒頭の記事では「そういう特殊な高級言語だ」と表現されているが、これは当たっている。 クダグダ考えずに「値渡し値返し」でひたすら全部組み上げてもそれなりに動くからだ。 そして昨今の『インミュータブル』で『再代入禁止』なのは下位での変更が上位のコードから見えないからであって、 PHPの場合は「値渡し」でガッツリ保護されているから、 『再代入禁止』『参照透過』何それ美味しいの?でも確かにそれなりに問題ないはず。 http://mevius.5ch.net/test/read.cgi/tech/1619667579/736
737: PHPerは糞 (ワッチョイ c17b-NIVl) [sage] 2021/08/11(水) 21:05:17.28 ID:C/NScrzP0 俺の現環境ではBしか選択肢がないが、ここら辺はPHP界隈ではどうなってるのだ?具体的には、 1. 理想的にはAでNoticeが削除されるべきだが、既にそうなってる/これから削除予定か? 2. (知らんが、)実はPHPって一つのコードで出来てて、「おま環」ってのがあまり無く、 俺の環境でBが最適化されてれば、どの環境に持って行っても最適化されてて問題なく動くのか? (これについてJSが悲惨なのはご存じの通り) 3. まさか、notice切ればいいだけだろ、とか言うノリか?(個別に切れるのならこれも有りだが) 4. 最適化を期待して、参照渡しの使用自体を禁止/抑止する方向か? (真に必要な場合以外は使うな等。今回なら上記のように同名の変数に代入すればいいだけだよね、みたいな。) 5. この辺も含めての、文法(見た目)以外のコーディングルールで有名なのが有れば教えてくれ。 6. このPHP流の参照仕様、使い道無いよな?実は冒頭の記事を読んだ当初、 > PHPの参照はいちど変数が参照になってしまうと、二度ともとに戻ることができないので、扱いにくくてやっぱりダメです。 とあるので、参照は変数側に固定で、参照変数を値渡しの関数の引数にしても常に参照渡し、なら、 スゲーカッケー!!!と思って試したが、全くそうじゃなかった。 しかも参照渡しの関数の戻り値を普通に値変数として確保出来るし、「二度ともとに戻ることができない」というのが意味不明。 Cみたいに呼ぶたびに自由に切り替えられることを想定しているのなら、それは過剰で、 (そもそも元々出来たようだがPHP4.1.3で廃止された、というのを見た覚えがあるが、再確認出来ない) 実際はRustみたいに「mutableな変数は最初から決まっているので宣言時に固定する」で問題ない。 だからコピーオンライト(これってPHP.netでは書いてないだろ!今日初めて知ったわ!)で 全部見た目は値渡し値返し、なら、凄く先進的ではあったのだが。 (なお参照の取り扱いは他言語も苦労してて、C++でも失敗してる) http://mevius.5ch.net/test/read.cgi/tech/1619667579/737
738: PHPerは糞 (ワッチョイ c17b-NIVl) [sage] 2021/08/11(水) 21:05:44.32 ID:C/NScrzP0 7. > リファレンス渡しが想定されているところに、値渡しを行うとエラーになります。 > https://www.php.net/manual/ja/functions.arguments.php ってあるのだが、今回ってこれか?なら動いてはいるがやっぱりアウトなのか? ちなみに直積みになってるのは、元はfetch_from_DBの出力側で format_for_APIしてたのを、 json_encodeの入力側でやるように移動して、結果的に <?= => の間にブッ込まれてるからだ。 まあ色々文句有るんだろうが、それでも答えてやってもいいぞ、って人はよろしく。 一応724の要求どおりにこのスレ内ではコテにしておく。 http://mevius.5ch.net/test/read.cgi/tech/1619667579/738
740: PHPerは糞 (ワッチョイ c17b-NIVl) [sage] 2021/08/11(水) 22:21:08.32 ID:C/NScrzP0 >>739 その記事とかからすると、どうも過度にやってる奴が居るようだが、今回の件は全くそうではないだろ。 むしろ、「値渡しで自己に再代入って、こいつ参照渡し知らない馬鹿だろ!」って、お前らなら突っ込んでくるところだろ。 がまあ、PHP鯖はPCでしかないので大富豪プログラミングでおk、なのは確かにその通りかもな。 http://mevius.5ch.net/test/read.cgi/tech/1619667579/740
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.031s