Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP 来歴のトリヴィア

gallu
February 13, 2023

PHP 来歴のトリヴィア

gallu

February 13, 2023
Tweet

More Decks by gallu

Other Decks in Programming

Transcript

  1. わんくま同盟 横浜勉強会 #07 自己紹介 • 古庄(道明)と申します • Webでは「がる」というハンドルでふらついて おります •

    本職は技術者です。現役プログラマーです • あわせて設計とかインフラとか教育とか色々 やってます • おいちゃんです
  2. わんくま同盟 横浜勉強会 #07 Server Side Includes が あったげな • 今は昔。Server

    Side Includes(SSI)なる機能 ありけり • 「コマンドをHTMLに埋め込む」と「サーバ側で よしなに処理して」くれる、便利機能でした • 次のPageで、いくつか実例を出して、昔を懐 かしんでみましょう。
  3. わんくま同盟 横浜勉強会 #07 • ファイルの埋め込み – <!--#include file="header.html" --> •

    現在時刻の表示 – <!--#echo var="DATE_LOCAL"--> • コマンドの実行(カウンタとか) – <!--#exec cmd="hogehoge.sh"-->
  4. わんくま同盟 横浜勉強会 #07 余談 • つい先日。具体的には2015年8月前半にちょ ろっとお請けさせていただいた受託案件で 「SSIがありました」!!!! – ものとしては

    #include • 絶滅危惧種の可能性は否定しないのですが、 絶滅はしていないんだなぁ、という、ある種の 感動が胸を去来したものでございます。
  5. わんくま同盟 横浜勉強会 #07 PHP 爆誕までの軌跡 • Perlで書いた便利なCGIラッパー • 「重いからC言語で書き直そう!」 •

    Personal Home Page Tools 爆誕! – DBアクセスとかも実装! • 新しいツールFI(Forms Interpreter)を作成 – HTMLに埋め込める構文 – form変数の自動取得 • で、 Personal Home Page Construction Kit という名前で統合、再度PHPのお名前が浮上
  6. わんくま同盟 横浜勉強会 #07 • その後、PHP/FI という名前で公開 – 正式名称「Personal Home Page

    Construction Kit/Form Interpreter」(笑 – 一般的に、これが バージョン2.0 にあたる – ちなみにこの当時は「UNIX用」のみ。 • PHP/FIは、大変に「SSI」(笑) – 今っぽくも書けるのですがね – これからお見せするサンプルは「PHPマニュアル に書いてある」サンプルです(笑
  7. わんくま同盟 横浜勉強会 #07 <!--include /text/header.html--> <!--getenv HTTP_USER_AGENT--> <!--ifsubstr $exec_result Mozilla-->

    Hey, you are using Netscape!<p> <!--endif--> <!--sql database select * from table where user='$username'--> <!--ifless $numentries 1--> Sorry, that record does not exist<p> <!--endif exit--> Welcome <!--$user-->!<p> You have <!--$index:0--> credits left in your account.<p> <!--include /text/footer.html-->
  8. わんくま同盟 横浜勉強会 #07 • 構文としては… – 変数、(連想)配列 – 可変変数 –

    if等の制御構文一式 – ユーザ定義関数 – 「関数スコープ」の変数スコープ
  9. わんくま同盟 横浜勉強会 #07 ちと一言 • 大抵、どの言語でもCGIは書けます – bashは可能。無理なのはBrainfuckくらい? • ただ、大抵どの言語も「CGI用のライブラリなり

    クラスなり」をincludeしたりrequreしたりuseし たりimportしたり開発したり、が必要です。 • PHPは「言語仕様として、最低限の"情報の取 得"とかその辺が盛り込まれている」のが特徴 – ってのが、この辺の経緯で見て取れます
  10. わんくま同盟 横浜勉強会 #07 その後… • 現在の文法にかなり近づいたPHP3を開発 – うわっつらは「ある程度」似せる – 中のエンジンは「気合いで」書き換える

    • Zendエンジン、と呼称されて現在に至る • ちなみにPHP3の頃にOOP(いわゆるクラス) の構文が出来たようですが…記憶にありませ ん(笑 • 日本語使うのが「めちゃ」大変だった(笑 – 「国際化パッチ」とか「i18n」とかって単語が色々
  11. わんくま同盟 横浜勉強会 #07 • 「2004年7月13日にリリース」なんでかれこれ 10年ほどメジャーバージョン変わらず • 5.3で色々増えた – 名前空間、無名関数(クロージャ)、goto構文

    • 5.4で色々増えた – trait、配列の短縮構文、細かい文法色々 • func()[0]、(new hoge)->func() 構文など – ビルドインウェブサーバの追加 • 「php -S localhost:8000」でサーバが立ち上がる
  12. わんくま同盟 横浜勉強会 #07 • 5.5でも増えた – yield、finaly、password_hash() • 現在は5.6 –

    可変引数の書式追加、phpdbg、GMP演算の オーバーロード(桁あふれ防止) • まぁそもそも「5.3の次は6.0」だったはずなん ですけどねぇ…色々あって、その結果、色々 あったらしいです(苦笑
  13. わんくま同盟 横浜勉強会 #07 そして時代はPHP7!! • 2015年11月リリース予定!! – いやまぁ面白くなりそうなんですがね • 上っ面は必ずしも「そんなに巨大に違う」訳で

    はない…と、思う。多分。 – 「素直に」作ってれば、そんなに苦労しないと思う。 4から5への移行もそうだったし • 内部は結構「笑っちゃうほど」変わるぽいので、 期待してます • まぁこの辺は「他の言語」でも一緒ですな(笑
  14. わんくま同盟 横浜勉強会 #07 PHPの魔窟「配列」 • いわゆる「char s[]」の配列からlist、hashなど など。様々な配列があり、データの持ち方の 特性があり、使い分けが必要ですね •

    PHPでも「普通の(数値)配列」と「ハッシュ(連 想)配列」があります……………表向き。 • 内部的には、配列は「listかつmapな配列」1 種類のみ! – 「連想配列で順番」とかナニゴト!? – 最近は「連想配列で順番」、流行ぽいですが…
  15. わんくま同盟 横浜勉強会 #07 悪名高き その名は register_globals • 歴史経緯的に「Webアプリケーション(CGI)で 使う」前提なので、formの情報を「如何に取得 するか」ってのは、PHP的には重要なお題で

    ございます。 – 他言語のように「別にライブラリを取り込んで」とか 「自作して(…えぇCでやりました)」とかが不要なの は、確実にメリットなので。 • じゃぁどうやって情報を取得していたのか?
  16. わんくま同盟 横浜勉強会 #07 • こんなリクエストがあると… – test.php?a=abc&name=value • こんな変数に、こんな値が「自動的に」入りま した。

    – $a = 'abc'; – $name = 'value'; • まぁFlashなんかもこんな感じでしたね • 大変に便利な時代でした。
  17. わんくま同盟 横浜勉強会 #07 • あの1つだけで「十二分に」キモが冷えるので すが、まぁつまり「そんな感じ」でした。 • それでも一定量のPHPerは「register_globals 万歳!」って言ってたんですけどねぇ… •

    最終的に「PHP5.4で、目出度く廃止」となりま した。 – つまり、つい最近まで「廃止になってなかった」っ ていう事でもあるのですが…
  18. わんくま同盟 横浜勉強会 #07 • 「それでもなお」って人のために、「 PHP 5.4 以上でも register_globals を再現するライ

    ブラリ」を作った御仁がいらっしゃいます • ライブラリ名をみて、しみじみと、わびさびを感 じ取っていただければ、と思います • MercifulPolluter – Merciful:慈悲深い,情け深い. – Polluter:環境の汚染を引き起こす人または組織, 公害犯人,汚染者
  19. わんくま同盟 横浜勉強会 #07 もう一つの黒歴史 汝は magic_quote • 一言で片付けると「セキュリティ対策のために 生まれて、セキュリティ対策によって消された 機能」です。

    • もうちょっと丁寧に書くと「中途半端な対策でも ないよりマシだろう」で生まれて「中途半端過 ぎるから無いほうがマシだよねぇ」で消されま した。 • どっとはらい。
  20. わんくま同盟 横浜勉強会 #07 magic_quoteの中身 • 動きとしては「全ての' (シングルクオート), " (ダブルクオート), ¥

    (バックスラッシュ)および NULL 文字がバックスラッシュで自動的にエス ケープされます」 • これによって、SQL-Injectionが「だいたい」防 げるかなぁ、という感じになっています – 文字コードとの組み合わせで防御が突破できる等、 完全ではない辺りが(ある意味)ポイント
  21. わんくま同盟 横浜勉強会 #07 マニュアルから引用 • 以前は確かに存在し、 特に意識せずによりよい (安全 な) コードを書けるという意味で

    一部の初心者の助けと なっていました。 しかし、この挙動を前提としたコードを 見かけたときは マジッククオートをオンにするよりコード そのものを書き換えるほうがいいでしょう。 単純に、SQL インジェクション を防ぐためというだけの理 由です。 いまどきの開発者はセキュリティに対する意識 が向上しており、 マジッククオートなどという機能に頼る よりも データベース自体のエスケープ機能やプリペアド ステートメントを使った方がよいことに気づいています。
  22. わんくま同盟 横浜勉強会 #07 こーゆーのがあるから… • IPAの文章より(現在は消えてます) • より良いWebアプリケーション設計のヒント – (1)

    プログラミング言語の選択 • 例えば、PHPを避ける 短時日で素早くサイトを立ち上げることのみに着目する のであれば、PHPは悪い処理系ではない。しかし、こ れまで多くの脆弱性を生んできた経緯があり、改善が 進んでいるとはいえまだ十分堅固とは言えない。
  23. わんくま同盟 横浜勉強会 #07 PHP4でのくらすのようなもの:足りないもろもろ • private / protected のようなアクセス修飾子 •

    デストラクタ • abstract / virtual • クラスにヒモ付いた定数(オブジェクト定数) • interface • 以上が「ありません」 – 個人的には「全部public」と「virtualなし」が辛い…
  24. わんくま同盟 横浜勉強会 #07 割と有名(かもしれない)困ったコード $array = array(1,2,3); $ref = &$array[1];

    $copy = $array; $copy[0] = 'a'; $copy[1] = 'b'; $copy[2] = 'c'; var_dump($array); var_dump($copy); array(3) { [0]=> int(1) [1]=> &string(1) "b" [2]=> int(3) } array(3) { [0]=> string(1) "a" [1]=> &string(1) "b" [2]=> string(1) "c" }
  25. わんくま同盟 横浜勉強会 #07 • 以下の2つのコードは同じ意味のコードです <?php $i = 10; int

    main() { // XXX 本当は「zval構造体」 int *pi = malloc(sizeof(int)); *pi = 10; // こっちが「変数名」 int *i = pi; pi->refcount__gc ++; // return 0; }
  26. わんくま同盟 横浜勉強会 #07 zval構造体の形 struct _zval_struct { zvalue_value value; //

    実際の値 zend_uint refcount__gc; // 参照カウンタ zend_uchar type; // 変数の型 zend_uchar is_ref__gc; // 「参照」か否か };
  27. わんくま同盟 横浜勉強会 #07 おまけ。 zvalue_value構造体 typedef union _zvalue_value { long

    lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; zend_ast *ast; } zvalue_value;
  28. わんくま同盟 横浜勉強会 #07 もういっちょおまけ typedef unsigned int zend_object_handle; typedef struct

    _zend_object_handlers zend_object_handlers; typedef struct _zend_object_value { zend_object_handle handle; const zend_object_handlers *handlers; } zend_object_value;
  29. わんくま同盟 横浜勉強会 #07 • 実体は 作っていない <?php $i = 10;

    $j = $i; int main() { // XXX 本当は「zval構造体」 int *pi = malloc(sizeof(int)); *pi = 10; // こっちが「変数名」 int *i = pi; pi->refcount__gc ++; int *j = pi; pi->refcount__gc ++;
  30. わんくま同盟 横浜勉強会 #07 • この状態で、$iまたは$jのどちらかで「値が変 わったら」そのタイミングで、zval構造体の中 身をcopyして「別の値」にします • っていうのがPHPの基本的なメモリ戦略です。 •

    JavaScriptでも同じ持ち方をしているようです が、これやると「メモリを考えて無くても割と効 率の良いメモリの持ち方が出来る可能性が高 い」っていう、一定のメリットが以下略。
  31. わんくま同盟 横浜勉強会 #07 じゃぁ「参照」はなに? • 「参照」にすると、is_ref__gcが1になるので、 値を変更したときに「値が変わったらそのタイ ミングで、zval構造体の中身をcopyして別の 値にします」が動かなくなります。 •

    つまり「1度、変数を参照渡し」すると「その変 数に連なるあらゆる変数群がすべて is_ref=1 となるために、全部連動して参照状態になりま す」 • ぶっちゃけ「鬼門」です。
  32. わんくま同盟 横浜勉強会 #07 割と有名(かもしれない)困ったコード $array = array(1,2,3); $ref = &$array[1];

    $copy = $array; $copy[0] = 'a'; $copy[1] = 'b'; $copy[2] = 'c'; var_dump($array); var_dump($copy); array(3) { [0]=> int(1) [1]=> &string(1) "b" [2]=> int(3) } array(3) { [0]=> string(1) "a" [1]=> &string(1) "b" [2]=> string(1) "c" }
  33. わんくま同盟 横浜勉強会 #07 参照のまとめ • 「使うな」(笑 • ちなみに「ポインタ持ち回る」は、インスタンス やstringでは基本有効なのですが、intとかで は「極めてムダ」ですよね?

    • PHP7(2015/11 リリース予定)では、NULL、 boolean、int、doubleは「参照カウンタとかなく なってスカラ値をダイレクトcopy」にする予定 – チューニングの一環です。結構早くなるようです。
  34. わんくま同盟 横浜勉強会 #07 落ち着いてきた…ような気がするPHP5 • なんだかんだあちこちから構文をガメた イン スパイアしているので色々と構文も増えました – とはいえ、goto文は心の底から「いらない」

    • 勿論「不満」なんざ言ってたら切りが無いので すが、最低限困らない程度には書ける構文が そろってきたと思います – 次は「構文に振り回される」番なのですが… • 勿論「最新バージョン」前提です(笑 – 現在5.6。せめて5.5使いましょう。
  35. わんくま同盟 横浜勉強会 #07 追加実験 if ('2a' == 2) { //

    true if ("2a" == 2) { // true if ('a2' == 2) { // false if ('a2' == 0) { // true if ('22a' == 22) { // true if ('022a' == 22) { // true if ('-22a' == -22) { // true if (' 2a' == 2) { // 先頭に空白 true if (' 2a' == 2) { // 先頭にtab true if ('¥n2a' == 2) { // false if ("¥n2a" == 2) { // true if ("0x10" == 16) { // true if ("0x1a" == 26) { // true if ("0123" == 83) { // false if ("0123" == 123) { // true
  36. わんくま同盟 横浜勉強会 #07 • 何がおきてるのか? – 比較の左右辺で型が違う場合「型を自動でキャス トしてから」比較 – 数値vs文字の場合「文字を数値にキャストしてか

    ら」比較するというPHPの仕様 • え~~… • PHPは、素晴らしく「型の厳密な」言語でござ いますっていうか「型を厳密にプログラマが意 識しておかないといかん言語」でございます。
  37. わんくま同盟 横浜勉強会 #07 php.iniの恐怖 • 個人的に超絶気になるところですが • PHPには「php.ini」という設定ファイルがあっ て、その設定ファイルの設定によって「挙動が 変わる」というステキな状況があります(笑

    • 「エラー表示の状態」から「受け取った変数の 文字コード自動変換」や挙げ句には「関数 オーバロード:php.iniの設定によって関数の 挙動が変わる(call先が変わる)」まで • iniファイルには注意しましょう
  38. わんくま同盟 横浜勉強会 #07 「もだんPHP」ってなにさ? • よく界隈で聞く単語なのですが… • 「モダンPerl」「モダンC言語プログラミング」 「モダンC++」「モダンJava」「モダンPython」 「モダンJavaScript」まぁ色々あるようです

    • PHP界隈だと何となく「5.4以前の古い文法を 捨て去ろう」とか「新しい道具を積極的に取り 入れていこう」とかなんとか以下略 • まぁこういう動きが出てくるのは、賑わいがで て良いことだなぁ、と思います(他人事)
  39. わんくま同盟 横浜勉強会 #07 フレームワーク移り変わり • いや実際、他言語でもそんなに「落ち着いて 固定の1つ2つ」ってあるんですかね? – Rubyは、Railsが物凄く強いですが •

    PHP界隈では、古いのから新しいのまで、乱 立したまま今でも新規介入があって、大変に 賑やかなままです(笑 – ドポピュラーなところで「cakePHP」「symfony」あ たりですかねぇ…他にも山盛りでありますが
  40. わんくま同盟 横浜勉強会 #07 実際の現場のレベル感 • 大変にバラエティに富んでおります(笑 • 「懐かしい」ところだと… – 「関数」はよく分からないから使わない

    • クラスにおいては何をか言わんや – ソースコードは「ググってコピペするもの」であって、 自分で書くものではない • もちろん「バリバリにOOPで書いている」現場 も多々あります
  41. わんくま同盟 横浜勉強会 #07 現実として… • 「初心者に敷居が低い」ってのはある – なので、導入言語としては使いやすい – けど「意識しないと」低いまんま…

    • セキュリティについて – 現在は「意識しているところ」は非常にがっつり • 「徳丸本」の存在はでかいと思われます • 案件量は多い – 小さいのから大きいのまで、幅広く – 単価も、最近わりと落ち着いてきました…多分
  42. わんくま同盟 横浜勉強会 #07 • 将来は? – いやまぁ「すぐ消える」とか言われますが – それについては、COBOLの状況をご覧頂けると きっと以下略(笑

    – 現実問題として「現在の財産(遺産)」を考えると、 しばらくは案件量も豊富なまんまなんじゃないか なぁ、と。
  43. わんくま同盟 横浜勉強会 #07 純個人的雑感 • ツッコミ所の多い言語ではあるのですが – とはいえじゃぁ「ツッコミ所のない言語」があるの か? というと以下略

    • なんだかんだ「落とし穴回避術」をちゃんと身 に付けると、それなりに書けます(笑 • 些か「リッチなメモリ食い」とか気になりますが、 現在のハードウェアの進歩&PHP側の開発 状況を見ていると、目くじらを立てるほどでも。
  44. わんくま同盟 横浜勉強会 #07 • 実績としては、個人的にも社会的にも「沢山」 あるので、ハードなところでも十分に仕様に耐 える事は可能だったりします • ヘイト溜めている人は「PHP」というよりも 「PHPを使ってた案件」や「特定の個人やコー

    ド」にヘイトを溜めているケースが多いのでは ないかなぁ、と(苦笑 – とはいえ「初心者に向いてる」が、(一定以降の)学 習や成長にとって鬼門なのは割と事実…