PHPで時間旅行をする方法
                               塙 与志夫 (hnw)


              Symfony勉強会#6 2012/06/30 発表資料




12年6月30日土曜日
自己紹介
              • hnw
               • bugs.php.netでバグ報告18件




12年6月30日土曜日
自己紹介
              • hnw
               • bugs.php.netでバグ報告18件
               • 好きな物:バグ, カレー
               • 好きな境界値:2の53乗+1


12年6月30日土曜日
PHPで時間旅行…?
              • ついにPHPでネコ型ロボットが…




12年6月30日土曜日
PHPで時間旅行…?
              • ついにPHPでネコ型ロボットが…
               • 作れません




12年6月30日土曜日
問題意識
              • 時刻に関わるテストをどう実現する?
               • 例:年またぎテスト
              • dateなど標準関数を使われると痛い
               • 「時間旅行」がしたいなあ…


12年6月30日土曜日
それRubyならできるよ!

              • Rubygem Timecop
               • https://github.com/jtrupiano/timecop
              • Ruby組み込み実装をRubyで上書き!
               • Time, Date, DateTimeの3クラスを
                 自前実装でラップしている



12年6月30日土曜日
いわゆる動的言語の特徴

              • 組み込み関数やクラスも上書き可能
               • Ruby、Python、JavaScriptなど




12年6月30日土曜日
PHPだとできない…




12年6月30日土曜日
それPHP拡張でできるよ!

              • 拡張ならPHP関数を上書きできる
               • 関数テーブルを書き換える
               • 例: mbstringの関数オーバーロード
              • 組み込みクラスも書き換え可能


12年6月30日土曜日
作りました
              • php-timecop
               • https://github.com/hnw/php-timecop
              • Cで書かれたPHP拡張
              • 日付関数とDateTimeクラスを置き換え


12年6月30日土曜日
実装の詳細(1)
              • 時間を止めるPHP関数
               • 現在時刻が指定された時刻になる
              • 時間移動するPHP関数
               • 現在時刻が過去や未来になり、
                そこから時間が進みだす



12年6月30日土曜日
実装の詳細(2)
              • 自前実装で差し替え
               • time関数
              • 引数のデフォルト値を差し替え
               • date関数の第二引数など
               • DateTimeのコンストラクタ

12年6月30日土曜日
サンプルコード




12年6月30日土曜日
現状
              • アルファ版
              • CLI版でテストコードは動いてる
              • SAPI版は動くけど怪しい
              • コンパイルも1環境しか試してない
              →Pull Requestかレビュアー募集中

12年6月30日土曜日
利用シーン
              • 時刻に依存するような自動テスト
              • 時刻に依存するようなテンプレートの
               表示確認




12年6月30日土曜日
メリット
              • 既存コードや外部ライブラリなどに
               一律に適用できる

              • 機能が少ないのでrunkit拡張より
               安心感がある(ような気がする)




12年6月30日土曜日
まとめ

         • 他の言語がうらやましい
            • それPHP拡張でできるよ!
         • php-timecop作りました!
            • 安定したらテストで活躍するはず
            • 要望・アイデアなどお待ちしてます
12年6月30日土曜日
ご清聴
               ありがとう
              ございました

12年6月30日土曜日

PHPで時間旅行をする方法

  • 1.
    PHPで時間旅行をする方法 塙 与志夫 (hnw) Symfony勉強会#6 2012/06/30 発表資料 12年6月30日土曜日
  • 2.
    自己紹介 • hnw • bugs.php.netでバグ報告18件 12年6月30日土曜日
  • 3.
    自己紹介 • hnw • bugs.php.netでバグ報告18件 • 好きな物:バグ, カレー • 好きな境界値:2の53乗+1 12年6月30日土曜日
  • 4.
    PHPで時間旅行…? • ついにPHPでネコ型ロボットが… 12年6月30日土曜日
  • 5.
    PHPで時間旅行…? • ついにPHPでネコ型ロボットが… • 作れません 12年6月30日土曜日
  • 6.
    問題意識 • 時刻に関わるテストをどう実現する? • 例:年またぎテスト • dateなど標準関数を使われると痛い • 「時間旅行」がしたいなあ… 12年6月30日土曜日
  • 7.
    それRubyならできるよ! • Rubygem Timecop • https://github.com/jtrupiano/timecop • Ruby組み込み実装をRubyで上書き! • Time, Date, DateTimeの3クラスを 自前実装でラップしている 12年6月30日土曜日
  • 8.
    いわゆる動的言語の特徴 • 組み込み関数やクラスも上書き可能 • Ruby、Python、JavaScriptなど 12年6月30日土曜日
  • 9.
  • 10.
    それPHP拡張でできるよ! • 拡張ならPHP関数を上書きできる • 関数テーブルを書き換える • 例: mbstringの関数オーバーロード • 組み込みクラスも書き換え可能 12年6月30日土曜日
  • 11.
    作りました • php-timecop • https://github.com/hnw/php-timecop • Cで書かれたPHP拡張 • 日付関数とDateTimeクラスを置き換え 12年6月30日土曜日
  • 12.
    実装の詳細(1) • 時間を止めるPHP関数 • 現在時刻が指定された時刻になる • 時間移動するPHP関数 • 現在時刻が過去や未来になり、 そこから時間が進みだす 12年6月30日土曜日
  • 13.
    実装の詳細(2) • 自前実装で差し替え • time関数 • 引数のデフォルト値を差し替え • date関数の第二引数など • DateTimeのコンストラクタ 12年6月30日土曜日
  • 14.
  • 15.
    現状 • アルファ版 • CLI版でテストコードは動いてる • SAPI版は動くけど怪しい • コンパイルも1環境しか試してない →Pull Requestかレビュアー募集中 12年6月30日土曜日
  • 16.
    利用シーン • 時刻に依存するような自動テスト • 時刻に依存するようなテンプレートの 表示確認 12年6月30日土曜日
  • 17.
    メリット • 既存コードや外部ライブラリなどに 一律に適用できる • 機能が少ないのでrunkit拡張より 安心感がある(ような気がする) 12年6月30日土曜日
  • 18.
    まとめ • 他の言語がうらやましい • それPHP拡張でできるよ! • php-timecop作りました! • 安定したらテストで活躍するはず • 要望・アイデアなどお待ちしてます 12年6月30日土曜日
  • 19.
    ご清聴 ありがとう ございました 12年6月30日土曜日