[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2ch.scのread.cgiへ]
Update time : 02/23 23:57 / Filesize : 381 KB / Number-of Response : 998
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【PHP】下らねぇ質問はここに書き込みやがれ 14



1 名前:デフォルトの名無しさん [2022/09/20(火) 16:46:23.39 ID:Sb2Kpzh+0.net]
!extend::vvvvv:1000:512
!extend::vvvvv:1000:512
★スレ立て時 ↑ が3行以上になるようコピペ

PHPに関する質問スレです

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

次スレは>>980以降
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured

744 名前:デフォルトの名無しさん (ワッチョイ ff5f-YZsW) mailto:sage [2023/09/22(金) 20:43:58.56 ID:Il2p6KDs0.net]
>>743
蓄積したりといったことはありません
そのままごみ箱に入れて大丈夫です

それよりもごみ箱のごみはひらがなです
今後は気をつけろ

745 名前:デフォルトの名無しさん (ワッチョイ 8e7c-u/s5) mailto:sage [2023/09/23(土) 13:44:37.26 ID:/3FF//Rt0.net]
>>744
ありがとうございます!

746 名前:デフォルトの名無しさん (ワッチョイ 0abd-em0E) [2023/09/29(金) 05:54:25.82 ID:JB7cBWOL0.net]
この流れはさすがにネタだよね?

747 名前:デフォルトの名無しさん (ワッチョイ c92e-ZDOV) mailto:sage [2023/10/14(土) 18:52:32.66 ID:FXKPsXcG0.net]
>>717
>クラスがまだ理解できないわ
>ユーザ関数をまとめた塊が分身の術を使う感じ?

>お問い合わせフォームみたいな小さなプログラムでも
>クラスを使って作ることができるのかな

全く同じ。ユーザー定義関数との違いが理解出来ていない自分。
よくクラスを、自動車に例えたり会社に例えてる書籍読むけど分からんのよね。うーん

748 名前:sage (ワッチョイ c963-e7li) [2023/10/14(土) 23:13:33.20 ID:uhuB6VoQ0.net]
>>747
既に回答されてる通りだよ。
ただの整理術だから、無くても困らないのなら問題ないし、規模が大きくなれば嫌でも実感出来る。
そして(生の)PHPで学ぶのははっきり言って間違い。
Arrayとか、他言語ならarr.indexOf等、最初からクラスになってるので自然と使えるようになる。
最初からlaravel使った場合も同様。
生のPHPで初心者の規模(3000行以下程度)なら自然と学べる事はなく、無理に使おうとしても余計に混乱するだけ。
本が3冊しかないのに本棚買っても整理も糞もない。本立てで十分だし、そのほうが使い勝手もいい。
初心者の規模で学びたければ、他言語(JS/Go/C#/Java/Python/Rubyのどれでもいい)をやるべき。
どうしてもPHPでやりたければ、laravel使うか大型化させるしかない。

749 名前:デフォルトの名無しさん (ワッチョイ c963-e7li) mailto:sage [2023/10/14(土) 23:15:35.87 ID:uhuB6VoQ0.net]
> ユーザー定義関数との違いが理解出来ていない自分。
そもそも違いなんて無い。Goの場合は相互に運用出来るし、
C++やC#の場合はコンパイラが暗黙的に指定してくれるだけ。
一般的には「どう考えても対象を指定するしかないだろ」の場合、インスタンスメソッドにする。
例えば、
$key = array_search('green', $array); // $key = 2;
array_searchは「配列の中から探す」のであって「配列」を指定しないと話にならない。なら最初から、
$key = $array->search('green');
と書かせろや糞言語ガー、
しかもsearchでは返り値の型が分かりにくい、インデックスが返ってくるのなら、
$key = $array->indexOf('green');
と書かせろや糞言語ガー、他言語は全部こうやで、というだけ。
array_searchとかいう糞長い名前が必要なのは、名前のスコープが広すぎるからであって、
各メソッドにしてクラス毎の小さなスコープにすれば短い名前でも衝突しない。
これが便利なので使われてる。つまり、便利だ、というだけ。

750 名前:デフォルトの名無しさん (ワッチョイ c963-e7li) mailto:sage [2023/10/14(土) 23:16:34.58 ID:uhuB6VoQ0.net]
ただしPHPのも「静的メソッド」として実装する方式では合ってるし、
実際にC++の場合は(仮想関数でない場合は)静的メソッドをコンパイラ支援で呼び出してるから、バイナリ的にも同じ。
同様にC#の場合は上記静的メソッドarray_searchを拡張メソッドとして$array->search形式で
見た目簡単に書けるようにしただけで、C++と同様に同じバイナリを呼び出す。
Goの場合はインスタンスメソッドを静的メソッドとして呼びだしたら(逆だったかも?)
第一引数がthis扱いになるだけ、という、C++やC#がコンパイラにやらせてるのをユーザーも書けるようにしただけ。
要するに、普通の関数(静的メソッド)と(仮想関数でない)インスタンスメソッドには違いはない。楽に書けるだけ。
PHPの場合は(今数分見ただけだが)全部仮想関数(virtual、ただしPHPでは別の意味で使われてるが)っぽいので、
array_searchのような静的メソッドの方が呼び出しがデリファレンス1回分速いという違いはあるが、
PHPの実行速度で気にする話でもない。
そしてオーバーライドしなければ上記の(仮想関数ガー)は全部無視していい。

まあ意味不明だろうが、書き方以外の違いはないという事。
ただ再度言うが、小規模の生PHPをやってる限り、この辺が分かるようにはならないよ。

751 名前:デフォルトの名無しさん mailto:sage [2023/10/15(日) 09:04:25.58 ID:6aIYZQkKa.net]
プログラムをクラスとかメソッドに分ける時の考え方の一つに「自動テストの書きやすさ」もあるよ。
作ったプログラムを今後も手を入れて改修して行くなら、一般的に改修箇所以外が正常動作するか回帰テストする。

プログラムを作る時に自動テストも作っておくと改修時の回帰テストが楽になる。
自動テストが無いと手動で全機能動作確認になって改修時に改修箇所以外の不具合が出やすくなる。
手動で全機能動作確認は手間がかかり過ぎて大変だから回帰テスト不足で「改修前に使えてた機能が使えなくなった」となりやすい。

今後改修しないその場限りのプログラムなら自動テストは気にしなくて良いと思う

752 名前:デフォルトの名無しさん (ワッチョイ c92e-ZDOV) mailto:sage [2023/10/15(日) 12:35:11.36 ID:XVcuYs9l0.net]
>>748 エスパーか?ってくらい自分の状況透かされてて驚きました。まさに生のPHPしか触った事なくて1ファイルMAXでも3000行くらいしか書かないです。本棚の例えも恐ろしくわかりやすいです。

現状、会員制のサイトを生で書いたPHPで運用してるけどユーザー定義関数は使っていて、それに対してクラスの概念やユーザー定義関数との違いが理解出来ていない学習度です。

ユーザー定義関数群を取りまとめたファイルを都度includeで読み込んで各ページで使ってます。これで事足りていてこの方式とクラスの違いが理解出来ていないという。

おっしゃる通り、このまま生のPHPで学習していてもクラスの概念分からないだろうなと痛感しています。
GitHubで他人のコード見てクラスの書き方見てみたりWordPressもコード見たりするけど、やっぱり理解できず。

Laravelとかフレームワーク使って簡単に何か作ってみるのが良いんだろうなぁ…頑張らねば



753 名前:デフォルトの名無しさん (ワッチョイ c92e-ZDOV) mailto:sage [2023/10/15(日) 12:47:11.76 ID:XVcuYs9l0.net]
>>751さんは別の方かな?レス有難うございます😊

こちらもおっしゃる通りで、機能を追加していく際に「メンテナンスが大変になってきたな…」と思う事がチョコチョコ出てきました。
ユーザー定義関数群をまとめたファイルをメンテナンスする事で自分の中ではある程度改修しやすくしているつもりなんですが、今後大規模な機能追加を考えた時に『クラスを使う使わない以前にクラスの概念を理解出来ていない事そのものがメンテナンスや拡張性を考慮する選択肢や手段の範囲・幅を狭めているのでは?』と考えるようになりました。

個人事業主で頑張ってる(ユーザー定義関数だけで頑張ってる)けどこのままだと株式会社を立ち上げて規模を大きくする事が出来ない(クラスを使って大規模開発出来ない)気がしています。
変な例えで恐縮ですし例えの中の個人事業主⇆会社のどちらが良い悪いというか意味ではありません。
ただ、自分が今如実に感じている感覚を言語化するなら先述のような感覚です。

754 名前:デフォルトの名無しさん mailto:sage [2023/10/15(日) 16:52:25.37 ID:BnU34f5b0.net]
>>752
> ユーザー定義関数群を取りまとめたファイルを都度includeで読み込んで各ページで使ってます。これで事足りていてこの方式とクラスの違いが理解出来ていないという。
その方法でも間違いではないし、問題ない。
ただ(勘違いしてる馬鹿が多いが実は)クラスベースのオブジェクト指向と
それ以前の(つまり今751がやってる)手法は連続的に繋がっていて、
そのまま進んでいけば自然とクラスベースのオブジェクト指向に辿り着くものなんだよ。
だから(本来は)わざわざ別に学ぶものでもない。
今現在の「クラス」はC++が定義したものであり、
C++の目的は「Cの糞コードを出来るだけ改変せずに何とかする」事だったから、当然なのだが。
そして
> ユーザー定義関数群を取りまとめたファイルを都度includeで読み込んで
が実はCの手法そのまんまで、大規模になるとこれが問題となったので「クラス」を導入しただけ。

「クラス」の意味を初心者が理解出来ないのは、使用方法が多岐に渡る為だ。
だから実態を掴みにくい。
だから逆に、単純に入ればいい。
大規模化したCで問題になったのは、「階層」がないこと。だからクラスで「階層」を付加した。
PHPの場合でも同様で、includeした関数はどこからでも呼べてしまい、階層がない。
それで、複数のincludeファイルで同じ名前の関数を定義してしまった場合、バグる。
これに対するアナログ的解決が、「接頭辞を付ける」で、実際PHPだとarray_xxxxとなっている。
ただしこれでも種類が増えると接頭辞内にも"_"を使いたくなってくる。
そしてxxxx_yyyy_zzzzでみたいな関数名になると、接頭辞がxxxxなのかxxxx_yyyyまでなのか見た目分からない。
だから接頭辞内に"_"を使うのは絶対禁止というアナログ解決も可能だが、
ここで明示的に階層を宣言し、"::"で区切る、つまり、array_xxxx は全部 array::xxxxにする、
というのが「クラス」を「階層」とした使い方。
これは751でも「次の一手」として理解出来るだろ。

755 名前:デフォルトの名無しさん mailto:sage [2023/10/15(日) 16:53:05.15 ID:BnU34f5b0.net]
なんだ、接頭辞を付けて、接頭辞内では"_"禁止、或いは接頭辞を台帳で管理すれば、
つまり、きちんと管理すればアナログで解決出来るではないか、というのは事実で、当たり前なのだ。
既にそうやってアナログ管理されて動いているCの糞コードを、そろそろなんとかするのがC++の目的だし、
それで導入されたのが「クラス」なのだから、元々そういう物なんだよ。
だから
array_search を
array::search と書き直すだけ、階層をアナログで"_"で区切ってたのを"::"にしただけ、
それだけで名前被りの管理の手間が大幅に削減出来ますね、というだけ。

この「次の一手」を同様に繰り返して行けばクラスベースのオブジェクト指向に自然となる。
753の
$key = array_search('green', $array);

$key = $array->search('green');
と書かせろというのも、$arrayは絶対に必要だし、逆にこれがないと何も始まらないのだから、
$arrayの一部としてsearchという関数を定義してしまえば、
$arrayとセットでないと呼び出せなくなるし、
$key = array_search($array,'green'); // error
みたいに引数順序を間違えてバグる心配もないね、というだけ。
そんなのちゃんと管理すればアナログで回避出来るよね、というのは、上記の通り「クラス」の仕様だ。
だから何であれ「クラス」は無くても出来るが使った方が楽、というだけの話。

756 名前:デフォルトの名無しさん mailto:sage [2023/10/15(日) 16:55:02.15 ID:BnU34f5b0.net]
> Laravelとかフレームワーク使って簡単に何か作ってみるのが良いんだろうなぁ…
これは本末転倒だから止めとけ。学ぶ気なら他言語、例えばC#が断然よくて、
C#で簡単なもの作った方が数段まし。
これはPHPの立ち位置がやや微妙だからだ。

既に動いている問題ないコードを破棄しなければならない場合は、
・アドレス空間の枯渇
・速度が絶望的に足りない
の2つで、前者は64bit化で解決済みだから今現在問題になるのは後者。
PHPは絶望的に速度が遅いし、larabelで表面的に誤魔化せてるとしても相変わらず糞なのは事実で、
.NET等、MSがガチでオブジェクト指向で整備したフレームワークと比べたら所詮はゴミ。(larabelもMSではあるが)
larabelはPHPのコード資産が段々と大きくなってきたときに導入するものであって、
最初からlarabel使って大規模なコードをPHPで組むくらいなら、
普通の連中はJSやTSやGoやRust等、他言語使ってるだろ。
実行速度が速い=可読性の高い簡単なコードで済む、という事であって、
動作速度が速いだけで七難隠すんだよ。
だから大規模システムをわざわざPHPで最初から組む馬鹿は誰もいない。
結果的に大規模化した物にlarabel適用してるだけで。
(大規模化=大半をプログラムで処理する=言語がいい方が断然楽)

PHPの場合は実行速度を
・物理で殴って誤魔化す
事が出来るから生き延びてるが、これが出来ないCakeとかは完全に死んでるだろ。
PHPはあくまで小回りが利く規模までで、フレームワークを導入してまで使う規模には適してない。
結果的にそうなったのなら致し方ないが、わざわざ導入してまでやるもんじゃない。
どうしてもWebに拘りたいのなら、この機会にJSかTSを試した方がいい。
少なくともPHPでクラスを学ぶよりは断然ましだし、今後の役にも立つだろうよ。

757 名前:デフォルトの名無しさん (ワッチョイ 13a9-olVp) mailto:sage [2023/10/15(日) 20:49:40.47 ID:64Sv/OQW0.net]
>>717書いた者だけど、mc963-e7li氏の言葉はなんとなくわかったような感じ
リレーショナル使わないDBのCRUDするぐらいなら無理にクラスは使わなくて良い、ということね。

php初学時にlaravelの本を読んだ時に呪文みたいなものがたくさんあって
php無理だわと思ったけど、laravel無しでなんとかログイン付のCRUDぐらいなら作れるようになった。
・ある程度コードが書けるようになったらlaravelを検討するのか
・まったくの初学者がlaravelから始めてブラックボックスになっている所は気にするな、というなら
phpしか選択肢が無いなら熟練者はどっちを勧めるんだろう

758 名前:デフォルトの名無しさん (ワッチョイ 7321-Y0aP) mailto:sage [2023/10/15(日) 21:00:20.67 ID:BAs39Kb+0.net]
個人開発にフレームワークいらないんじゃない?
昔居た会社はLaravelでいうブレードに全部の動作直書きしてたよ

759 名前:デフォルトの名無しさん mailto:sage [2023/10/16(月) 11:26:15.00 ID:oWsG313D0.net]
>>754
階層の例えめちゃくちゃ分かりやすいです、なるほどなるほど…
>>717さんと自分は別だけど「クラスの概念が理解出来ない」という点で全く同じだったので書き込んでしまいました。懇切丁寧に教えてくれて本当に感謝です🙏

>>754さんみたいな方が社内に居たら素晴らしいメンターになるのになぁと思いながらも今日もトライ&エラーで頑張ります!

760 名前:デフォルトの名無しさん mailto:sage [2023/10/16(月) 11:45:53.44 ID:Cp7DR01g0.net]
Ruby の米国年収は、Go/Rust/Elixir の3大言語を超えた!
一方、PHP は情報学部へ行ってない高卒とか

Ruby, Elixir : 9.3 万ドル
Go : 8.9
Rust : 8.7

多くの言語 : 6.5〜7

PHP : 5
Dart : 4.4

Ruby on Rails, AWS Solution Architect は13万ドルとか!

YouTube で有名な雑食系エンジニア・KENTA は、
初心者のキャリアパスは、Rails → Go だけと言ってる

一方、Scala, PHPをオワコン認定した。
使っているのは、Twitter, Facebook ぐらい。

日本はZOZO とか、PHPを使う老人が多い。
たぶん、Web系じゃなくてSIer だろうから、Java に近い。
Railsを使う、モダンなスタートアップとは企業文化が異なる

ガーシーのサロンで使っていたMastodon も、
PHPから、Rails 6 へ変わった

筑波大学でも使っている、Rails チュートリアル日本語版の古いRails 5 なら、
無料で読めるから、まずこれを読むのが最短

761 名前:デフォルトの名無しさん mailto:sage [2023/10/17(火) 01:20:58.48 ID:R59hQw8C0.net]
>>757
小規模なら無理にクラスを使う必要はないが、
クラスを使った方が楽だし綺麗に整理出来るので、知ってれば普通は使う。

> php初学時にlaravelの本を読んだ時に呪文みたいなものがたくさんあって
クラス周りの用語、具体的にはクラス/コンストラクタ/プロパティ/メソッド/継承/仮想関数、
等が理解出来ないのはさすがに不味い。
C++が再定義したオブジェクト指向は超便利だったので、C以外の全てのメジャー言語には実装された。
実際、あらゆるドキュメントが大体この形式で書かれてるだろ。
言語関係なく共通だし、知らないでは済まされない。脳味噌へのインストールは必須。

理解はしたが、使う意味/意義が分からないというのは初心者〜中級者がよく陥る状態で、
大体は規模が小さすぎて恩恵がほぼ無いから分からないだけ。(アナログ管理で全く困ってないだけ)
どうしても実感したければ単純には規模を大きくすればいい。
Cみたいに階層がない状況では、一人のプログラマが取り扱えるコード規模は10,000行程度とされていた。
だから10,000行を超えて頭に入りきらない状況になれば、
「この部分はブラックボックスとして切り出し、動くものとして使いたい」という欲求が出てくる。
API/モジュール/クラス等、切り出し方は色々あるが、
お手軽に同一コード内で切り出すのならクラスが便利なのでみんなそうしてるだけ。
ただPHPならRESTにして鯖を細切れにする事も簡単なので、
こちらを選択して各APIを3,000行程度に抑えれば、オブジェクト指向を一生理解せず無視する事も可能だろう。

762 名前:デフォルトの名無しさん mailto:sage [2023/10/17(火) 01:21:42.72 ID:R59hQw8C0.net]
ただまあそれ以前にPHPはオブジェクト指向には向いてない。
継承の旨味を引き出すには抽象クラスのメソッドで記述する必要があるのだが、
Web周りはオブジェクト指向前提で整備されてないのでだいたいこれが不可能だ。
ここら辺が最初から全てオブジェクト指向前提で設計されてる.NETとかとは違う。
次にPHPの場合は状態保存が出来ない。
オブジェクト指向は各インスタンスに「状態を分散して配置する」ことになるため、
これらを最終的にDBに書き戻すには余分なコードが必要となってしまう。
ここら辺がサーバーが永続的なJS/Go/Rustとは違ってくる。
だからPHPの場合はDBから読み出してこねくり回して吐き出すだけ、
何かあったらDBを更新するだけ、という非常に単純な構造にしかならないわけだが、
実際はこの方がいいので、この点はPHPのショボさが功を奏してる。
Javaの開発工数とか、同様のWebサービスと比べて10倍以上はかかってるだろ。
あれはそもそもオブジェクト指向の「状態を分散して配置する」事自体が間違いな事に気づいてないんだよ。
Javaの連中はJavaこそが大正義であって他はまるで知らない浦島太郎だからあんな事になる。



763 名前:デフォルトの名無しさん mailto:sage [2023/10/17(火) 01:23:34.74 ID:R59hQw8C0.net]
> ・ある程度コードが書けるようになったらlaravelを検討するのか
> ・まったくの初学者がlaravelから始めてブラックボックスになっている所は気にするな、というなら
どっちもありだと思うが、そもそも前提が間違ってる。
フレームワークはステップアップではなく、単純に「楽をする為」に導入するものだ。
よく言われてる、「フレームワークを使わなくても、
フレームワーク内に存在するコードとほぼ同じ物を書くハメになるだけだから、さっさと使え」というのは当たってる。
だからフレームワークのドキュメントをさらっと見て、
自分が使いたい機能が有れば使えばいいし、無ければ使わなければいいだけ。
初心者だから止めとけとか、そういう類の話ではない。
実際、C#やJavaではフレームワークを使わない選択肢はなく、
ハロワで既にフレームワークを使ってるはずだが、特に問題にもなってない。
そして使う場合は基本的にブラックボックス扱いだ。
内部まで確認してたらキリがないので、問題なければ内部コードなんて確認しない。
それは気持ち悪い、というのなら、フレームワーク使わずに自分で組め、でしかない。
(自分で組むよりはフレームワークを内部コード精査後にホワイトボックスとして使うなり、
フレームワーク内のコードを基本パクって改変してオレオレ仕様にしたりする方がバグはないだろうが、
一般的にはこの方式の所はあまり無いのではないかと。
フレームワークのバグを心配するなら、アナログに「枯れた機能だけを使う」で対処した方がいい)

764 名前:デフォルトの名無しさん mailto:sage [2023/10/17(火) 01:24:30.33 ID:R59hQw8C0.net]
この辺はPHP界隈でたまにいる「DBでなく、ファイルでやりたいんですけど…」が分かりやすいだろう。
この場合本人は既にプログラミングはそこそこ出来て、
欲しい物は今現在の自分で十分実装可能だと分かってる。
そしてDBの知識が十分でなく、勉強するのが面倒か、慣れてない物を使うのは危険だと判断してる。
だから自前でファイルから変数を切り出すルーチンを書くわけだ。その方が自信が持てるから。
ただ当たり前だが、同様のコードはDB内には既に存在してて、そいつが書くよりも100倍品質もいい。
そして何だかんだで仕様は肥大化し、
その都度そいつのオレオレファイルDBモドキにもコードが書き加えられていくわけだが、
最終的に、「で?お前はこれに延べ何時間費やしたわけ?それで出来上がったのがこのウンコなDBモドキ?
なら最初からSQL勉強してDB使った方が堅牢で拡張性もあって速度も速いし、工数もかからなかったよね」にしかならない。
(そもそもDB内のコードなんてPHPerは誰も読んでないしブラックボックスだが気にしてないだろ)

だから考えるべきは「今」ではなく「最終状態」であって、
仮にお前の思惑通り事が運んだとして、最終的にどこまでやるつもりなのか?なんだよ。
最終的にも数行読めれば十分ならファイルで構わないが、
最終的にはDBが必要になるのなら、最初からDBで組んだ方がいい。
同様に、最終的にフレームワークが必要となるなら、最初からフレームワークを使うべき。
よく言われてるのは「セッション管理を自前でやるとだいたいバグるからフレームワーク使え」で、
逆に言えばセッション管理を厳密にやる必要がなく、特に欲しい機能もなければ、フレームワークを使う必要がない。
繰り返すがこれは「今」ではない。
つまり、「『今は』初心者だから」「『今は』フレームワークに慣れてないから」
「『今は』DBを知らないから」「『今は』クラスの理解が足りてないから」ではなく、
今、知識/技術が有ろうが無かろうが、最終的に必要なら使って慣れるしかないんだよ。

765 名前:デフォルトの名無しさん mailto:sage [2023/10/17(火) 01:26:52.67 ID:R59hQw8C0.net]
多分721も751も以下分類では中級者になる。

初心者:欲しい機能の実装にも手こずる。(プログラミング経験0〜3000時間)
中級者:欲しい機能は一通り実装出来る。(プログラミング経験3000〜5000時間≒社畜歴2年)
上級者:仕様から複数の実装を検討し、初手から最適解を目指せる。(プログラミング経験5000時間以上)

状況について詳しく言うなら、
・動けばいいのなら何であれ実装出来るから今現在の技術/知識で何ら困ってない。
・果たして自分のコードが美しいのか汚いのかはよく分からんが、
 少なくとも自分のコードは読めるので取り立てて困ってない。
・世の中には他の方法もあるらしいが、勉強する価値があるのかもよく分からん。まあ一応読んではみたが…。
てな所だろう。これは順当な上達過程で、誰しも通る道だ。

そこで道は分かれるわけだが、90年代の場合、

Java(1995):C++が導入したクラススゲー。全部クラスで、ポインタ廃止したら完璧じゃね?
Ruby(1995):C++が導入したクラススゲー。全部オブジェクトでいけるんじゃね?
C#(2000):C++が導入したクラススゲー。でもC++はちょっと…
C++(1983):馬鹿はJava、軟派はC#使ってろ。漢は黙ってC++。
C(1972):いやCで特に不満無いし…。
PHP(1995):クラス?そんなもの無くても出来るでしょ。

同時期以降の別言語が全てクラスを採用する中、ラスマス・ラードフは無視しやがったのがPHPの不幸なところだ。
PHPがArray::xxxやString::yyyとなってれば、「クラスがよく分からない」なんて事になりようもなかった。
が、まあ、これを言っても始まらない。上達の為の次の順当な方策は、JSをやる事だ。
https://プログラマが知るべき97のこと.com/エッセイ/プログラミング言語は複数習得すべき/

766 名前:デフォルトの名無しさん mailto:sage [2023/10/17(火) 01:28:15.91 ID:R59hQw8C0.net]
フルスタック(キリッ、の通り、クライアントサイドで何がどこまで出来るかを把握しておく事は全体最適化には必須。
達人である必要はないが、どれくらい手間なのか分からないのは不味い。
クラスは難しいものではなく、使ってないから分からないだけ。
強制的に使うのなら標準がクラスで構成されてる言語がいい。(今のメジャー言語は全部該当するが)
PHPの次はJSだろうよ。
なおPHPの場合は節操なく取り込んでるので結果的に「全部入り」に近く、
PHPだけで学ぶのも理論的には可能だが、そもそも知らない奴が正しい方向性を見切るのは無理なので、現実的に無理だ。
PHPでは今まで通りのコードを書きつつ、JSで色々試し、
クラスに慣れたらPHPでもクラスを使って書いていく、というのが多分妥当な道筋。

767 名前:デフォルトの名無しさん (スッップ Sd33-Y0aP) mailto:sage [2023/10/17(火) 11:52:24.20 ID:nEN1t9hTd.net]
Laravelでコーディングする時、コーディングする順序は
1、SQL等のDB周り
2、バックエンド動かすコントローラー(api.phpの方)
3、フロント用のコントローラー(web.phpの方)
4、view

って順序でイメージあってる?

768 名前:デフォルトの名無しさん (ワッチョイ 0149-HvQf) mailto:sage [2023/10/17(火) 16:33:35.10 ID:wBPhMFC20.net]
好きなとこからやれ
決まってるところからやれ
仕事なら会社の言う通りにしろ

769 名前:デフォルトの名無しさん [2023/10/21(土) 01:03:11.56 ID:dh9vzKli0.net]
PHPが遅いってのは分かるが、絶望的に遅いか?って言われたらそうは思わんな
スーパーに買い物に行くのにスポーツカーは必要ないし、むしろ使いにくい
小回りのきく軽自動車で十分って状況も多々ある

770 名前:デフォルトの名無しさん mailto:sage [2023/10/21(土) 09:18:37.85 ID:yXW/Zb3m0.net]
既に運用中のサイトにおいてPHP7系から8に移行する際、皆さんどんな苦労されました?
自分は前任者が書いたサイトを引き継ぎしたんだけど、内容はPHP5時代に書かれたコードを扱わなきゃいけなくて…
レンタルサーバーが強制的にPHP8に移行するにあたって500ファイルほど目視チェック、動かない原因になる箇所を直していったのが大変だった
countとimplodeとかその辺りの関数がFatal error出すのでシコシコ直していったよ

771 名前:デフォルトの名無しさん (ワッチョイ 1ade-cYzw) mailto:sage [2023/10/22(日) 15:40:10.82 ID:lOEqj3QG0.net]
ゼロから作り直したほうが早い

772 名前:デフォルトの名無しさん (ワッチョイ 8e5f-ANn9) mailto:sage [2023/10/22(日) 18:07:33.50 ID:xV2fKCwr0.net]
>>770
移行しなかったよ
Dockerん中に古いまんま閉じ込めた
もう未来永劫そのまんまよ



773 名前:デフォルトの名無しさん (ワッチョイ 19f7-NW8N) mailto:sage [2023/10/27(金) 15:17:52.24 ID:O5trZ+em0.net]
なるほど、その手があったか

エラー無視つけてたわ

774 名前:デフォルトの名無しさん mailto:sage [2023/11/19(日) 11:56:48.15 ID:vcL8dlfS0.net]
>>770
前任者どころか、自分で書いたコードですら修正するの大変だわ
よほどのセキュリティホールでも無い限り、古いまま運用してもいいと思うよ
Javaで古いバージョンが乗っ取りとかってあったけど、
PHPはそういうのないし、ページ毎のセキュリティ対策してたら大丈夫でしょ
(違うなら誰か事例を出して指摘してください

775 名前:デフォルトの名無しさん [2023/11/22(水) 14:01:49.19 ID:gEe16+Fw0.net]
初心者なので初歩的な質問になりますm(_ _)m

phpのフレームワークlaravelについての質問なんですが

Illminate/Foundation/Application.phpのApplicationクラスのbootstrapWithというメソッドの中に$this['events'] -> dispatch( 〜
という記述があるのですがこの$thisはApplicationクラスのインスタンスだと思うのですが
なぜ$this['events']のように$thisの後にブラケットが続いてるのでしょうか?

dd($this)とやって調べて見ましたがやはり配列ではなくApplicationのインスタンスで
dd($this['events'])で調べたらDispatcherというオブジェクトでした
なぜブラケット構文でインスタンスにアクセスできるのか分かりません
この$thisはなんですか?

776 名前:デフォルトの名無しさん (ワッチョイ 465f-jMfl) mailto:sage [2023/11/23(木) 00:07:02.72 ID:RFVqy5fX0.net]
>>775
PHPは連想配列っぽくインスタンスにアクセスできるんだお

初心者らしい初歩的な質問でしたね

777 名前:デフォルトの名無しさん (ワッチョイ 7901-YT2O) mailto:sage [2023/11/23(木) 00:43:06.46 ID:AzseZZHe0.net]
最近はそれくらいの難度なら
GPTさんに質問する人が増えたから
あまり書き込みにこないんだろうな

778 名前:デフォルトの名無しさん (ワッチョイ 72a2-N5Jg) [2023/11/23(木) 00:46:28.93 ID:op2UpQwL0.net]
>>776
オブジェクトを作って試しましたがオブジェクトは配列として使用できないとエラーが出ます

どのようにそれを可能にしているのかを教えていただけませんか?

初歩的な質問で申し訳ありませんがググっても出てこないので

779 名前:デフォルトの名無しさん (ワッチョイ e93b-8MWH) mailto:sage [2023/11/23(木) 01:01:05.45 ID:pAGXWPD10.net]
オブジェクトに対して配列風にアクセスするといえばこれか
https://www.php.net/manual/ja/class.arrayaccess.php

780 名前:デフォルトの名無しさん [2023/11/23(木) 07:25:04.23 ID:op2UpQwL0.net]
>>779
スッキリしました。ありがとうございます。
継承元のcontainerクラスで実装されてるのを確認できました。

781 名前:デフォルトの名無しさん [2023/12/09(土) 23:46:53.06 ID:fGdJSgyw0.net]
学習コストが低めのフレームワークでおすすめある?
Laravel,CakePHP以外で

782 名前:デフォルトの名無しさん (ワッチョイ 7716-pmcO) mailto:sage [2023/12/10(日) 10:42:24.34 ID:PVGCDu/Y0.net]
オレオレフレームワーク



783 名前:デフォルトの名無しさん (ワッチョイ 7f3f-opNu) mailto:sage [2023/12/14(木) 16:59:59.82 ID:t1zoVVGt0.net]
WordPressってPHP7.4以上が推奨環境なんだけど、
PHP8.0までセキュリティサポートが切れてる
なんで7.4以上なんだろ?

784 名前:デフォルトの名無しさん mailto:sage [2023/12/14(木) 21:46:47.06 ID:SDKVvk710.net]
プラグインの対応を考えると7.4まで戻さないといけないんじゃないかな?

8.1まではあまり影響なかったけど8.2からひどかった記憶、最後に仕事して一年以上経ってるから状況変わってるだろうけど

785 名前:デフォルトの名無しさん (スップ Sdbf-6RB4) mailto:sage [2023/12/15(金) 15:26:36.63 ID:UGjdTC/zd.net]
このフレームワークはプログラム技術板的にPHPなの?Goなの?

 米Laravelは、Go言語で書かれたPHPアプリケーションサーバであるFrankenPHPの最新バージョンとなる「FrankenPHP 1.0」を、12月11日(現地時間)にリリースした。

 FrankenPHP 1.0には、Symphony、Laravel、WordPressなどのネイティブサポートが含まれるほか、Caddyを搭載したプロダクショングレードのPHPサーバであり、PHPアプリのスタンドアロンで実行可能なバイナリとしてのパッケージ化が可能となっている。

 さらに、PHP-FPMとNgnixを個別に実行する必要がなく、1つのサービスのみでPHPサーバを提供できるようになるとともに、PHP 8.2以降のほとんどのPHP機能拡張、およびすべてのCaddyモジュールと互換性がある。

 ほかにも、アプリケーション起動してメモリに保持するワーカーモード、JavaScriptイベントとしてWebブラウザへ送信されるリアルタイムイベント、ZstandardおよびGzip圧縮、構造化されたログ、Prometheusメトリクスを使用したCaddyの監視、HTTPS・HTTP/2・HTTP/3のネイティブサポート、HTTPS証明書の自動生成や更新、ダウンタイムなしでのアプリのデプロイといった、充実した機能を搭載している。

786 名前:デフォルトの名無しさん (ワッチョイ 7ff7-OWs5) mailto:sage [2023/12/15(金) 17:16:53.14 ID:Or7pgbin0.net]
フレームワークじゃなくてアプリケーションサーバ
Goで書いてる内部実装の話じゃなければPHP

787 名前:デフォルトの名無しさん (ワッチョイ a795-+vxZ) mailto:sage [2023/12/17(日) 12:50:33.31 ID:Ejq9svn00.net]
やっぱRubyとは違うな

788 名前:デフォルトの名無しさん mailto:sage [2023/12/18(月) 10:08:31.91 ID:/4mKYZLK0.net]
導入部がどんどんコテコテになっていくな
もう新規は洋梨か

789 名前:デフォルトの名無しさん (ワッチョイ 338a-pDLy) [2023/12/28(木) 04:23:04.89 ID:NBXduxv20.net]
フラグ管理の効率的な方法を教えて下さい。
作成中の社内向け事務アプリなんですが、判定要素が多くなりすぎて毎回読む度に悩みます。

ユーザーに割り当てられた権限や日時による分岐がめっちゃ多いです。
例えば、シンプルなやつだと下記みたいな感じです。
※権限には、種類とランクがあります。

・権限Aを持っているユーザーB〜Eが、日時F〜Gの間に許可した時だけ、
 ユーザーH・Iが日時J〜Kの間だけ権限L・Mを付与されて、
 その権限を行使して処理NまたはOを合計2回行った時に、その権限を付与したユーザー(B〜E)の権限PをQ〜Rの期間降格する。

790 名前:デフォルトの名無しさん (ワッチョイ 338a-pDLy) mailto:sage [2023/12/28(木) 04:23:58.49 ID:NBXduxv20.net]
すみません。
スレ立てるまでもない〜スレに行きます。

791 名前:デフォルトの名無しさん mailto:sage [2024/01/10(水) 16:15:07.69 ID:PTL/6ftd0.net]
PHPのクラスを理解できていない 及び 運用・実装したことない
ユーザー定義関数なら扱えるレベル
CakephpやLaravel等のフレームワーク扱った事がない
実務は約5年

これで中途採用の場合、月収幾らくらいが妥当ですか🥹

792 名前:デフォルトの名無しさん mailto:sage [2024/01/10(水) 16:53:39.33 ID:dVV8o+q90.net]
>>791
おぉ、同じぐらいだわ。
PHPはフレームワークとか知らないし、ユーザ関数ちょっと作れたりするぐらい
フォームメールとかマスタデータの登録編集ぐらいできて48万ぐらい貰ってるよ



793 名前:デフォルトの名無しさん (ワッチョイ 7f9a-lSjW) mailto:sage [2024/01/10(水) 20:04:25.62 ID:zlHvcH430.net]
コピペプログラムでも30はいけるからな

794 名前:デフォルトの名無しさん (ワッチョイ df0e-tnpw) mailto:sage [2024/01/10(水) 20:16:50.25 ID:PTL/6ftd0.net]
>792 >793
ええええー!マジですか😭…羨ましい!!
メールフォームはもちろん、サーバー関連もLinux一通りは触れて、データベースも GUIではなくてLinux上から操作出来るくらいのレベル感ではあるんだよね…

求職する時、文字だけだと自分のレベル感と会社が求めてるレベル感が分からなくていつも「クラス実装出来ないし概念理解してないけど大丈夫かな」とか「フレームワーク扱った事ないし…docker?何それ美味しいの?」って感じで二の足踏んでしまうんだよね

795 名前:デフォルトの名無しさん (ワッチョイ ff5f-03E5) mailto:sage [2024/01/12(金) 00:03:02.51 ID:twL7njza0.net]
フレームワークを扱えばいいし、dockerも勉強すればいいよ
そもそもフレームワークなしでやれてたんなら 何でも独学できるだろ
体系的な学習はとにもかくにもいじり倒した後からだ

796 名前:デフォルトの名無しさん mailto:sage [2024/01/13(土) 14:07:59.64 ID:3NziHgVl0.net]
>>792
ちなみにSES?

797 名前:デフォルトの名無しさん (オッペケ Srbd-Ti6e) mailto:sage [2024/01/30(火) 04:09:24.38 ID:geI1NBE8r.net]
PHP初級取ろうと思ってますが、取りやすいのはどっちですか?

簡単な方を教えてください。

798 名前:デフォルトの名無しさん (オッペケ Srbd-Ti6e) mailto:sage [2024/01/30(火) 04:10:11.35 ID:geI1NBE8r.net]
PHP7 vs PHP8 の比較です

799 名前:デフォルトの名無しさん mailto:sage [2024/01/30(火) 07:13:24.16 ID:xc6jeStg0.net]
上司から取ってこいと言われたのでなければ止めとけとしか
俺はPHPerではないけども

800 名前:デフォルトの名無しさん (オッペケ Srbd-Ti6e) mailto:sage [2024/01/31(水) 13:32:55.85 ID:k++D0k1Yr.net]
>>799
俺はデザイナーなので仕事上ではなくてもいい資格なんだが、取りやすそうで見栄えも良さそう資格って事でこれとろうかなと、webクリエイターの資格もってるがゴミ資格なんでゴミ資格でもないやつ取りたい。

801 名前:デフォルトの名無しさん (ワッチョイ b6d0-9w1M) mailto:sage [2024/01/31(水) 14:50:49.67 ID:GiaFK7PQ0.net]
>800
少しでもプログラムを書く予定があるなら PHP8が良いよ
なぜかと言うと、7→8のアップデートで仕様が大幅に変わったから
7の細かいルールを覚えてしまってから8を触ったら「あれ?動かない…」となる可能性あるので

802 名前:デフォルトの名無しさん (ワッチョイ 1149-Y1Fy) mailto:sage [2024/01/31(水) 15:02:37.76 ID:KXDkvASJ0.net]
資格で語れる業界に行きたいんなら良いんじゃね

ITは基本、実績や書き物で語ることが多いと思うけどね



803 名前:デフォルトの名無しさん (ワッチョイ 8a8b-7cac) [2024/01/31(水) 15:18:08.36 ID:Cu19VVGy0.net]
逆にIT系の資格一杯持ってるやつのほうが実務で使えねー

804 名前:デフォルトの名無しさん (ワッチョイ 9ee7-TUA6) mailto:sage [2024/01/31(水) 17:23:01.53 ID:grzeycve0.net]
>>803
それよく言われるけど、実際のところは逆だったわ
決まりきったパズルである試験すら通らないやつが
まー実務で役に立つわけもないわな

805 名前:デフォルトの名無しさん (ワッチョイ 8a8b-7cac) [2024/01/31(水) 17:28:55.09 ID:Cu19VVGy0.net]
>>804
ちゃうちゃう、パズルしか解けんくなって石頭になるねん
自分でアルゴリズムを構築する手段を知らないから、パーツに頼るしかなくなる

806 名前:デフォルトの名無しさん (ワッチョイ 1163-on57) mailto:sage [2024/01/31(水) 17:29:39.20 ID:jcvgDSDi0.net]
銃が使えるからって戦場で役に立つとはならないぞ

807 名前:デフォルトの名無しさん (ワッチョイ eaa9-+O6P) mailto:sage [2024/01/31(水) 17:30:21.84 ID:OojRe9/Q0.net]
ワイphp7とphp8の違いがわからずに簡単なコード書いてるし運転免許以外資格も持ってなくても35万給料もらえていることに感謝

808 名前:デフォルトの名無しさん (ワッチョイ 9601-JLAu) mailto:sage [2024/01/31(水) 17:31:41.54 ID:3ULZXNFO0.net]
属してる組織の技術レベルによるんだよね
上に行けば行くほどIT資格一杯持ってるやつのほうが使えねーってなる
下に行けば行くほどIT資格一杯持ってるやつのほうが使えるーってなる

809 名前:デフォルトの名無しさん (ワッチョイ b6d0-9w1M) mailto:sage [2024/01/31(水) 17:40:24.48 ID:GiaFK7PQ0.net]
>807
SIerとSESどっちかな?
ついでに額面か手取りかも教えてくださいw

810 名前:デフォルトの名無しさん (ワッチョイ eaa9-+O6P) mailto:sage [2024/01/31(水) 17:57:51.74 ID:OojRe9/Q0.net]
>>809
ごめん単語が何言ってるかわからない・・・

811 名前:デフォルトの名無しさん mailto:sage [2024/01/31(水) 20:57:41.85 ID:GiaFK7PQ0.net]
>810
ざっくり言うと、
「自社開発していて自社出勤の正社員」=SIer
「委託や請負で客先常駐の社員。派遣では無いが実質派遣ぽい動きしてる」=SES
↑かなり乱暴な言い方だけどw

https://levtech.jp/partner/guide/article/detail/163/

812 名前:デフォルトの名無しさん (ワッチョイ 7501-8Us2) mailto:sage [2024/01/31(水) 23:14:06.95 ID:j8r5fr530.net]
>>811
突っ込みどころ満載すぎ

SIerは企業の種類でSESはサービスの種類
SIerの正社員がSESで客先常駐というのも普通にある

自社開発という言葉は自社向けのシステムを開発することを指していて
SIerが受託開発等で客先に常駐せず自社に出勤して開発することではない

請負の客先常駐はSESとは呼ばない
SESは基本的に準委任契約



813 名前:デフォルトの名無しさん (ワッチョイ 62f4-UXSU) mailto:sage [2024/02/17(土) 15:04:47.81 ID:RQ5FiJGb0.net]
1、クライアント(C++で作ったアプリ)がLaravelで作ったAPIにアクセス
2、APIにアクセスされたらクライアントにファイルダウンロード
3、ダウンロード完了したらサーバー上のデータをbackupディレクトリに移動

ダウンロードの完了をLaravel側(PHP)が知る方法ってないよね?

814 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 15:53:22.94 ID:+ZrZNmrG0.net]
クライアントから完了通知を送る
完了通知がないとクライアントがすべて正常に受け取ったかどうかはわからない
サーバー側だけでわかるのはデータをネットワークI/Oのレスポンスとして全部書き出したかどうか

815 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 16:09:44.18 ID:RQ5FiJGb0.net]
ダウンロード用のスレッド(タスク)終わったらダウンロード完了通知するスレッド始めりゃ良いのか
ありがとう

816 名前:デフォルトの名無しさん [2024/02/17(土) 19:05:09.44 ID:4U2VM1d40.net]
ファイル送る前に、MD5とかのファイルハッシュを送っておいて、受信完了レスポンスはクライアント側のMD5を送ってもらって、合致したら処理完了
とするとより安全だわな

817 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 20:18:28.04 ID:HHGIbwMU0.net]
今の通信品質ってそんなに悪いのか?

818 名前:デフォルトの名無しさん [2024/02/17(土) 23:35:32.81 ID:4U2VM1d40.net]
あ、いやさ、バックアップディレクトリに移動ってあったから、何らかのトラブルがあった時に、多分手作業で戻さなくちゃならんくなるじゃん
保険と思って実装しておくのが安心かなとね、俺は低品質回線の国とかとのやりとりがあるから、敏感になってるのもあるけどね
だからかUDPよりTCPかつチェックサムなど入れてる

819 名前:デフォルトの名無しさん mailto:sage [2024/02/19(月) 10:13:37.18 ID:sL/5dHSK0.net]
MD5が技術と時間的に厳しかったからダウンロードしたファイル名(秒単位までの時間)を送信して対応することにしました

ありがとうございました

820 名前:デフォルトの名無しさん [2024/03/10(日) 12:02:36.25 ID:L6LWs13j0.net]
環境ってフレームワークや言語ごとにvmwareでわけたらいいのか、それともdockerがよいのか、
先輩方教えてください

821 名前:デフォルトの名無しさん mailto:sage [2024/03/12(火) 01:50:45.53 ID:TnUWR0Du0.net]
動作しているコードでVSCodeで赤く表示されるところを直そうと思い
$row[\"id\"]}
とエスケープしようとするとエラーと出ます。
赤く表示されるのはvscodeが何か勘違いしているということでしょうか?

https://i.imgur.com/RdSJ8HS.png

822 名前:デフォルトの名無しさん mailto:sage [2024/03/12(火) 02:57:29.14 ID:oTlhluwZ0.net]
{$row['id']}にしてみ



823 名前:デフォルトの名無しさん (ワッチョイ 2930-n0E3) mailto:sage [2024/03/12(火) 10:50:36.47 ID:meXeXcdC0.net]
>821

>822のように波括弧で括るか、ダブルクォーテーションをシングルクオーテーションにしてみ

824 名前:デフォルトの名無しさん mailto:sage [2024/03/12(火) 17:55:50.35 ID:TnUWR0Du0.net]
>>822-823
ぉぉ・・・すごい、うまくいきました。
確かに変数展開する必要が無いならシングルクォートで良いですよね
ダブルクォートを使うことしか考えていませんでした

825 名前:デフォルトの名無しさん mailto:sage [2024/03/13(水) 01:02:40.75 ID:GqTsKoAX0.net]
>824
実際の開発現場ではコーディングのルール決まってるからシングルクオーテーションやダブルクオーテーションを混ぜて使ったりしては駄目だから気を付けてねー

826 名前:デフォルトの名無しさん mailto:sage [2024/04/01(月) 23:48:30.99 ID:VotzuRBw0.net]
postするデータってなんでもかんだもCSRF検証するものですか?

827 名前:デフォルトの名無しさん mailto:sage [2024/04/01(月) 23:53:33.26 ID:VotzuRBw0.net]
SPA作ったんですがCSRF検証してません
ポストするデータはゲームのステージデータです
仮にCSRF攻撃されたとしてもステージデータが増えるだけなんですがこういうケースでもCSRF検証はすべきでしょうか?

828 名前:デフォルトの名無しさん mailto:sage [2024/04/02(火) 00:37:08.09 ID:Y1y4I8En0.net]
本人の意図しないところでステージデータがポコポコ増えたら困るでしょ?

829 名前:デフォルトの名無しさん mailto:sage [2024/04/02(火) 09:20:13.00 ID:MCcZjXUK0.net]
このケースでは検証すべき、こっちではしなくて良い、とかやってるとそのうちその振り分けでやらかしそうだから
如何なる場合でもPOSTデータは検証すべき

830 名前:デフォルトの名無しさん (ワッチョイ 5dbb-B4RS) mailto:sage [2024/04/02(火) 16:50:28.30 ID:4sW3pgf50.net]
そうですか
ありがとうございました

831 名前:デフォルトの名無しさん mailto:sage [2024/04/03(水) 03:58:04.60 ID:EpnIAvlv0.net]
CSRFの実装しました
難しいかと思ったら割と簡単でした
案ずるより産むが易しキヨシってやつですね

832 名前:デフォルトの名無しさん mailto:sage [2024/04/03(水) 16:08:59.39 ID:sHoarvhc0.net]
nonceもCSRF対策の一種?



833 名前:デフォルトの名無しさん mailto:sage [2024/04/05(金) 11:14:06.54 ID:ZTISEuLN0.net]
管理画面や、限定的にしか見れないページ(社内のみとか)はサボる時あるけどねw
理由は、そもそも管理画面自体に入られたらパスワードが漏洩しているという意味で全て終わりだから。

サボるのはpostするデータをバリデーションするか、とかサニタイズするか、とか。
性善説に基づいて作るとめちゃくちゃ楽よ( ;´Д`)

834 名前:デフォルトの名無しさん mailto:sage [2024/04/05(金) 17:24:40.42 ID:ed+JNEgF0.net]
>>833
管理画面にログイン済みのユーザーにPOSTするリンクをクリックさせて管理者にしかできない操作をさせるみたいなのがCSRFだと思うんだが・・・

CookieをSame Siteにすれば防げるケースが大半だろうけど多段防御しといた方が安牌だと思う

835 名前:デフォルトの名無しさん mailto:sage [2024/04/06(土) 00:42:24.17 ID:4xUg8EFL0.net]
>834
vpn接続して使用してる管理画面だから、誰か入ってくる事は無いし、そもそも誰か入って来た時点で即、死を意味してるのでプログラム云々というよりネットワークのセキュリティの話になってくる、というね。

話逸れたけど、個人的にはこれくらい内々で使うサービスなら良いけど、逆に言えばそれ以外はPOSTデータの取り扱いは100%対策しないとダメだよ、って話

836 名前:デフォルトの名無しさん (ワッチョイ d576-VD0S) mailto:sage [2024/04/06(土) 02:02:19.01 ID:0VY5CEth0.net]
100%

837 名前:デフォルトの名無しさん (ワッチョイ 6b01-KWHl) mailto:sage [2024/04/06(土) 02:12:00.29 ID:Jz+yuHp90.net]
>>835
VPN接続してるかどうかとか全然関係ないよ
そもそもCSRFって内部ネットワークに誰か入ってくるとかじゃないから

838 名前:デフォルトの名無しさん mailto:sage [2024/04/08(月) 16:50:29.21 ID:wyxCOIbr0.net]
intval(080)が0になるのはなんで?

839 名前:デフォルトの名無しさん mailto:sega [2024/04/08(月) 19:16:57.61 ID:0Leau+zw0.net]
>>838
不正な8進数だからだろ

840 名前:デフォルトの名無しさん mailto:sage [2024/04/10(水) 11:28:55.93 ID:NX4cvx9u0.net]
Closure::bindやbindToがnullを返すのはどんな場合ですか?
公式ページには"失敗するとnullを返す"としか説明がなく
具体的な失敗パターンが知りたいです

841 名前:デフォルトの名無しさん (ワッチョイ bf5f-/8Es) mailto:sage [2024/04/14(日) 23:11:55.65 ID:zqSEJi8N0.net]
>>840
基本的にバグのときしか無いよ
見れない関数見てるとかそもそも関数じゃないとか

842 名前:844 mailto:sage [2024/04/15(月) 20:58:30.82 ID:ykbkL8b10.net]
>>841
ありがとうございます



843 名前:デフォルトの名無しさん mailto:sage [2024/04/16(火) 01:54:25.90 ID:J00dMuyV0.net]
PHPってなんでこんなに速いんですか?
他のインタプリタ言語よりかなり速いですよね

844 名前:デフォルトの名無しさん mailto:sage [2024/04/16(火) 04:36:49.17 ID:j7JGuKK50.net]
利用者が多いと高速化モジュールを作ってくれる人がそのうち出て来る

でもphpよりperlの方が速いって言う人もいる

845 名前:デフォルトの名無しさん mailto:sage [2024/04/16(火) 10:35:03.69 ID:6qmOkfsb0.net]
今やpythonのほうが高速だから残念ながらphpのアドバンテージは下がってしまった

846 名前:デフォルトの名無しさん mailto:sage [2024/04/16(火) 11:14:04.07 ID:kYFjszay0.net]
fastAPIってどのくらい速いんかね?

847 名前:デフォルトの名無しさん mailto:sage [2024/04/16(火) 11:23:09.48 ID:MMZJeoHC0.net]
メンテしやすい方が楽で良い

848 名前:デフォルトの名無しさん mailto:sage [2024/04/16(火) 20:06:50.70 ID:uAswjotn0.net]
Laravelとかも最近のopcache使ったときやたら速くて感心したな

849 名前:デフォルトの名無しさん mailto:sage [2024/04/16(火) 23:44:05.47 ID:dnnaoba60.net]
いくらphpが速くてもpythonはcかc++並になってしまったからもう追いつけない

850 名前: mailto:sage [2024/04/17(水) 00:07:31.24 ID:I8L23udN0.net]
追いつけないかどうかはやろうとする処理次第
Eコマースで商品一覧をDBから取得し画面に出力するとなれば
処理の大部分はDBの処理時間

851 名前:デフォルトの名無しさん mailto:sage [2024/04/17(水) 01:28:51.06 ID:c72vfF8y0.net]
誰もDBの話はしとらんが?

852 名前:デフォルトの名無しさん mailto:sage [2024/04/17(水) 01:34:48.91 ID:ze0TvR6C0.net]
>850 そりゃそうだろw今はそんな話はしてないし、自分の土俵に持っていく為に話題のすり替えになってるぞ



853 名前:デフォルトの名無しさん (ワッチョイ 7f3a-/8Es) mailto:sage [2024/04/17(水) 07:51:37.15 ID:xZLw0gTi0.net]
なでしこ3はPythonより6.5倍速い

854 名前:デフォルトの名無しさん mailto:sage [2024/04/17(水) 09:34:48.22 ID:CzOcQm8R0.net]
PythonよりPHPやRubyのほうが速い
ざっくり3〜5倍
さらにPHPやRubyよりJavaScriptのほうが速い
それもざっくり3〜5倍
PerlはPythonと似たり寄ったり
PythonだけJITがないから置いてきぼり
今年のQ4に出る3.13で導入予定らしいけど最適化に時間がかかるから今のレベルに追いつけるのは5年くらい先

Pythonで性能を出したければシェルスクリプトと同じようにできるだけPython内でループを回さずC/C++で書かれたライブラリに一括で処理を委譲する
Webアプリだとなかなかそうもいかないけど

855 名前:デフォルトの名無しさん mailto:sage [2024/04/17(水) 11:15:26.47 ID:hNUrcL2F0.net]
フルスタックとしてPHP8.2は速いよね
バックエンドだと言語による差は無いか

856 名前: 警備員[Lv.1][新芽] (ワッチョイ df94-R43V) mailto:sage [2024/05/01(水) 22:35:49.91 ID:Jo6lQIiP0.net]
php8でJITが導入されていてそれを利用することで現状だと単純な計算速度ではphpの方がpythonより速いと思う
ただpythonもJIT導入予定と聞いている

857 名前:デフォルトの名無しさん (ワッチョイ bf5f-b946) mailto:sage [2024/05/03(金) 19:58:28.18 ID:+USmG/sP0.net]
node.jsってそんなに速いの? 知らなかった

858 名前:デフォルトの名無しさん (ワッチョイ 277b-z+LQ) mailto:sage [2024/05/03(金) 20:16:52.06 ID:+XAyZCIw0.net]
>>857
Rustと比較対象にされるくらいは速いよ
https://deepu.tech/concurrency-in-modern-languages-final/

というかね、PHP/Python/Rubyが論外に遅すぎて、これらの言語使った時点で速度は度外視前提だから、
これらについては速度比較すらまともにされて無いでしょ

859 名前:デフォルトの名無しさん (ワッチョイ 277b-z+LQ) mailto:sage [2024/05/03(金) 20:57:10.70 ID:+XAyZCIw0.net]
こっちの方がよかったかも?
https://www.techempower.com/benchmarks/#hw=ph&test=composite§ion=data-r22

860 名前:デフォルトの名無しさん (ワッチョイ 7f63-Ufki) mailto:sage [2024/05/03(金) 20:59:44.77 ID:9ebiuCIb0.net]
この人はどんな利益を得ているんだろう

861 名前:デフォルトの名無しさん mailto:sage [2024/05/04(土) 00:40:36.66 ID:TbdOZmgm0.net]
個人でPHPとJS(ブラウザ)とPythonの速度比較したら
JS, PHP, Pythonの順で早かった
JSはGoogleのエンジニアがV8組んでるだけあってインタプリタの中じゃ最速だな

862 名前:デフォルトの名無しさん (ワッチョイ a744-u6uN) mailto:sage [2024/05/04(土) 09:25:16.85 ID:hhjXOeVD0.net]
ゆうてサーバ側でjs使うのはawait promise地獄になりがちで見た目がね



863 名前:デフォルトの名無しさん mailto:sage [2024/05/04(土) 11:46:29.84 ID:7p9CFEdI0.net]
>>862
いやasyncは見た目も地獄にはならんやろ
お前大幅に勘違いして無いか?

864 名前:デフォルトの名無しさん mailto:sage [2024/05/04(土) 12:25:25.54 ID:qT6RngEw0.net]
でもあと数年でC = python > js >>>> phpになる

865 名前:デフォルトの名無しさん mailto:sage [2024/05/04(土) 14:20:07.47 ID:0cPYdG0t0.net]
数年も経ったら、全く新しい別の何かになってる

866 名前:デフォルトの名無しさん mailto:sage [2024/05/04(土) 14:54:41.55 ID:ur5HC8pk0.net]
昔から「PHPは遅くて使い物にならなくなる:と言われてたが
結局シェア見ると落ちないしなぁ
PHP5時代と比べてPHP8の早いこと

867 名前:デフォルトの名無しさん (ワッチョイ a744-u6uN) mailto:sage [2024/05/04(土) 21:20:04.52 ID:hhjXOeVD0.net]
>>863
jsとphpで同じ動作の同期的なコードを書いてみ
async不要で同期でかける方がキレイなのは当然やろ
そらあんま複雑な処理が無けりゃ変わらんやろけど

868 名前:デフォルトの名無しさん (ワッチョイ 437b-GrxP) mailto:sage [2024/05/05(日) 00:06:00.25 ID:VpuIuth60.net]
>>867
いやawaitが付いてるだけで同じだぞ
JSは全部の関数にクロージャ付きだから変数も同様にアクセスできる点がphpとは違う
まあここはphpのスレなのでもういいが、気になるなら以下見てみ

> async function sequentialStart() {
> console.log("==SEQUENTIAL START==");
>
> // 1. これは即時実行される
> const slow = await resolveAfter2Seconds();
> console.log(slow); // 2. これは 1. の 2 秒後に実行される
>
> const fast = await resolveAfter1Second();
> console.log(fast); // 3. これは 1. の 3 秒後に実行される
> }
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function

869 名前:デフォルトの名無しさん mailto:sage [2024/05/05(日) 00:22:56.43 ID:VpuIuth60.net]
と思ったが、もしかしてJSって子関数はnew Promiseしないと駄目な感じか?
俺はてっきりC#のと同じと思ってたから勘違いしてたかも?
まあこの辺はこちらで確認する。

ちなみにcallback地獄はJSの連中が馬鹿だらけだから正当化してるだけで、
実はちゃんと抽象化して組めばcallback地獄にはならない。
そしてサポートの関係もあり、俺はasync/await使ってきて無いから勘違いしてるかもしれん。
さらに言うとPromiseもゴミだと思ってるよ。あれは不要な仕様だ。JSの連中はこれも正当化してるが。

というわけで、JSも色々ゴミだが、全体見るならphpの方がゴミだと思うぜ。

870 名前:デフォルトの名無しさん mailto:sage [2024/05/08(水) 01:04:50.50 ID:Aq7zVlUM0.net]
そんなPHPもpythonに比べたら10倍マシなわけで
世の中ままならないもんだよな

871 名前:デフォルトの名無しさん (ワッチョイ 6fe7-M17B) [2024/06/13(木) 08:47:33.24 ID:8kjXK8h10.net]
POSIXメッセージキューをサポートしてる拡張モジュール でおすすめをおしえて

872 名前:デフォルトの名無しさん mailto:sage [2024/06/15(土) 06:05:03.56 ID:jdN7cEyp0.net]
ニコニコ動画のランサムウェアって、phpの最近のやつと関係あるのかな
ttps://innovatopia.jp/cyber-security/cyber-security-news/31048/



873 名前:デフォルトの名無しさん mailto:sage [2024/06/15(土) 09:17:52.21 ID:nM9V99Q80.net]
ハイパーバイザーの管理権限まで盗られたって話だから
個々のランサムウェアがどれなのかなんて些末な問題だろうな

874 名前:デフォルトの名無しさん [2024/06/19(水) 19:07:59.04 ID:rcHRA2+h0.net]
FuelPHPの代替ってどんなのがあるの?

875 名前:デフォルトの名無しさん mailto:sage [2024/06/20(木) 02:13:33.44 ID:GIlSg4MN0.net]
Laravel一択

876 名前:デフォルトの名無しさん (ワッチョイ cfbb-muU0) mailto:sage [2024/06/23(日) 00:56:02.55 ID:/fMztCCi0.net]
なんかわけあって形態素解析ライブラリを作ろうかと思うんだけど辞書はMecabの辞書を使うとしてどうやって解析しようかな
最長一致で比較してマッチしたら抜き出すって方法を考えてるけど皆ならどう作る?

877 名前:デフォルトの名無しさん (ワッチョイ 3f4d-tL4z) mailto:sage [2024/06/23(日) 11:04:07.30 ID:BYEVr0N80.net]
作らない
断る

878 名前:デフォルトの名無しさん (ワッチョイ 7f63-uW6V) mailto:sage [2024/06/23(日) 11:07:53.98 ID:8Dr+KSC80.net]
宿題か?自分でやる方が良いぞ

879 名前:デフォルトの名無しさん mailto:sage [2024/08/31(土) 14:07:37.82 ID:o+gAgvj50.net]
>>874
flight

880 名前:デフォルトの名無しさん mailto:sage [2024/09/06(金) 14:19:31.11 ID:J9Dx+vkX0.net]
PHP v8.0.30で
$LDC=0;
$LDC=ldap_connect($ldhost)
ldap_set_option($LDC,'LDAP_OPT_PROTOCOL_VERSION', 3);
のldap_set_option()行でmust be of type int,string given in~のエラーが出たんだけど3がint値として読めないって言われてるのかな

881 名前:デフォルトの名無しさん mailto:sage [2024/09/06(金) 16:44:39.99 ID:QtgCCsYf0.net]
引数の、どれかだろ

882 名前:デフォルトの名無しさん mailto:sage [2024/09/06(金) 16:50:09.62 ID:xfC3DfZt0.net]
LDAP_OPT_PROTOCOL_VERSIONは定数なんだからクォートで囲っちゃだめでしょ



883 名前:デフォルトの名無しさん mailto:sage [2024/09/09(月) 18:23:38.31 ID:8AzXAdmE0.net]
>>882
言われた通りだったわ
ありがとー

884 名前:デフォルトの名無しさん [2024/09/23(月) 08:24:39.70 ID:TOpTpz460.net]
連想配列のarray_merge全然うまくいかんやん
ほんとなんなのこの言語、まじイラつく

885 名前:デフォルトの名無しさん [2024/09/23(月) 08:30:38.84 ID:TOpTpz460.net]
できてるけどvar_dumpで表示されてないだけか?
要素数23ってなってるのに15しか表示されん
まじでよーわからん

886 名前:デフォルトの名無しさん mailto:sage [2024/09/23(月) 09:07:14.03 ID:dfCQ5A4R0.net]
まず再現コード貼れよ、話はそれからだ

887 名前:デフォルトの名無しさん mailto:sage [2024/09/23(月) 09:28:56.66 ID:h2Aoyerx0.net]
再現コード貼れ しか言わない奴は大抵は
十分に与えられた情報を見ても解決できない
無能隠しの時間稼ぎなんだよね

888 名前:デフォルトの名無しさん mailto:sage [2024/09/23(月) 09:40:34.39 ID:dfCQ5A4R0.net]
>>887は超絶無能だとは断定出来るね

891がスーパーエスパーなら891の時点で答えを貼るべき
自分では出来ない癖に他人をやたら貶すのは超絶無能な奴の特徴
そもそも本件は、再現コードも数行で済み、それがあれば誰でも回答出来るレベルなので、
本件で「無能隠し」とか言い出す時点で、何が簡単で難しいか判断すら出来ない大馬鹿

889 名前:デフォルトの名無しさん mailto:sage [2024/09/23(月) 10:16:17.79 ID:nGCd//e20.net]
十分に与えられているとは思わないけどな
エスパーならできるかもしれんが、普通の人には無理

890 名前:デフォルトの名無しさん mailto:sage [2024/09/23(月) 11:44:05.43 ID:kXVPwjR50.net]
まあそうこうしてる間に本人は解決してるだろうよ、こんくらいなら
コードなきゃ>>885もイミフだしな

891 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 20:00:35.39 ID:hH68uGfdp.net]
>884-885
エスパーだから答えてあげる。恐らく下のうちのいずれかが原因。つまりPHPは間違えてなくて君が間違えている

1、null値が要素の中に入ってる。nullが入ってる場合は対象の要素を詰めてマージされるよ
2、配列のキーが文字列で指定されていて、配列Aと配列Bで同様の文字列キーを使用している。配列の文字列キーが同じ内容だと後列の文字列キーの配列要素で上書きされるよ。以下は例

$arr1 = ['key' => 'value1'];
$arr2 = ['key' => 'value2'];
$result = array_merge($arr1, $arr2);
// 結果: ['key' => 'value2']

3、配列ではない値を引数に入れてる。array_merge()に配列以外の引数を渡すと警告が発生して予期しない結果になる可能性があるよ。

1と2の合わせ技の可能性もあるな。なんにしてもドキュメント読む癖付けた方がいいぞ。

892 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 20:33:58.69 ID:RCBNwTlp0.net]
>>891
いやエスパーすべきは、
> var_dumpで
> 要素数23ってなってるのに15しか表示されん
の部分だと思うが。

そして俺がエスパーするなら、多分初心者用 『教材』 としてどこかの馬鹿が作った、
実用性皆無だが、PHPなりの型変換等で見た目奇妙な動作をする何かを与えられ、
動きを理解しなさい、或いはどうしてそうなるかを説明しなさい、みたいな 『練習問題』 をやらされてるのではないかと。
正直この手の 『クソ課題』 は無視でいいよ、他言語である程度組める実力があるのなら尚更。
array_mergeなんて普通に使ってる分には名前通りの直感的な仕様だし、ハマる所ではない。

PHPはクソだが、クソ糞言うのなら他言語使えばいい話であって、
PHP使うと決めた/決まっているのならクソであろうが使うしかないし、糞な所ばかり気にしてても始まらない。
そしてPHPが糞だと思うのはプログラミング言語と捉えるからであって、Web専用シェルと考えればすごく有用だと気づく。



893 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 22:38:14.36 ID:y4Her8JE0.net]
>892へ
>891の私がエスパーなりの解釈させてもらうw

>できてるけどvar_dumpで表示されてないだけか?
>要素数23ってなってるのに15しか表示されん

「できてるけど」=array_mergeは機能してるけど、
「var_dumpで表示されてないだけか?」=var_dumpして23あった要素が15に減ってるのは表示されてないだけか?
「要素数23ってなってるのに」=あ、ごめん主語無かったねぐへへへwつまり配列を直接var_dumpでデバッグした時は要素数23ってなってるのに
「15しか表示されん」=array_merge の結果をvar_dumpすると15しか表示されん

繋げると

array_mergeは機能してるけど、var_dumpして23あった要素が15に減ってるのは表示されてないだけか?あ、ごめん主語無かったねぐへへへwつまり配列を直接var_dumpでデバッグした時は要素数23ってなってるのにarray_merge の結果をvar_dumpすると15しか表示されん

いずれにしても>884-885のように話し言葉と書き言葉を一緒くたにしてしまう人や、脳みそと口または手が直結してしまって伝える内容を並び替えできない人とは本気で仕事したくないw

894 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 00:37:53.28 ID:793m8l+c0.net]
こんなことに数分でも時間つかうのがもったいないw

895 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 01:03:15.09 ID:xb00usC10.net]
そのコメント書くのに何分かかった?

896 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 10:54:14.55 ID:+POBWt7L0.net]
エスパーしてる連中がキモすぎる

897 名前:デフォルトの名無しさん (ワッチョイ dee7-rNKn) mailto:sage [2024/09/27(金) 16:27:53.83 ID:wGbKsk4o0.net]
$a = ["a"=>0, "b"=>1];
$b = ["b"=>1, "c"=>2];
$c = array_merge($a,$b);
var_dump($c);

俺が>>885ならまず最初にこれを疑うかな

898 名前:デフォルトの名無しさん (ワッチョイ 6f68-2Kaa) mailto:sage [2024/10/03(木) 19:40:44.30 ID:/z7xIJX+0.net]
netbeans使ってるんですが、こいつが出す警告(モジュールは20行以内にしろ、$_POST使うなとか、クラスは1ファイル1クラスにして名前を揃えろとか)には従っておくほうがいいんでしょうか?
$_POSTなんて入門サイトとか入門書だと未だに主流だし、今の相場がどんなものか知りたいです

899 名前:デフォルトの名無しさん mailto:sage [2024/10/03(木) 20:14:27.24 ID:+g5yChSt0.net]
netbeansってのは使った事ないから分からないけど「$_POST使うな」は無茶だと思うけどね
あとモジュールも20行以上になる事なんか当たり前にあるよ
実際にソース貼って、その上でどんな警告出てるかも貼った方がより正確に回答出来る気がする
コードの文脈を考えた時に必要無い処理である可能性もあって警告出してくれてるかもしれんからね(知らんけど)

900 名前:デフォルトの名無しさん mailto:sage [2024/10/03(木) 20:35:40.28 ID:SHWJQkyV0.net]
この辺ではなかろうか

「スーパーグローバル$_POST配列に直接アクセスしないでください」

901 名前:902 mailto:sage [2024/10/03(木) 20:53:20.38 ID:/z7xIJX+0.net]
>>899
>>900
実際のとこ、filterinputを使ったりモジュールは分割したりで回避できてるのですが、もしかしてこんなことやってるの俺だけ?って不安になったので

902 名前:デフォルトの名無しさん mailto:sage [2024/10/03(木) 20:59:42.10 ID:tAJvCxJt0.net]
>>900
netbeans使ってるけどそれだぞ
ちなみに表示は、以下

================================
スーパーグローバル$_POST配列に直接アクセスしないでください。

かわりにフィルタリング関数(例: filter_input()、is_*()関数を使用した条件など)を使用してください。
----
([Alt]+[Enter]キーを押すとヒントが表示されます)
================================


>>898
分からないのなら従うのが常道(=自分で自信持って不要と判断出来ないのなら従え)
入門サイトとか入門書がゴミなだけ、マジで参考にするのは全部php,netとlaravelにしろ
掲示板なんて簡単ですよ!とか言いつつgetで書き込みとか、死ねな入門サイトはいくらでもある
Qiitaの方がまだだいぶマシ、あいつらは自分でやった事を書いてるだけなので

> モジュールは20行以内にしろ
普通に経験があれば自分で判断出来る、出来ないのなら従え

> $_POST使うな
上記の通り、filter_input使え馬鹿、と出るはず

> クラスは1ファイル1クラスにして
Javaの文化で、つまり慣れの問題

> 名前を揃えろとか
意味不明(必要ないのではなく、何が言いたいのか分からんので判断付かない)



903 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 08:58:20.60 ID:/JNwl4gJ0.net]
>902
俺は>899だが$_POSTに関して、配列に直接アクセスしてゴニョゴニョすんなよってことね、理解した

>898
ちなみにfilter_inputをバリデーションとかサニタイズで使おうとすると期待してた動作通りに行かないこともままあるから気を付けてね。例としてhtmlタグ取り除きたい時とかは正規表現使って自分で関数作った方が良かったりする。いずれにしてもphpの組み込み関数使う時は必ずphpの公式リファレンス読むようにした方が良いよ

904 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 10:07:59.19 ID:5cV2iGMA0.net]
>>903
> 例としてhtmlタグ取り除きたい時とかは正規表現使って自分で関数作った方が良かったりする。
気持ちは分かるが特定のタグを除去したいときは公式DOM使った方がよいかと
単純な末端ノードならいいが、階層作られたらだいたい無理なので
なおボロカス言われてるDOMだが、俺はJSでもjQuery不要派なのでさほど不満はなかった

905 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 11:52:16.55 ID:/JNwl4gJ0.net]
>904
フロント側でタグを取っちゃうって認識で合ってるかな?自分が基本バックエンドの人間なのでフロント殆ど触らんのよね…w でも提案有難う

906 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 12:00:04.09 ID:b7vgemF30.net]
ちゃんとしたものを作ろうとすると、本格的ブラウザ作る並に大変笑

907 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 12:14:58.84 ID:M8Xyx2No0.net]
phpの話なのにフロントでタグ取り除くとかバックエンドで正規表現使ってタグ取り除くとか意味わからん

フロントでやるならJSの仕事だしバックエンドのPHPなら自分でhtml組み立ててるんだから正規表現使ってhtmlタグを取り除く必要とかそもそもない

908 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 12:48:49.83 ID:5cV2iGMA0.net]
>>905
htmlタグを取り除く=PHPでスクレイプ、或いは掲示板等で許可してないタグを投稿されたときに、PHPでタグを除去する場合を考えている

PHPのDOMはゴミ扱いされてるが、ほぼ生JSと同じなので個人的には問題なかった
正規表現は階層/入れ子を考慮されてないので、正規表現でhtmlをパースするのは死ねるし変な物を食わされたらだいたいバグる
とはいえDOM構築はそれなりに遅くなるので、スクレイプ先のhtml構造が単純かつ固定的なときは正規表現で除去するのもあり
フロント側に不要タグ含めて垂れ流すのもありだが、DBやネットワークの帯域を無駄に消費するだけなので、
可能であれば上流=PHP側で除去した方がいいのは事実

909 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 13:33:27.23 ID:swUgCMz+0.net]
filter_input使え って警告、PhpStormでは見たことないな
運良く推奨されるパターンでも踏んでるのかな

910 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 14:14:38.35 ID:5cV2iGMA0.net]
>>909
IDE内部のリンターなので、直接関係ないのと、
あったとしても普通に切れる

911 名前:デフォルトの名無しさん (ワッチョイ 3f72-Ligk) mailto:sage [2024/10/04(金) 16:00:15.82 ID:M8Xyx2No0.net]
>>908
PHPでスクレイプ時に特定のhtmlタグを取り除くってレアリティ高いな

そっちはいいとしてユーザー入力に許可されてないタグがあるならエラー返した方がいいと思うが除去するにしてもstrip_tagsやHTMLPurifierみたいな出来上がったものを使った方がいいのでは?

あとフロントでタグ除去するのはユーザーアクションに応じてhtmlを変更するためで不要タグを垂れ流してるわけではない

912 名前:デフォルトの名無しさん (ワッチョイ 037b-jS/a) mailto:sage [2024/10/04(金) 19:01:50.57 ID:5cV2iGMA0.net]
>>911
> strip_tagsやHTMLPurifierみたいな出来上がったものを使った方がいいのでは?
これらはいいね
言及出来なかったのは俺が単に知らなかったからで、タグ単位の除去にはこれらを使うべきだろう

> レアリティ高いな
そうでもないから上記の関数/ライブラリが整備されてるわけだ
ただPHPはこの手の、あると便利だが的な関数が無駄に多く、把握しきれてなかったのは上記の通り

> ユーザー入力に許可されてないタグがあるならエラー返した方がいいと思うが
相手がまともな人間の場合はそうだが、
攻撃目的で掲示板にタグを書き込んでくる場合、晒しの意味でも黙って落としてそのまま表示させるのもあり
瞬時にエラーを返してしまうと、何がどこまで駄目なのかすぐばれてしまう
何だかんだで無駄に時間をかけさせるのは地味に有効

> あとフロントでタグ除去するのはユーザーアクションに応じてhtmlを変更するためで不要タグを垂れ流してるわけではない
それは俺に言わせれば、(使う可能性のあるタグなので)仕様上サーバー側では落とせない、となる
サーバー側で落としておくべきなのは、どうやっても不要なタグ、具体的に言うとscriptとか、
或いは公式strip_tagsの警告に書かれてるとおり、onXXXX属性
ただstyle属性まで落とすと、タグを許可した意味が無くなってくるので、判断は難しいところ
opacityとかだけは許可しない等、属性も精査する気だと、結局DOM使う事になるとは思うが…HTMLPurifierでも出来るらしい
まあこの辺は要調査だな



913 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 19:47:14.07 ID:eshA0leg0.net]
>907
どう言うこと?w
PHPでデータベース扱ってる現場ならバックエンドにデータ飛んでくる前にタグ取り除くでしょ
俺の場合はPHPのユーザー定義関数で正規表現使ってタグ取り除く関数を作ったらhtmlのフォーム内でバリデーションとサニタイズ行なってるけど

>自分でhtml組み立てるんだから
分業してる現場なのでJSはフロントの子がやってるのよ
だからフロントは殆ど触らないし関数作ったらフロントの子に渡してる

914 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 19:48:47.53 ID:eshA0leg0.net]
>913
× htmlのフォーム内でバリデーションとサニタイズ行なってるけど

⚪︎ htmlのフォーム内に適宜関数を挿してバリデーションとサニタイズ行なってるけど

915 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 20:30:24.85 ID:5cV2iGMA0.net]
>>913
俺宛ではないが、>>907の使い方はまあ普通、というか9割以上の局面ではそうなる

> バックエンドにデータ飛んでくる前にタグ取り除く
そもそもDBへのアップデータでタグを許可してない/する必要ないのがほぼ全部
例えばここ5ch、安価は最終的に<a>として表示されるが、ユーザーの投稿段階ではただのテキスト
それをDB登録段階で<a>にしてしまうか、JSで<a>にするかは実装によるが、PHPでタグ除去なんてする必要がない

> PHPのユーザー定義関数で正規表現使ってタグ取り除く関数を作ったら
> htmlのフォーム内に適宜関数を挿してバリデーションとサニタイズ行なってる
> だからフロントは殆ど触らないし関数作ったらフロントの子に渡してる
もしかしてEmscriptenかWebAssenbly使ってPHPのコードをクライアントサイドで動かしてる?
それはすさまじくレアだと思うのだけども

916 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 21:11:39.79 ID:eshA0leg0.net]
>915
>PHPでタグ除去なんてする必要がない
これは自分の言葉足らずでしたわ。謝ります
ユーザーからのhtmlタグの投稿を一切許可していない現場なのよ、だからタグはDB到達前に全部サニタイズしてる

>もしかしてEmscriptenかWebAssenbly使ってPHPのコードをクライアントサイドで動かしてる?
いや、素のPHP(Laravelとかのフレームワーク使わず)でコード書いてて、ライブラリ含めて全てフルスクラッチで作成してる現場だよ

917 名前:デフォルトの名無しさん mailto:sage [2024/10/16(水) 16:44:48.13 ID:tW0ztwU3d.net]
先生!PHP独学したいのですが
独習PHP 第4版 山田 祥寛 (著)
これでいいですか?

C#
Java
VBA
JavaScript
経験者です

918 名前:デフォルトの名無しさん mailto:sage [2024/10/16(水) 22:44:42.10 ID:XSPkOsBG0.net]
>>917
php.netを頭から全部読めばそれで十分
多分SQLも必須、というかPHPは自身の変数等を保持する機構が言語にないのでどうせDBを使うことになる

919 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 00:25:58.27 ID:exPg1AY+0.net]
>>918
本物のワルなのでセッション使っちゃうぜ

920 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 00:33:42.25 ID:13fsix/Td.net]
>>918
先生!ぼくおじさんなので本にカキカキメモしながらじゃないと勉強できません
後出しですがSQLも基本的なところはできます
独習PHP 第4版が古すぎるとかいうのでなければよいのですが

921 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 08:25:20.34 ID:aXgLojE+0.net]
>>919
ユーザーまたげねえだろ
というか普通のサーバーのように、全体の変数を保持する事が出来ない
だから毎回初期値やデータを一からロードし直す必要があってウザかったが、
JSもクローム拡張V3では同様になってるから、サーバーとしては適切な構造なのだろうよ
PHPの場合、これにより毎回最初から行うのを強制され、結果的に毎回同じ動作となり、デバッグしやすくなってるのも事実
糞言語だが、何だかんだで結果的によく出来てるから使い続けられてる

でもやはりウザイのも事実で、Node他ならもうちょっとすっきり書けるのに、というのは多々ある
ちょっとした配列を保持出来てれば済むのに、一々DBにtry-catchになるから


>>920
持ってないから知らん

922 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 08:51:18.77 ID:Q0zeibWJ0.net]
>>921
セッションIDを知っていればユーザーを跨げるので、本物のワルはこれを悪用しちゃうぜ



923 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 09:15:02.73 ID:aXgLojE+0.net]
>>922
いやそれはアウトだろ
ただ、「絶対に誰にも使われないセッションID」を作れれば便利な倉庫に出来るのかな?
まあ俺はそこまでPHP知らんので止めとくが


しかしPHPは色々糞ったれなことが多い
今目に付いてるのはアップロードされたファイルが $_FILES["pictures"]["tmp_name"][$index] に入る点
逆じゃボケ!!!$_FILES["pictures"][$index]["tmp_name"] に入れろや!!!ってね
この辺一々糞コード化を余儀なくされてストレスが溜まる
まあlaravel導入すれば解決するんだろうけどさ

924 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 23:09:44.41 ID:goFejqio0.net]
>917
私見で恐縮だけど、それだけ他言語を学習済みなら(経験年数にもよるけど)基礎的な事は理解してるはずだから書籍はあんまり意味を為さないと思うなー
@他の人も言ってるようにリファレンス読み込むのがいいと思う。どのページに何が書いてあるか理解把握するのが大事かな、と。あくまで重要なのはリファレンスの内容を覚えるんじゃなくて、必要な時に直ぐに取り出せるように「何処に何が書いてあるか」を理解把握すると良いと思うよ。例えばphp7系とphp8系で大幅に仕様変更があったんだけどその差異を見るにはどのページ見れば良いかとか、もっとシンプルに言うと関数のリファレンスは何処に纏まってるか、とか。
@の手順が終わったら、プログラム経験者でphp手っ取り早く学びたいならLaravelの環境を構築するかまたはWordPress作って弄り倒すのが良いと思う。
前者の理由は、ここ数年のphp開発現場はLaravelを基本としてるから。
後者の理由は、WordPressはphpで構成されているのでソースレベルで弄り倒せるようになれればclassや一通りの組み込み関数も理解出来ていると判断できるから(俺社比)

若干話変わって個人的に興味があるのは、何故phpを学習したいと思ったのかを知りたいな
聞きたい理由としては、phpって言語としても旬は過ぎたし、もしWordPressが使われなくなったらレガシーな環境を除けばphpを選択する意味が無くなってきてると個人的に感じてるのよね。(俺自身はphp好きだけどw)

例えば最近ならNode.js+TypeScript+.vueとかの方が需要高いから何故phpを学ぼうと思ったかその機会を知りたいと思いました。長文スマンでした

925 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 23:37:25.31 ID:goFejqio0.net]
横レスおじさんだけどごめんね❤

>919 については、確かにセッション使えば自身の変数は保持できる

>921 に対しては、おっしゃる通りユーザ跨げない。後述(※参照)するけど、ユーザー跨ごうとすると変則的な運用のみ使えると思う(という知見しか自分には無い)から結論非常にオススメしない。

>922 マジでオススメしない。理由はセッションIDを対象ユーザー以外で使うのは大事故に繋がるから。
(※)一応例外も挙げておくけど、【そのサービスを1人しか利用しない】という前提ならもしかしたらありかな?とは思う。逆を言えばそれくらいのレベル感じゃ無いとセッションIDの使い回しは超御法度。
つまり非常に限定的で、ローカル環境で構築したサービスや外部非公開の環境というのが前提で、もし外部に公開するサービスならセッションIDは絶対に使い回しちゃダメよ、って事。

926 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 07:32:13.18 ID:IRpwug8I0.net]
>>924
> レガシーな環境を除けばphpを選択する意味が無くなってきてる
商用ならその通り
ただしレンタルサーバーのような小口だと、プロセス2秒でぶった切る運用が出来るPHPの方が相性がいい
だからブログにはPHP+WPの方が相性がよく、
今のところ他言語では…そういえばHugoとかあったがあれどうなったんだろ?

ちなみにphp.net、読み物としては非常に優秀だが、リファレンスとして逆引きするにはイマイチだと分かった
だから一通り知って、しばらく使わずに忘れて、再確認したいときに
> 何処に何が書いてあるか
を覚えておかないと辿り着けない
(逆に他言語は逆引きするように書いているから、頭から読む読み物としてはイマイチ)

927 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 08:54:50.32 ID:WQ7AgxmX0.net]
>926
うんうん、小口の場合は確かにphpですね。個人からの依頼や企業でも小規模なWEBページの依頼はphpが未だに多い印象。
php.netはそうなのよ、読み物としては立派なんだよね。phpの設定関連は読み込むと理解把握しやすい。一方で「この機能を実現する組み込み関数ってあるかな」と逆引きしたい時や、「ソース書いてて躓いた時、詰まった時」はあんまり役に立たない印象。
そこで次はどうするかというとネット記事(個人ブログ含)に行き着くんだけど、php関連のネット記事って有象無象入り混じってて特殊なアプローチ(裏技的な内容)やセキュリティガバガバのソース提示されてるから初学者はネット記事参考にしない方が良い、というね。
やっぱり実際の業務で学ぶか、WordPress作って理解するか、GitHubで学ぶとかがいいかなーと思う

928 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:05:17.56 ID:IRpwug8I0.net]
>>927
内容については全文同意でいいが、>>920に戻ると、

php.netは読み物としてはMDN/MSDN/Oracleと比べて段違いにいいので、
紙好きであっても初手として通読する事を進める(他言語のリファレンスを想定しているのなら特に)
どうしてもというなら全文印刷して読め、それくらい良質だ

一方で
> php関連のネット記事って有象無象入り混じってて特殊なアプローチ(裏技的な内容)やセキュリティガバガバのソース提示されてるから初学者はネット記事参考にしない方が良い
これは本当にその通りで、理由はPHPが糞言語でろくなコードが書けないというのも多々あるが、(927参考)
JSも相当に酷いので、「主戦場がWebなので(技術的/気分的に)『初心者にも』情報発信しやすい」のが主な理由だろう
Web系は馬鹿しかいないというのも通説ではあるが、
実際の所Cなんて仕事化されない限り(例えば大学の準教授で講義内容を公開するとか)上級者でもWeb記事なんて書かないから、
記事書いてる時点で大半は教える事が仕事として成立する程度のフィルタがかかってるので全然違う

(すまんがNGワード規制に引っかかるようなのでバラバラに落とす)

929 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:06:19.93 ID:IRpwug8I0.net]
ではどうすればいいかといえば、俺は「レビュー済み」のコードを参考にする事を勧める

930 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:07:10.73 ID:IRpwug8I0.net]
俺は上記の通り、JSではMDNのコードしか信用しない事にしてるが、それは「MDNは多数に見られてる」からだ(=酷いコードは修正済み)
StackOverflowが良質なのも、各回答がレビューされて上位順に並ぶからだ

931 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:07:41.36 ID:IRpwug8I0.net]
この点、php.netは同様に、各ページの下にコードがずらずらと『上位順』に並び、
結果的に各ページにStackOverflow並の上質なコードが付随する事になってる

932 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:08:32.58 ID:IRpwug8I0.net]
初学者であれを全部読むのは辛いだろうが、あのコードも読む価値があるので余裕があれば読むべき



933 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:09:03.23 ID:IRpwug8I0.net]
大体において各ページの機能のハマりポイントをコードで解説してある

934 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:09:27.64 ID:IRpwug8I0.net]
面倒なら、ハマったときにはググると同時にphp.netのその機能のコードも読む事だ

935 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:10:14.73 ID:IRpwug8I0.net]
ちなみに引っかかったらだいたいググるとQiitaで何とかなる事が多いはず
Qiitaも勿論いいサイトではあるが、結局「上位順」ではないので、StackOverflowに成れなかった、というより成り損ねた感がある
これは10年ほど昔にJS界隈でKenOkabe、通称「毛の壁」が、
細かい間違いを修正するよう突っ込みまくってウザがられて荒らし扱いされ、結局コメント機能が削除された、という経緯があるらしいが
結果的に「よりよいコード、より正しい情報を発信する」(StackOverflow的価値観)より、
「僕が気持ちよく情報発信する」(ゆとり世代的価値観)を優先したので、そうなってる
まあ創始者がゆとり世代だし、この判断が間違ってるかどうかも微妙で、例えば商業的意味なら「成功」となるのだが、
とにかく現状ではQiitaは玉石混淆、というよりゴミの方が多いので要注意
それでもないよりは100万倍いいので、素晴らしいサイトではあるけども

936 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:11:06.01 ID:IRpwug8I0.net]
これはQiitaのユーザーの問題というよりは、やはりレビューされてない事によるものだと思ってる
同様にGitHubでも個人レベルで公開してるのは、公開の場所が違うだけで、同様に糞コードの地雷原でしかない

937 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:11:36.87 ID:IRpwug8I0.net]
ただ世界的に超有名なOSS(勿論GitHub上)でも超絶糞コードな事に遭遇した事があるので、(なおC言語)
OSSで多数に見られてればコードの質が上がる、ということでもないらしい

938 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:11:54.86 ID:IRpwug8I0.net]
結局はレビュワーによるのだが、OSSでレビューで落としたら関係がそれなりに悪くなるらしいので、
長期戦略を考えたら糞コードもなかなかに落としづらいというのはあるのかもしれない

939 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:12:12.67 ID:IRpwug8I0.net]
この点、PHP自体もOSSの産物だから、はっきり言って機能がデタラメで統一感もなく、
大手がガッツリ整備してる他言語(C#/Java等)と比べたら色々チグハグだが、
これもそういうものだと認識して諦めるしかない
文句があるならお前が直せ、のOSS文化そのままだ
とはいえPHP8には表面的には機能が揃ってる感はあるが

940 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:14:03.60 ID:IRpwug8I0.net]
…多分「コード」がNGワードっぽい

941 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 18:47:58.42 ID:9d2rbs7t0.net]
ここは毛の壁の落書き帳です

942 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 20:59:29.50 ID:IRpwug8I0.net]
実際の所俺は、毛の壁が超えた、ゆとり世代的レッドラインがどの程度なのかは知りたいんだけどね
Qiita上では綺麗さっぱり消されてるので確認出来ないし

まあ言いたい事は、
つべこべ言わずpnp.netを読め、そして各ページのコードも読め、だ
他言語の常識でpnp.netを忌避するのは、勿体なさ過ぎる



943 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 10:50:17.35 ID:hAiZn1ip0.net]
環境: PHP 8.3.6, ubuntu24.04 LTS, oniguruma 6.9.9

mb_ereg_replace() に使う正規表現の中で (*FAIL) が使えません
PHP側で (*hoge) の形の正規表現パーツを無効化しているようですが
もし使えるようにする方法があれば教えて下さい
最近 oniguruma に (*SKIP) が実装されたので正規表現の高速化のために使いたいです

mb_ereg_replace()
https://www.php.net/manual/ja/function.mb-ereg-replace.php

944 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 11:21:53.55 ID:9J9C943n0.net]
知らんが常識的にはdllを差し替えるだけでは?

945 名前:947 mailto:sage [2024/10/21(月) 12:10:55.14 ID:hAiZn1ip0.net]
>>944
ありがとうございます、PHPで使われている正規表現ライブラリは最新のものでした

$ php -i | grep "onig"
Multibyte regex (oniguruma) version => 6.9.9

PHP側が古い可能性もあるので一応 PHP 8.4.0 RC2 を試してみます

946 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 12:46:44.10 ID:9J9C943n0.net]
>>945
6.9.9が最新ならお前は多分勘違いをしてるぞ

> Master branch
> Update Unicode version 16.0
> Add new operator (*SKIP)
>
> Version 6.9.9
> 以下略
> https://github.com/kkos/oniguruma
この書き方なら、『開発中の』Master branch(=6.9.10としてリリースされるであろう物)には入ってるが、まだリリースされてない
つまりどのPHPバージョンにも普通は入ってない
だから自分でonigurumaをコンパイルして差し替える必要がある

947 名前:947 mailto:sage [2024/10/21(月) 13:48:46.27 ID:hAiZn1ip0.net]
>>946
onigurumaの差し替えはやる予定でした、そこに気付かれるとは..すごい

しかし (*FAIL) すら使えないのでonigurumaの差し替えをしても意味が無いんです
恐らくPHP側で無効にしていると思われるのですが有効にする方法をどなたか..

948 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 14:34:37.43 ID:9J9C943n0.net]
>>947
> やる予定
それは実際に試して言ってる?

一般的にdllは呼ぶだけで、その前の段階で前処理なんてしない
というかそれやったら、PHP側のコードをonigurumaのバージョン毎に変えないといけなくなるだろ
無駄に依存性が増えるだけになってしまう
他ライブラリなんていつどう更新されるかも分からないのに

だから普通は差し替えれば動くだけ
動かないのであり、かつその原因がそちらの予想通りPHP側にoniguruma特定バージョン用のパッチが当ててある場合は、
php.iniにそれを切る為の設定が(一般的には)あるはず

でも繰り返すけど、普通はそうはせず、差し替えたら動くだけ、差し替えなければ動かないだけ、だと思うよ
動かないなら、そちらの設定間違いで、うまくdllを掴めてない可能性の方が高い
実際その(*FAIL)がどういう機能か知らんが、 (* 自体は対応してないとエラーになるでしょ
普通はそのエラー自体もライブラリ、つまりonigurumaやpeclに判定させて、throwさせるものだから

949 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 15:05:17.60 ID:9J9C943n0.net]
>>948 訂正

× pecl
○ pcre

分かる範囲だがphpにはpeclもあるようなので…

950 名前:947 mailto:sage [2024/10/21(月) 15:21:24.44 ID:hAiZn1ip0.net]
>>948
>それは実際に試して言ってる?
実は最初から最新の Master branch (3237 commits) しか入れていません
つまり oniguruma 6.9.9 のリリース版を使っていません
このことを忘れてました、リリース版でも確認してみます、すみません..

そういうものですか、なるほど
php.ini と oniguruma 側の確認もしてみます
お時間取らせてしまって申し訳ないです、ありがとうございました

951 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 15:30:29.11 ID:9J9C943n0.net]
>>950
> リリース版でも確認してみます
いいね、これで確認出来る。差が出ればdllは当たってる
あとは、サーバー側の設定は別のはずなので、コマンドでは動くがサーバー上では動かない場合はこれ

952 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 20:10:27.85 ID:QKrgL0if0.net]
>943

preg_replaceで代替どうぞ

$pattern = '/foo(*SKIP)(*FAIL)|bar/u';
$replacement = 'baz';
$subject = 'foobár';

$result = preg_replace($pattern, $replacement, $subject);

echo $result; // foobaz



953 名前:947 mailto:sage [2024/10/21(月) 20:30:30.28 ID:hAiZn1ip0.net]
>>951
リリース版でも試しましたが結果は変わりませんでした、 (*FAIL) は使えませんでした
リリース版でも Master branch の最新版でも oniguruma 単体では (*FAIL) を使えます

php.ini にも (*FAIL) などを無効化するような設定は見当たりませんでした
PHPをコンパイルする前のソースも見てみたのですが該当しそうな場所を見つけられていません

しかしまだまだ調査不足なのでもっと調べてみます
もしかしたら思いもよらない場所にある古い oniguruma ライブラリを参照している可能性もあります
何か分かりましたらまた来ます、今日は色々教えて頂きありがとうございました!

954 名前:947 mailto:sage [2024/10/21(月) 21:31:17.66 ID:hAiZn1ip0.net]
>>952
すいません!レスに気付いてませんでした!
頂いたコードで (*SKIP)(*FAIL) が正しく動作しているのを確認出来ました

しかし私は mb_ereg のほうを使わなければなりません、正規表現で UTF-8 以外の
エンコードを使うためです、せっかく作って頂いたのに申し訳ない..

> á
おお、 /u はこんな挙動するんですね、勉強になります

955 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 07:31:12.59 ID:frvkcjlG0.net]
>954
なるほどね理解しました。根本的な解決に向けての助力は他の方が回答してくれてるので、俺は一時的な回避策(w)を提示するよ。その場凌ぎなので悪しからず

$original_encoding = 'SJIS'; // 例: Shift-JIS など

// 文字列を一時的に UTF-8 に変換
$subject = mb_convert_encoding($subject, 'UTF-8', $original_encoding);

// preg_replace を利用して (*SKIP)(*FAIL) を使った正規表現を適用
$pattern = '/foo(*SKIP)(*FAIL)|bar/u';
$replacement = 'baz';
$result = preg_replace($pattern, $replacement, $subject);

// 結果を元のエンコーディングに戻す
$result = mb_convert_encoding($result, $original_encoding, 'UTF-8');

echo $result;

956 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 08:51:20.86 ID:OD5ng7w50.net]
>>953
それだと、用意したdllは使われておらず、どこかにある古いonigurumaを掴んでいるように見えるな
なら、今掴まれているdllを特定して、そのファイルと差し替えるのが一番早いかと

windowsなら実行中の各プロセスがどのdllファイルを掴んでいるかはprocessExplororで簡単に分かるが、
Unixだと聞いたことない(…が、あるんだろうけど)
ググるとlddで静的解析は出来るらしい(使ったこと無いが)
ただこれは自分でコマンドとして起動する場合用だから、
apache/nginxを起動してるユーザーで実行すれば命中するが、ただのユーザーではいまいちだな
https://stackoverflow.com/questions/50159/how-to-show-all-shared-libraries-used-by-executables-in-linux
https://linux.die.net/man/1/ldd
(実際色々変わってるらしいので何ともだが、昔と同様の起動形態だと、
rc*.dを改変してapache起動直前にlddすれば確定する《はず》)

あと、xampp環境だと php_mbstring.dll というものがある
これがonigurumaかどうかは分からないが、そうだった場合、php_*となっているのは通常、
「そのものではなく、php側が用意したラッパをつけた状態でdllにした」ことを意味するので、
oniguruma単体ではなく、ラッパつけて再コンパイルする必要があるかも

957 名前:947 mailto:sage [2024/10/22(火) 21:24:40.11 ID:u1LoTuab0.net]
書き込み規制が出たので簡素化して書きます
mb_ereg_replace() で (*FAIL) が動かない原因は oniguruma のライブラリの
バージョンが古いという問題ではありませんでした
oniguruma 6.6.0 で追加された (?W) が使えない一方で 6.9.5 で追加された
\x{HHHH HHHH} が使えるなどバージョンの違いでは説明出来ない動作がたくさん確認出来ました

この問題は恐らく解決が困難だと思うので諦めます
お二方、お付き合い頂きありがとうございました、勉強になりました、感謝です

958 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 22:48:01.75 ID:OD5ng7w50.net]
>>957
お疲れ
すんなり行かない場合はかなりハマる案件なので、判断は妥当だと思う
なおオープンソースの新機能周りってわりと普通にバグってるので、意味不明な場合はこれかも

959 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 06:42:46.86 ID:/9Lix2oc0.net]
>>957
そういえば書き込み規制の件、
もしまだ原稿が手元に残ってるなら、
多少読みにくくてもいいから、バラバラにするなり、他板のテストスレに落とすなりしてもらえないだろうか
情報が有るのと無いのでは全然違うので、俺は読むから

コピペ規制なら、例えばmango板は規制チェックの為の板なので、落とせるし
agree.5ch.net/test/read.cgi/mango/1715675838/

960 名前:947 mailto:sage [2024/10/23(水) 14:05:07.85 ID:ETlmKTT60.net]
現時点では php-mbstring の問題だと思っています
これはPHPに後から追加するPHPの拡張モジュールです、このモジュールが oniguruma の
ライブラリのファイルを参照します

oniguruma は各正規表現パーツごとに有効、無効を切り替えられる仕様になって
いるのですが、oniguruma を呼び出す php-mbstring 側で (?W) や (*FAIL) が
有効にされていない可能性が高いと考えています

以下のページは oniguruma の各パーツごとのオプション名を説明するページです
s://github.com/kkos/oniguruma/blob/master/doc/SYNTAX.md

このページを "Set in:" でページ内検索すると各パーツがどのプログラム言語用の
正規表現ルールに適用されるかが分かります

(?W) は 30番目の ONIG_SYN_OP2_OPTION_ONIGURUMA というオプションを
有効にすると使えるのですが、これが適用されるルールは 「Set in: Oniguruma」と
書いてあるので正規表現ルールを "Oniguruma" と指定しないと使えません

しかし php-mbstring のソースを見てみると選べる正規表現ルールの中に "Oniguruma" は
ありませんでした、つまり正規表現ルールを "Oniguruma" に変更出来れば (*FAIL) なども
使えるようになる可能性があります(そう簡単に上手くいくとも思えませんが)

961 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 14:05:25.05 ID:uHtllYPK0.net]
その辺まで行くとissue読み漁らないとたどり着かない領域かもね

962 名前:947 mailto:sage [2024/10/23(水) 14:43:46.47 ID:ETlmKTT60.net]
あと、話を簡素化するために嘘を書いてしまったので訂正します
php-mbstring ライブラリが参照している oniguruma ライブラリを教えて頂いた
ldd コマンドで調べたところ、以下のように別ファイルを参照していました

php-mbstring が参照していたパス
/usr/lib/x86_64-linux-gnu/libonig.so.5.4.0

私が入れた oniguruma ライブラリのパス
/usr/local/lib/libonig.so.5.4.0

php-mbstring が参照していたライブラリのファイルサイズは私が入れたライブラリの
半分ほどだったので恐らく古いライブラリだったのだと思います
そこで php-mbstring が参照しているライブラリを最新の Master branch のライブラリに
置き換えて (*FAIL) が使えるかを試してみましたが結果は変わらず、使えないままでした

>>944 でご指摘して頂いたことは的を射ていたということになります
お詫びして訂正致します、すみませんでした



963 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:17:15.79 ID:/9Lix2oc0.net]
>>962
いや全く謝る必要はない
その辺まで行ってる時点で大したもんだし、よく言われてる「報告」についても、君はよく出来てるよ

> oniguruma は各正規表現パーツごとに有効、無効を切り替えられる仕様になって
> いるのですが、oniguruma を呼び出す php-mbstring 側で (?W) や (*FAIL) が
> 有効にされていない可能性が高いと考えています
なるほど、これを知ってたから最初から無効化を疑ってたわけね
俺は知らなかったから、一般論で答えてしまったが
正規表現の場合は互換性が問題になるから一々細かくやらないと駄目なのかもね

> 正規表現ルールを "Oniguruma" と指定しないと使えません
これは微妙にちと違っていて、あの書き方だとただ単にフラグだから、C的にありがちなのは、以下α
(最近使ってないなら文法間違ってるかもだが)

多少行儀のいい場合:α
#define ONIG_SYN_OP2_OPTION_ONIGURUMA 0x04000000 // oniguruma内
onigSyntaxType.op2 |= ONIG_SYN_OP2_OPTION_ONIGURUMA; // php_mgstring内

あるいはドベタに:β
onigSyntaxType.op2 |= 0x40000000; // php_mbstring内

"Oniguruma"指定の場合は、多分:γ
OrigSyntaxType Oniguruma = {0xfff7d556, 0x47eb7bd2, 0x87a00bdb}; // oniguruma内
OrigSyntaxType origSyntaxType = Oniguruma; // php_mbstring内

要するにビットを立ててるだけなので、op2の[30]を立ててしまえば使えるようになる
Oniguruma指定は一番手抜きが出来て楽だが、
php_mbstringの機能追加タイミングがOnigurumaのバージョンアップと同期してしまう
だから互換性を重視しつつ、必要なタイミングで上位機能を取り込みたい場合は、普通はαにする
そして結果的にOniguruma指定と同じになる事を(長期的に)目指す

964 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:18:06.80 ID:/9Lix2oc0.net]
なので検索する場合は、Onigurumaが無ければ、
ONIG_SYN_OP2_OPTION_ONIGURUMA を探し、それもなければ
0x を探す(一応0Xでもいいらしいのでそれも)


とまあ、ここまで書いてると、「そこまで言うならお前が見ろや!」なので見てみる
最新版とか知らんのでpnp.netのdownloadページの8.3.12をDLした(CurrentStable)
ああ俺は、他人のコードを読み足りない、と認識してるから、こういう機会があれば読む事にしているだけだ
今風に言えば、べっ別に、あんたの為に読んだ訳じゃないんだからね!!!(だが男だ)

さて上記検索試すが、空振る。そして後付ではあるが
php-8.3.12>grep -n -r -i OnigSyntaxType *
ext/mbstring/php_mbregex.c:62: OnigSyntaxType *regex_default_syntax;
ext/mbstring/php_mbregex.c:455:static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, size_t patlen, OnigOptionType

options, OnigSyntaxType *syntax)
ext/mbstring/php_mbregex.c:489:static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionType option,

OnigSyntaxType *syntax)
ext/mbstring/php_mbregex.c:595: OnigSyntaxType **syntax)
ext/mbstring/php_mbregex.c:997: OnigSyntaxType *syntax;
ext/mbstring/php_mbregex.c:1268: OnigSyntaxType *syntax;
ext/mbstring/php_mbregex.c:1332: OnigSyntaxType *syntax;
ext/mbstring/php_mbregex.c:1463: OnigSyntaxType *syntax = NULL;
ext/mbstring/php_mbregex.c:1591:static void _php_mb_regex_set_options(OnigOptionType options, OnigSyntaxType *syntax, OnigOptionType

*prev_options, OnigSyntaxType **prev_syntax)
ext/mbstring/php_mbregex.c:1608: OnigSyntaxType *syntax, *prev_syntax;
当たり前だが、変化する値側ではなく、固定的な型名で検索するべきだった

965 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:19:18.35 ID:/9Lix2oc0.net]
そして順当なら php_mbregex.c:1591:static void _php_mb_regex_set_options なので見てみる
prevをデフォに戻して新しい値をセットするだけのようだ
そもそもprevが何故いるのか?はかなり疑問だが、まあいい
とにかくビットを立ててしまいたいだけなら、ここを改造して、上記βしてしまえば、ここを通る限り常にビット30が立つようになる
コンパイル通るかどうか知らんが、例えば具体的には、

MBREX(regex_default_options) = options;

MBREX(regex_default_syntax) = syntax;
(*syntax)->op2 |= 0x40000000; // これを最後に追加

MBREXはマクロ
#define MBREX(g) (MBSTRG(mb_regex_globals)->g)
MBSTRGもマクロ
mbstring.h:118:#define MBSTRG(v) ZEND_MODULE_GLOBALS_ACCESSOR(mbstring, v)
ZEND_MODULE_GLOBALS_ACCESSORもマクロ
Zend/zend_API.h:255:#define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) ZEND_TSRMG(module_name##_globals_id,

zend_##module_name##_globals *, v)
Zend/zend_API.h:270:#define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) (module_name##_globals.v)
2つ出るのは#ifdefと相場が決まっており、今回も#ifdef ZTS らしいが、ZTSってなんだっけ?
まあとにかくこの辺はここまででいい、とにかく更新してるだけっぽいし

966 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:21:26.39 ID:/9Lix2oc0.net]
その他、
ext/mbstring/php_mbregex.c:489:static size_t _php_mb_regex_get_option_string
ext/mbstring/php_mbregex.c:594:static bool _php_mb_regex_init_options
とか、いかにもなので君には分かるだろう
真面目に直すのならこの辺だね

ちなみに regex_default_syntax を修正してもいけるはず。これは
ext/mbstring/php_mbregex.c:84:pglobals->regex_default_syntax = ONIG_SYNTAX_RUBY;
とモロクソに書いてある
君の読み通りなら、そこを

pglobals->regex_default_syntax = ONIG_SYNTAX_ONIGURUMA; // RUBYからONIGURUMAに変更
ついでに
ext/mbstring/php_mbregex.c:601:*syntax = ONIG_SYNTAX_ONIGURMUA; // RUBYからONIGURUMAに変更

なのだろうね
grep -n -r ONIG_SYNTAX *
でONIG_SYNTAX_RUBYが引っかからないから、おそらくONIG_SYNTAX_RUBYはoniguruma側で定義されてる
だからoniguruma側で同様にgrepして ONIG_SYNTAX_ONIGURUMA が定義されてればいけるかも
てかこれ見る限り、毎回initしてるのか?(まあdllならそうかもだが)
そして _php_mb_regex_init_options内case '*' の部分をphp.iniかどこかで設定出来るようにしてるはずではあるが


ただ普通に考えて、prev_syntaxって何ぞ?ではある
regexで「今回の」文法を切り替えるのは分かるが、「前回の」は明らかに要らないので、
それがある=何か無理矢理切り替えて動かしてる感あり、なので、単純にビット立てるだけでは駄目かもよ
ダラダラ書いたけどこんな感じ

とはいえ、君はほぼ辿り着いてるよね
php_mbstringのコンパイル環境の立ち上げがすんなり行くかはやってみないと分からないが

967 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:21:59.96 ID:/9Lix2oc0.net]
あとついでに言うと、推定だが、順当には、

当初:php->onigurumaを直接呼び出し

おそらくonigurumagaの更新でAPIが変わって、

現在:php->php_mbstring->oniguruma と呼び出し、
php->php_mbstring間のAPIは固定、
php_mbstring->onigurumaでonigurumaのAPI変更に対応、
つまりonigurumaが変更されてもphp_mbstringの変更のみで対応し、php 本体は一行も変更無しでいけるように分離した、
だと思うので、君の予想する「oniguruma用に何かしてるコード」はphp_mbstring側に全部突っ込まれてるはず
まあこれも一般論だが

968 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:31:46.47 ID:/9Lix2oc0.net]
>>963
分かる範囲だが一応訂正

× (最近使ってないなら文法間違ってるかもだが)
○ (最近使ってない か ら文法間違ってるかもだが)

969 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:52:29.22 ID:/9Lix2oc0.net]
さらについで
ONIG_SYNTAXは仕様としては任意のビットを立てたり落としたり出来るはずだが、
実際はこの手の奴は大体テストが甘くて、組み合わせによっては動作しなかったりする
ではどうするか?と言えば、テスト済みであろう組み合わせに出来るだけ近い物を使う
今回ならRUBYかONIGURUMAに一番近いものだが、まあ、両方とも似たり寄ったりだな

しかしよく見ると、RUBY 指定なら ONIG_SYN_OP2_ASTERISK_CALLOUT_NAME は立ってるではないか
php_mbstringのソースだけ見るとデフォはRUBY指定だから動くはず
となると何らかの理由で _php_mb_regex_init_options で他指定に切り替えられてるのか?
ならば手抜きで直すなら、
ext/mbstring/php_mbregex.c:607-656を全部コメントアウトして case 文を無視、
何をどう指定されても ONIG_SYNTAX_RUBY(あるいはONIG_SYNTAX_ONIGURUMA) になるようにしてしまうとか、かな

970 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:37:30.51 ID:/9Lix2oc0.net]
>>960
てゆうかすいません、モロクソに書いてましたわ
dllだけ差し替えて'r'指定で行けるはずですわ
もうちょっと眺めて投稿すべきだった(これもかもだが)

(すまぬが引っかかるのでバラバラに落とす)

971 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:40:00.93 ID:/9Lix2oc0.net]
_php_mb_regex_init_options は各関数で毎回呼ばれてる
(_php_mb_regex_ereg_replace_execからも)

972 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:41:25.78 ID:/9Lix2oc0.net]
そしてこれをPHPから呼ぶのが mb_regex_set_options で、



973 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:42:52.32 ID:/9Lix2oc0.net]
> Regex 構文モード(ひとつだけ設定可能です)

974 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:43:08.35 ID:/9Lix2oc0.net]
> https://www.php.net/manual/ja/function.mb-regex-set-options.php
とモロクソ書いてますな
そして何故かそのphp.netページにはデフォが何か書いてないが、
'r'指定すればRUBY指定(=ONIG_SYN_OP2_ASTERISK_CALLOUT_NAMEがON)になる
'p'指定でもいけるかも?

そしてこのフラグは mb_ereg_replace でも使えるらしい。つまり、
mb_ereg_replace(
string $pattern,
string $replacement,
string $string,
?string $options = null <- ここに指定、例えば 'r' or 'p'
): string|false|null

これで使えるなら、dllだけ差し替えればC側の修正は不要(そして多分これで上手く行く)

975 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:43:51.89 ID:/9Lix2oc0.net]
それでも駄目、或いはRUBY指定やPERL指定では使えない機能も使いたいなら、
_php_mb_regex_init_optionsに

case 'o':
*syntax = ONIG_SYNTAX_ONIGURUMA
break;

を追加して、'o'指定してやるとかすればいけるはず
敗因は、oniguruma側で細かくregexを切り替えられる事を知らない人にとっては
> Regex 構文モード(ひとつだけ設定可能です)
とか意味不明だからだな
最初にそこを言ってくれてれば、ピンと来た人がいたかも?

976 名前:デフォルトの名無しさん mailto:sage [2024/10/24(木) 01:07:24.54 ID:D6fJlQ4l0.net]
>>974
訂正、perlなので' p と思ってしまってたが z だった orz

× 'p'指定でもいけるかも?
○ 'z'指定でもいけるかも?

× 例えば 'r' or 'p'
○ 例えば 'r' or 'z'

あと var_dump(mb_regex_set_options(null)); でデフォを確認出来る
多分 "r" と出るはず


あと
>>969
> しかしよく見ると、RUBY 指定なら ONIG_SYN_OP2_ASTERISK_CALLOUT_NAME は立ってるではないか
> php_mbstringのソースだけ見るとデフォはRUBY指定だから動くはず
の部分も一部訂正だが、これは俺だけが悪いのではなく、GitHubのSYNTAXページも間違ってるな
上側の説明部分では

> 28. ONIG_SYN_OP2_QMARK_BRACE_CALLOUT_CONTENTS (enable (?{...}))
> Set in: Oniguruma, Perl, Perl_NG
> 29. ONIG_SYN_OP2_ASTERISK_CALLOUT_NAME (enable (*name))
> Set in: Oniguruma, Perl, Perl_NG
となってて、Onigurumaならフル機能のように書かれてるが、下の表だと 28,29はOnigurumaでは付いてない
まあどっちが正しいのかは謎だが、意味不明な挙動するのはこの辺の問題もあるかもよ
これでは結局の所、RUBYやONIGURMUA指定で欲しい機能(29と30か?)が動くかどうかがよく分からんし
(まあ自前で立ててやればいいんですけどね)

977 名前:947 mailto:sage [2024/10/24(木) 12:35:15.79 ID:CfDH66X40.net]
ありがとうございます、おかげ様でゴールが見えてきた感じです
すごい解析力に脱帽でした、読みながら「すごいな〜」を連発してしまいました
ちょっと昔に DAN KOGAI さんを見たときも衝撃を受けましたがそんな感じでした

本当は (*FAIL) が動くのを確認してからレスしたかったのですが
何かにハマっているらしくまだ成功していません
しかしもう PHP の問題というより oniguruma の問題ですので
ここから先は自力でなんとかなりそうです

> 28. 29.
これは表が間違ってます、以下は ONIG_SYNTAX_RUBY のオプション指定です
https://github.com/kkos/oniguruma/blob/43a8c3f3daf263091f3a74019d4b32ebb6417093/src/regparse.c#L122-L162

#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby)
https://github.com/kkos/oniguruma/blob/43a8c3f3daf263091f3a74019d4b32ebb6417093/src/oniguruma.h#L444

今は (*FAIL) が使えるようになるかの手っ取り早い確認のために oniguruma ライブラリ側をいじり、
上記の ruby のオプション指定に oniguruma のものをコピペして動くかどうかを試していますが
今のところ結果が変わりません (ライブラリの置き換えに失敗している?)

ちょっと日数がかかるかも知れませんが成功したらご報告に伺います、ありがとうございました!

978 名前:デフォルトの名無しさん mailto:sage [2024/10/24(木) 22:06:48.35 ID:D6fJlQ4l0.net]
>>977
> これは表が間違ってます
確認した。md打つときに列が一個ずれて、onigがyesになるべき所がRubyの列に入ってるんだな
誰か余裕があったら指摘してあげて

> 上記の ruby のオプション指定に oniguruma のものをコピペして動くかどうかを試していますが
いいね。この方が早そうだ

> ちょっと日数がかかるかも知れませんが成功したらご報告に伺います、ありがとうございました!
はいまあ頑張って


ちなみに1つバグ、というか不一致を発見した
php_mbregex.c内、_php_mb_regex_init_options関数で、単純にRubyの r 指定等すると上書きしている為、
『最初に』指定しないと正しく動作しない(それ以前に指定したフラグが全部キャンセルされる)
しかしphp.netには『最後に』と明記してある
> モードを設定する際には、モード文字は最後に指定しなければなりません。
> https://www.php.net/manual/ja/function.mb-regex-set-options.php
これも誰か余裕有ったら指摘してあげて。勿論報告者の手柄にしていい

本来はPCRE側、つまりpreg_replaceと同様にすべき
となると多分フラグの順は問わないので、
2パスにして1周目でRegex構文モードを、2周目で各フラグを設定するようにCを修正するのが正しい
ドキュメント修正で済ませる場合は上記の通り、『最後に』と修正すれば終了
(Cの修正案が要るなら俺が書いてもいい、が、手続きとか知らんし面倒だから誰かやってくれ、勿論報告者が発見した事にしていい)

だからまあ、挙動不審なのはもしかするとフラグの指定順がまずいのかも

979 名前:デフォルトの名無しさん mailto:sage [2024/10/24(木) 22:08:58.49 ID:D6fJlQ4l0.net]
> すごい解析力に脱帽でした
お世辞乙だがマジレスすると、実は普通に読めて、それがOSSの定義だったりするので、そんなにすごくもない
phpも30年間OSSとしてずっとメンテされており、当たり前だが多くの人が読めるからメンテ出来てる
だから逆に言えば、読めないコードはOSSとしては生き残れないし、30年は淘汰に十分な期間ではある
よって、長寿OSS、つまりphpやGNUやLinuxは、OSSに参戦するレベルの連中ならある程度読めて当然で、
「僕が読めないから汚いコ
ードだ」と寝言ほざいてる奴には「お前の頭がOSSの域に達してないだけだ馬鹿タレ」と返していい

ただ読めると言っても実際に読んでいるわけではなくて、
この仕様ならこういう作りだろうなという予測通りになっているのをなぞっているだけ
だから逆に、初心者や、まだ淘汰されてないOSSのコ
ードとかは、普通に読めない
(読む価値無いから無視でいいのだが)

だから今回は
> 以下のページは oniguruma の各パーツごとのオプション名を説明するページです
これが大きかった
そしてこれがpnp.net上のRegex構文モードと対になってるのが分かると、なるほどね、となった
まあ結局、一通り出来るようになって、書くのには苦労しなくなると、あとは仕様の理解度で差が出る、ということ

php_mbregexのコ
ードは悪いコ
ードではないね
愚直にやってるだけのドベタなコ
ードで、すごくもないが、でもこういうコ
ードがOSSとしては長生きするのだろうよ

(変な改行はNGワード逃れ)

980 名前:947 mailto:sage [2024/10/25(金) 21:53:01.03 ID:hP0G6XWW0.net]
> OSSに参戦するレベルの連中ならある程度読めて当然

これが出来るようになることがどれだけすごいことか..
ここでこうやって語って下さるだけでも私含め誰かのためになるめちゃめちゃ
貴重な存在ですよ、いつまでも元気で現役して下さい!

> OSS 淘汰
後で手を入れる人のことまで考えてコーディングされていたんですね
そこまで考えてませんでした、目からうろこです

> 間違いの報告
私はC言語を知らないので間違いの確認作業が出来るか自信がありませんが確認出来たら
報告しに行きますね (ここの回答者様のほうが適任だと思いますのでどなたか余力のある方は是非..)

981 名前:デフォルトの名無しさん mailto:sage [2024/10/26(土) 20:57:24.64 ID:BX88EvoL0.net]
>>980
> 私はC言語を知らないので
それでソースファイル当たるとは勇者だな。ただ姿勢としては正しい
ソースなんて読める読めないではなく、読む読まないだし、
そもそも読めない奴こそ勉強になるから読めであり、
読める奴(=そのコード構成が自分でも組める奴)が読んでも得る物はあまりない

> 間違いの確認作業が出来るか自信がありませんが確認出来たら
> 報告しに行きますね
Cに関しては俺がフォロー出来るが、それ以前にバグって無さそう(すまんが俺の勘違いっぽい)
よく見ればフラグは optm |= で溜めてて、文法の切り換えは *syntax = なので上書きしてない
だから正確には、

× モード文字は最後に指定しなければなりません。 (現在の表記)
○ 最後に指定したモード文字が有効になります。

ではあるが、現在の表記でも問題はないはず


なおonigurumaの表の間違いはGitHubのissuesに凸すれば多分本人(kkos)がすぐ直してくれる
そちらはonigurumaをよく知ってるみたいなので、こちらはやってみてどうぞ

982 名前:947 mailto:sage [2024/10/27(日) 14:13:33.60 ID:heVNiBfi0.net]
> そもそも読めない奴こそ勉強になるから読めであり
そうですね、読んでて色々勉強になってます
書けと言われたらさっぱりですが読むほうでは少しだけ進歩したな、とは感じます

> それ以前にバグって無さそう
これは良かったです、正直私には荷が重かったのでw

> モード文字は最後に指定しなければなりません
これは mbstring の作者さんが意図するところがはっきり分からないので悩みます
「最後の文字だけ取り出せば指定されているモードが分かる」という仕様に
することを視野に入れているのかも知れませんし..

一応英語のページも見ましたが日本語と同じ意味で書いているようです
https://www.php.net/manual/en/function.mb-regex-set-options.php

> oniguruma の表
この SYNTAX.md は oniguruma 作者さんが作ったページではなく第三者が作ったものを
マージしたものらしく、ページが作られてから1年弱で更新が止まってます
https://github.com/kkos/oniguruma/commits/master/doc/SYNTAX.md

最後の更新から5年近く経っていて情報も古くなっています
私がやるならこのページを oniguruma 6.9.9 のものに更新します
しかし今は php で (*SKIP) を動かすことを目指しているのでその後にやりますね

oniguruma で指定されている option を読み込んであの表を出力するプログラムが
あったら便利そうです、いつか作るかも知れません



983 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 10:05:20.25 ID:l7XbYqqi0.net]
>>982
言い方が悪かったかもしれないが、php.netの表記は直す必要がない。(直すべきではない)
プログラミング等においては、

ドキュメント記載の動作範囲⊆実際の動作範囲

である事は絶対に必要だが、書いてない範囲は動いても動かなくても問題ないから。
(今回は、最後に書けば確実に動くので問題ない。
記載を変更したら何か変更があったかと勘ぐられ、余計におかしくなる)
だからphp側については今回は何もする必要がない。


> これは mbstring の作者さんが意図するところがはっきり分からないので悩みます
これはちと違ってて、仕様は実装に依存すべきではないし、してはいけない。
というか、仕様を変更するとこれまで動いてたコートが動かなくなる(=互換性が無くなる)可能性が出てくるので、
原則として、仕様は追加は出来るが削除は出来ない。
逆に実装は変わるものだし、(互換性を保たれている限り)変わってもいいものだ。
だから仕様が実装に依存した場合、初期実装は楽だが、わりと早々に破綻する。
よって、本来は、最初の最初に仕様を未来永劫変更せずに済むレベルまで練るべきだし、
多少実装が困難な仕様でも、それが良い仕様なら、頑張って実装するしかない。
(主従関係でいえば、仕様が主で実装が従)

984 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 10:05:40.31 ID:l7XbYqqi0.net]
ただ、

○ ドキュメントを読めば使える
◎ ドキュメントを読まなくても使える

なので、今回はグダグダ言わずにpcreと全て揃えるのが理想で、目指す所は
既存のコードを mb_* とするとマルチバイト対応になるだけで、全て動く、ではあるが、
現実的には無理だし、phpの場合は仕様自体がわりとグダグダなので、
多少でも綺麗にしていく為には新規部分は(従来の汚い仕様を無視して)綺麗に作るしかなく、
まあ許容範囲だと思うよ。

見た目、

A, 元々は記載通り「最後に書く必要があった」が、pcreと揃えるよう修正して「いつ書いても動く」ようになった
B. 元々何も記載無かったが、複数書いた場合等の動作が曖昧になるので、
 「確実に動く条件」を記載するように求められ、書いた

ように見える。
なお仕様を自由に決めて良いなら、
そもそも「モード」を「フラグ」に突っ込むべきなのか?という話で、
(php.netでは纏めて「オプション」「パターン修飾子」と呼称されてるので曖昧になってる)
例えばJSなら

String.replace(/regular expression/flags, replacement, mode); // modeでRubyやonigurumaモードを切り替える

で終わってた気がするし、
これなら「ひとつしか指定出来ません」「最後に指定しなければなりません」はそもそも必要なくなる。
しかし使いもしない引数を無駄に増やすのもよろしくないし、フラグに突っ込んでしまえ、の判断もありだろう。
(pcreもそうなってるし)

985 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 10:05:57.25 ID:l7XbYqqi0.net]
> しかし今は php で (*SKIP) を動かすことを目指しているのでその後にやりますね
それで正しい。義務感でやるものではないし、面倒なら放置でいい。
(というかこの位緩くないと続かない。だいたい昨今のSNS疲れとかは義務感から来てるものだし)

だからまあ、「この表は自分も今後とも使うので正確であって欲しい。
とりあえず自分用に更新版作ったから上げとく」位でいい。
そしてそれをpythonにやらせたのなら、それもついでに上げとく、程度で十分だ。

986 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 00:01:17.52 ID:R9Dn8Crp0.net]
堂島の龍・・・ って言ったんだ

987 名前:947 mailto:sage [2024/10/29(火) 11:56:37.23 ID:FIsrbLEd0.net]
> php側については今回は何もする必要がない
了解です、これは分かってましたので大丈夫です

> 原則として、仕様は追加は出来るが削除は出来ない
言われてみれば確かに.. 実装を仕様にしたせいで実際に破綻した経験もあったり(ぉぃ)

> pcreと全て揃えるのが理想
確かにそうですね

> A. B.
なるほど、"仕様が主" ということを考えると納得の推察です

> フラグに突っ込んでしまえ
それでオプションとモードが混ぜてあったんですねw

> 義務感でやるものではない
そうですね、でも SYNTAX.md の更新は私がやりたいと思ってるのでやると思います
ミスが出ないように少しづつ進めるつもりです、なので完成は来年になるかも知れません
ただ、私にはオプションの説明文は書けないのでソースのコメントをコピペするだけの
手抜きになると思います ( "説明文 == 仕様" なので )

PHP で (*SKIP) を使えるようにする件もあと少しでなんとかなりそうです
使えるように出来たら修正箇所を書きにまた来ます、ありがとうございました!

988 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 14:57:45.06 ID:HnPnA3Oe0.net]
すまんけど参考に問題と結論をまとめてほしい

989 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 20:54:54.00 ID:zqRlJI/00.net]
次スレ
【PHP】下らねぇ質問はここに書き込みやがれ 15
https://mevius.5ch.net/test/read.cgi/tech/1730202739/

990 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 22:11:10.45 ID:zqRlJI/00.net]
>>988
問題: PHPで (*SKIP) が使えない (>>943)
結論: 現在は使えないのが仕様

php8.3.12(最新安定版)ではphp_mbstringが対応していない
oniguruma6.6.9(最新リリースバージョン)にも入ってない(開発したばかりで未リリース状態)
なので通常は>>952,955で公式リリースを待つが、
パフォーマンスの問題、或いは(現在開発中のphpアプリの)リリース時には使えるようになっているという読み等で、
GitHub上のonigurumaソースを自前でコンパイルして接続して使うのは自由
この場合の詳細は247が成功した後に報告してくれるから待てばいい

現在の作戦(981)の内容は以下(マクロは大文字で表記)
onigurumaは設定を自由に変更出来る
いくつかあるプリセットの内、ONIGURUMAを指定すれば(*SKIP)が使えるが、RUBYを指定しても使えない
現在のphpではデフォでRUBY指定であり、ONIGURUMA指定は出来ない --- (α)
なので、oniguruma側のRUBY設定値をONIGURUMA設定値で上書きし、
php側でRUBY指定しててもONIGURUMA指定での機能が使えるようにする
これだとonigurumaの再コンパイルだけで済むはず(=php_mbstringは変更無く使える)

この場合の問題は、ruby指定とoniguruma指定で完全な互換性がなかった場合に、(なお実際どうなのかは知らん)
他ソフト(laravel)等と組み合せると一部誤動作する可能性が出てくる事だが、
この場合はRUBYではなくEMACS等、
どう考えても誰も使ってないであろうマクロを潰せばいいだけなので、大した問題ではない
(とはいえ商用用途ではこれも許されないだろうが)

991 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 22:42:58.65 ID:zqRlJI/00.net]
真面目に直すなら、αを修正してphp側からONIGURUMA指定出来るようにすればいい
これは970に書いたとおり、
php_mbregex.c:489:static size_t _php_mb_regex_get_option_string
php_mbregex.c:594:static bool _php_mb_regex_init_options
の2関数を修正すればよく、下側は979に書いたとおり以下3行追加、上側はその逆を追加するだけ(多分)

case 'o':
*syntax = ONIG_SYNTAX_ONIGURUMA
break;

この辺やる気有るのならCのソースは俺が書いてもいいが、報告その他は全部やってくれ
報告の仕方は https://www.php.net/get-involved の通り
ただしバグ修正ではなく仕様追加なので、メンテナの判断により(ソースコードが妥当でも)却下される可
能性はある(改行は規制回避)


>>990 すまぬ一部修正、規制に引っかかったついでに最後の段落書き足したら大文字にするのを忘れた
× ruby指定とoniguruma指定で
○ RUBY指定とONIGURUMA指定で

992 名前:947 mailto:sage [2024/11/02(土) 11:20:08.91 ID:grhM95Vo0.net]
どうやら正規表現の syntax を RUBY から ONIGURUMA に変えるだけではダメそうです
この変更で (?W) が使えるようになったので syntax の切り替えは出来ているのですが、
正規表現に (*FAIL) や (*SKIP) を使うとエラーになります

php_mbregex.c の 473行目のエラー処理が実行されます
github.com/php/php-src/blob/2b10cd1bebde7b9844ebb6e3e60127dfe7b195c5/ext/mbstring/php_mbregex.c#L473

これを解決するには php_mbregex.c と onigurumaライブラリ を深く理解する必要があり、
このスレのみなさんにとっても簡単な問題ではないと思います

そのため、ここは一度戦略的に撤退し、次の好機をうかがうことにしました
長々とお付き合い下さりありがとうございました!



993 名前:947 mailto:sage [2024/11/02(土) 12:21:06.68 ID:grhM95Vo0.net]
詳細は以下のスレに書いておきました
agree.5ch.net/test/read.cgi/mango/1715675838/323-325n

C言語をいじるならデバックの仕方を知らないと話にならないようなので
そういうことを覚えるのにかなりの時間がかかりそうです、なのでこの件は一旦保留にさせて下さい
( fprintf を仕込んで ./configure, make, make install ではラチがあかなくなったので)

994 名前:947 mailto:sage [2024/11/03(日) 21:59:48.17 ID:kb0e81X60.net]
補足: onig_init() は oniguruma の古いバージョンが使われたときに備えてのものでした
なので問題ありませんでした

現時点では正規表現に (*FAIL) や (*SKIP) を使うとエラーになる問題は
「PHPのインストール時に (*FAIL) が実装される前の oniguruma が入れられていて
それが使われているのではないか」という仮説を立てています

(*FAIL) が実装される前の oniguruma が使われていたなら「 "FAIL" なんて名前知らない!」と
言われてもおかしくないので..

995 名前:947 mailto:sage [2024/11/04(月) 01:55:48.60 ID:nQYymDx80.net]
↑の仮説は否定されました

oniguruma は最新Master branch版で間違いありませんでした 
oniguruma 6.9.9 で Fix されたバグが直っているのを確認しました

また、古いバージョンの oniguruma が入っていないことを確認しました 
libonig-dev なども含めて他の oniguruma は1つも入っていませんでした

996 名前:947 mailto:sage [2024/11/05(火) 00:51:48.35 ID:QtAnl6270.net]
oniguruma 付属のテストファイル /sample/callout.c では (*FAIL) や (*SKIP) が動くので、このテストファイルのコ-ドを php_mbregex.c に移植して動かしてみました (コンパイルエラーを回避するための最低限の変更のみしました) そしてPHPを動かしてみたところ、問題のエラーと同じエラーが出ました

oniguruma 側でのエラーコード: -229
github.com/kkos/oniguruma/blob/f6723fd940b993b39b1535f71c8695867a5e92d1/src/oniguruma.h#L640

これにより、問題の原因がPHP側にあることが確定しました
しかし php_mbregex.c を読んでもこの問題を起こしそうな箇所は見当たりません

原因はコ-ドではなくPHPの環境にあるのかも知れま1000

997 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 776日 8時間 5分 26秒






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<381KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef