PHPの「歴史的な理由」ってなんだ!?

自己紹介

所属

株式会社TechBowl

住んでるところ

東京

何やってる?

「TechTrain」というサービスで反復横跳びし続けている何でも屋さん(Laravel, Next.js, AWS, etc...)

趣味

  • お酒(よく溺れる)
  • サウナ
  • 読書
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

TechTrain


エンジニア教育+Directスカウトのサービス。
Coding Stoicをテーマに「うるせえコードかけ!」と言いがちなメンターが多めのエンジニアを育てるためのサービスです。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

なぜ発表しようと思ったのか?

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

PHPの言語自体にディープダイブしていきたい

歴史を遡っていけば、いいんじゃないか

言語の経緯を知った方がより良いコードが書けるのではないか

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

さて!

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

PHPの「歴史的な理由」ってなんだ!?

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

今回初めてCFPを出させてもらったわけですが、、、

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

過去の発表がすでにあった・・・

確認してから応募しろ・・・

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

ここで解説されているものは何か?

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

現在のphp.netにおける「歴史的な理由」の数は?

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

5つ!

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

過去の発表と被ってないものは実質1つだけ!?(ユーザー定義関数)

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

他にないのか・・・!?

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

GitHubで再度「英語で」検索をしてみました

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

ん?

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

日本語ドキュメントの検索では引っかからないやつ!

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

一安心ということで、次の2つを遡っていきます!

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

1. ユーザー定義関数

2. snmpwalkoid

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

どうやって歴史を追うのか?について

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

歴史を追うのに利用する情報源

  1. PHPのRFCの履歴(PHP5.3~有効)を読む
  2. php-srcのGitHubのソースコードのcommitを遡って見る(PHP4.0~有効)
  3. PHP Internals(PHP3.0~から有効)
  4. museum.php.netでphp-srcのソースコードをダウンロードして見る(PHP1~)
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

それでは早速追っていきましょう。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

1. 内部(ビルトイン)関数

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

Historically, the reason for this discrepancy is that internal functions have supported a concept of scalar types (bool, int, float, string) long before they were introduced for user-defined functions in PHP 7.0, and the existing implementation silently accepted null values. For the new scalar type declarations introduced in PHP 7.0 an explicit choice was made to not accept null values to non-nullable arguments, but changing the existing behavior of internal functions would have been too disruptive at the time.

PHP RFC: Deprecate passing null to non-nullable arguments of internal functions

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

歴史的に見ると、この不一致の原因は、内部関数が PHP 7.0 でユーザー定義関数に導入されるずっと前から スカラー型 (bool, int, float, string) の概念をサポートしており、 既存の実装では null 値を黙って受け取っていたからです。PHP 7.0 で導入された新しいスカラー型の宣言では、null 値を受け取らないようにすることが明示的に選択されましたが、 内部関数の既存の振る舞いを変更することは、その時点ではあまりに破壊的でした。この RFC では、PHP 8.1 で非推奨の警告を発生させ、内部関数の挙動を同期させることを提案しています。

PHP RFC: Deprecate passing null to non-nullable arguments of internal functions

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
種類 nullに対する対応
ユーザー定義関数 PHP7.0から導入され、nullを受け取る場合とそうではない場合が最初から区別されていた
内部関数 PHP7.0はるか以前からnullを黙って受け取っていた

知っての通り、PHP8.1からは、内部関数もstrictモードの際には、ユーザー定義関数と同じように明示されているnullableの引数以外は、nullを受け取ることができなくなっています。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

ちなみにscalarというワードがいつからあるのか?を遡ってみると

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

1998年!

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

これは確かに歴史的な理由ですね・・・。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

どのバージョンからなぜnullが暗黙的に受け取られていたのか?については、遡ってみたものの判明せず、迷宮入りでした・・・

力及ばずごめんなさい・・・

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

それでは2つ目。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

2. snmpwalkoid

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

そもそも見たことがない関数では・・・。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

見たことがある方いらっしゃいますかー!

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

具体的には、何で利用される標準関数なのか?

理解するために色々前提の理解が必要

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

SNMP

