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

PHP 来歴のトリヴィア

Avatar for gallu gallu
February 13, 2023

PHP 来歴のトリヴィア

Avatar for gallu

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を使ってた案件」や「特定の個人やコー

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