SNMP(Simple Network Management Protocol)は、UDP/IPベースのネットワーク監視、ネットワーク管理を行うためのプロトコルです。ルーター、スイッチなどのネットワーク機器、WindowsやUNIXサーバーなどの状態監視、リソース監視、パフォーマンス監視、トラフィック監視を行うために使用します。一般的に、サーバーに対しては、CPU使用率、メモリ使用率、ディスク使用率、プロセス監視、Windowsイベントログ監視、Syslog監視を行います。ネットワーク機器に対しては、各ポート上で送受信されたパケット数、エラーパケット数、ポートの状態(up/down)、およびCPU使用率、メモリ使用率などを監視します。ベンダによっては機器固有の管理項目を公開しているものがあり、きめ細かい監視が可能です。

https://blogs.manageengine.jp/itom_what_is_snmp/

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

SNMPについてのもう少し詳細の説明を入れる。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

OID(Object IDentifier)

各情報に対して割り当てられる一意な番号。各SNMPコマンドでの情報取得に必要なID

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

snmpwalk

そもそもsnmpwalkというコマンドが存在する。
指定したOID配下に含まれるすべてのOIDと、値を取得するコマンド。
snmpwalkoidはそのコマンドのOIDのみを取得できるようにしたコマンドと理解できる。つまりネットワーク監視のために利用されるため、Laravelとか一般的なフレームワークではそもそも利用すらされていない。

https://qiita.com/Mabuchin/items/d435c0afb4f0ca17ad25
https://www.secuavail.com/kb/log-technique/about-snmp/#:~:text=OID(Object IDentifier):各,割り当てられる一意な番号。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

使い方想定

テストから読み取るのが早そう

https://github.com/php/php-src/blob/b06fedb41d560f756dfb5d964b0d36a224e44dc7/ext/snmp/tests/snmprealwalk.phpt#L21

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

SNMPの標準関数群について

https://www.php.net/manual/ja/intro.snmp.php
↑こちらを読めば分かるとおり、ラッパーの関数群であることがわかる

SNMP 拡張モジュールは非常にシンプルで使い勝手の良いツール群です。 Simple Network Managment Protocol を使ってリモートデバイスを管理することができます。
これは Net-SNMP ライブラリのラッパーなので、 基本的な考え方はこのライブラリと同じです。また、Net-SNMP の設定ファイルや環境変数によって PHP の関数の挙動も変わります。
Net-SNMP についての詳細な情報は » http://www.net-snmp.org/ にあります。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

歴史的な経緯

ここからはいよいよ歴史的な経緯に入っていく

いつからある?

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

PHP4系からだと思うじゃないですか・・・。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

PHP3.0.8 ~

php.netのドキュメントにはPHP4からといったように見える書き方がなされているが、これはgitなどを使ったドキュメントとの連携の管理が4系からなされている影響であり、実際には3系から存在している。

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

該当の歴史的理由が現在の状態になったところを見てみる

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

[PHP-DEV] CVS update: php3/doc/functions

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

色々議論があるのですが、まとめると

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
  1. PHP3.0.8へ入れるため、snmprealwalkという関数が実装される(1999-04-03 2:19:43)
  2. PHP3.0.8リリース前にMike Jacksonさんからsnmprealwalkというのは、適切な名前ではない。snmpoidwalkかsnmpwalkoidかに変更してはどうかという提案。下位互換性のためにsnmpwalkoidとsnmprealwalkの動作は同じにするよ!snmpwalkなどについても考慮するよ!ポリシー的に適切かわからないけどね!(1999-05-21 13:42:07)
  3. Rasmus Lerdorfさんからいいね!その変更進めようぜ!PHP3.0.8に混ぜてリリースしちゃおう!という返信がある(1999-05-22 0:16:23)
  4. このあと実装が行われた(1999-05-22)
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

わずか1ヶ月半くらいが歴史的な理由・・・!w

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

まとめ

種類 歴史的な理由の内容
ユーザー定義関数 内部関数との動作の差分を入れるための対応が要因
snmpwalkoid 1ヶ月半くらいで提案をサクサク入れたことが発端だったようだ・・・w
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

ご静聴ありがとうございました!

今日は懇親会には1時間弱ほどの参加になるので、懇親会前でもいるうちに話しかけてくれると大喜びします!!!

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

おまけ

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
  1. PHP3.0.8はmuseum.php.netにzipファイルがない
  2. PHP1系はmuseum.php.netにzipファイルが1つしかない
  3. PHP Internalsのメーリングリストを遡るのは結構大変
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

こちらに調査時などの走り書きを入れています

2024-02-11 | PHPの「歴史的な理由」ってなんだ!?
2024-02-11 | PHPの「歴史的な理由」ってなんだ!?

https://qiita.com/takeshisakuma/items/5a61e6eac123d28602fb