SlideShare una empresa de Scribd logo
1 de 28
@Hiraku
自己紹介
 @Hiraku(中野 拓)
 Webプログラマやってます
 PHP歴4年


 http://blog.tojiru.net/
 https://github.com/hirak
Wikipedia先生の解説

 アスペクト指向プログラミング
 Aspect Oriented Programming


   オブジェクト指向ではうまく分離できな
    い特徴(クラス間を横断 (cross-
    cutting) するような機能)を「アスペ
    クト」とみなし、アスペクト記述言語を
    もちいて分離して記述することでプログ
    ラムに柔軟性をもたせようとする試み。
具体例
 例外処理
 関数キャッシュ
 ロギング
 トランザクション
 実行時間の計測


   etc..
try {
  doSomething();
  //…

} catch (OutOfBoundsException $e) {
  recoverError($e);

} catch (RangeException $e) {
  recoverError($e);

}

    例外処理
class A {

                                      よくある光景
  function a() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
  function b() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
  function c() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
}
例外処理の問題
   いくらエラーの回復処理を関数化しても、
    try ~ catchブロック自体は何度も書く
    ことに

 DRY(Don't Repeat Yourself)じゃない
 「これ、さっきも書いたコードだな…」
   クラス分割や関数分割だけだとうまくモ
    ジュール化できないもの




     横断的関心事=Aspect
こういうパターンが多い
                  function a() {
                    try {
                      doSomething();
                      //…
                    } catch (RuntimeException $e) {
                      processError($e);
                    }
                  }

                                            こう分割できたらいいのに…


try {                                       function a() {
  //…                                         doSomething();
} catch (RuntimeException $e) {               //…
  processError($e);                         }
}
pecl-AOP
 AOPをextensionによって実装したもの
 http://pecl.php.net/package/AOP


 インストールさえできれば文法はわかり
  やすい
 runkitっぽい


# pecl install aop-beta
AOP用語(pecl-AOPの場合)
   Advice
     Aspectをモジュール化したもの。pecl-AOP
     ではコールバック関数で実装
   Joinpoint
     Adviceを織り込める場所。
   weave
     AdviceをJoinpointに差し込むこと。
例外処理をAdvice化
function processError(AopJoinpoint $joinpoint) {
  try {
    return $joinpoint->process();

    } catch (RuntimeException $e) {
      //エラー処理

    }
}
Weave(織り込む)
aop_add_around('A->*()', 'processError');

   AクラスのすべてのメソッドにprocessError()を織り込む、という指令
   これでAクラスのすべてのメソッドは、processError経由で呼ばれるよ
    うになる
class A {
  function a() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
  function b() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
  function c() {
    try {
      doSomething();
      //…
    } catch (RuntimeException $e) {
      processError($e);
    }
  }
}
class A {

                                         DRYになったね!
  function a() {
    doSomething();
    //…
  }
  function b() {
    doSomething();
    //…
  }
  function c() {
    doSomething();
    //…
  }
}

aop_add_around('A->*()', function (AopJoinpoint $joinpoint) {
  try {
    return $joinpoint->process();
  } catch (RuntimeException $e) {
    //エラー処理
  }
});
対応Joinpoint
 before any method / function call
 after any method / function call
 around any method / function call
 During the arousing of an exception
  of any method / function
 after any method / function call,
  should the method terminate
  normally or not (triggers an
  exception or not)
応用例はいっぱいありそう
 例外処理
 関数キャッシュ
 入出力のフィルタリング
 ロギング
 トランザクション
 実行時間の計測


   etc..
関数キャッシュ
   関数自体にキャッシュシステムを組み込む
add_aop_around('A->*()', function (AopJoinpoint $joinpoint) {
  $key = $joinpoint->getClassName() . '->' . $joinpoint->getMethodName();
  $cache = apc_fetch($key, $success);

 if ($success) {
   return $cache;
 }

 $result = $joinpoint->process();
 apc_store($key, $result);

  return $result;
});
pecl-AOPのヤバいところ
   既存の関数やメソッドなら何でも置き換
    え可能

   テストのモックとして強力
rand()の固定化
aop_add_around('rand()', function () {
  return 0;
});

var_dump(rand());
var_dump(rand());
var_dump(rand());




 rand()を同じ値しか返さない関数で置換
 何度実行しても0を返す
time()の固定化
aop_add_around('time()', function () {
  return 0;
});

var_dump(time());




   time()も初期値を自由に変更できる

   201X年を再現する、ということが可能
     timecopの方が特化してて便利だけど…
      それに近いことが可能
     https://github.com/hnw/php-timecop
何でも置き換え
 WebAPIにリクエストする部分を固定化
  とか
 DBに接続する部分を固定化とか


 要はクラスの継承と無関係な継承・上書
  きが可能
 自由すぎてわけわからん


   超強力 & 凶悪
pecl-AOP面白いよ
   超強力 & 凶悪

 テストのお供に
 書きにくいコードをすっきりDRYに


   PHPのゆるさが5割増しになるのが悩ま
    しい
注意点
 まだbeta扱いです。
 インストールもこけたりテストもこけた
  りする
 segmentation faultもよく起きる


   実戦投入はまだ危険

Más contenido relacionado

La actualidad más candente

ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
株式会社ランチェスター
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
Takinami Kei
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
Hisateru Tanaka
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
ftnk
 

La actualidad más candente (20)

PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
PHP language update 201211
PHP language update 201211PHP language update 201211
PHP language update 201211
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
言語処理系入門€6
言語処理系入門€6言語処理系入門€6
言語処理系入門€6
 
Javascript with Generative Art
Javascript with Generative ArtJavascript with Generative Art
Javascript with Generative Art
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 
Task
TaskTask
Task
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32
 
Mock and patch
Mock and patchMock and patch
Mock and patch
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4
 
ALPSチュートリアル(6) Matplotlib入門
ALPSチュートリアル(6) Matplotlib入門ALPSチュートリアル(6) Matplotlib入門
ALPSチュートリアル(6) Matplotlib入門
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
 
Okinawapm #1
Okinawapm #1Okinawapm #1
Okinawapm #1
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 

Destacado

『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
kenjis
 
Xml builderの紹介
Xml builderの紹介Xml builderの紹介
Xml builderの紹介
Hiraku Nakano
 

Destacado (17)

『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
『はじめてのフレームワークとしてのFuelPHP 改訂版(第2版)』のポイント
 
Xml builderの紹介
Xml builderの紹介Xml builderの紹介
Xml builderの紹介
 
PSR-3 Logger Interfaceの紹介
PSR-3 Logger Interfaceの紹介PSR-3 Logger Interfaceの紹介
PSR-3 Logger Interfaceの紹介
 
composer-scriptsについて
composer-scriptsについてcomposer-scriptsについて
composer-scriptsについて
 
JSON SchemaとPHP
JSON SchemaとPHPJSON SchemaとPHP
JSON SchemaとPHP
 
こわくない同時実行制御
こわくない同時実行制御こわくない同時実行制御
こわくない同時実行制御
 
Scrutinizer CIでPHPも静的解析 #phpstudy
Scrutinizer CIでPHPも静的解析 #phpstudyScrutinizer CIでPHPも静的解析 #phpstudy
Scrutinizer CIでPHPも静的解析 #phpstudy
 
最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm
 
composerの遅さをまじめに考える #phpstudy
composerの遅さをまじめに考える #phpstudycomposerの遅さをまじめに考える #phpstudy
composerの遅さをまじめに考える #phpstudy
 
Composer並列化プラグイン #phpblt
Composer並列化プラグイン #phpblt Composer並列化プラグイン #phpblt
Composer並列化プラグイン #phpblt
 
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-
開発者を支える生産性向上チームの取り組み -CI, Browser Test, Tools and Infrastructure-
 
URLで遊ぼう
URLで遊ぼうURLで遊ぼう
URLで遊ぼう
 
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成
CIサーバを制圧せよ! - プロジェクトメトリクスと自動化技術の活用よる混乱の収拾と「最強」の組織の育成
 
ポストJenkins時代のCI戦略
ポストJenkins時代のCI戦略ポストJenkins時代のCI戦略
ポストJenkins時代のCI戦略
 
WordCamp Kansai 2015 CI ハンズオン
WordCamp Kansai 2015 CI ハンズオンWordCamp Kansai 2015 CI ハンズオン
WordCamp Kansai 2015 CI ハンズオン
 
Jenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションJenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーション
 
はじめての CircleCI
はじめての CircleCIはじめての CircleCI
はじめての CircleCI
 

Similar a pecl-AOPの紹介

速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
 

Similar a pecl-AOPの紹介 (20)

速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
Flow.js
Flow.jsFlow.js
Flow.js
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部
 
Junit4
Junit4Junit4
Junit4
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 

Último

Último (12)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

pecl-AOPの紹介

  • 2. 自己紹介  @Hiraku(中野 拓)  Webプログラマやってます  PHP歴4年  http://blog.tojiru.net/  https://github.com/hirak
  • 3.
  • 4. Wikipedia先生の解説  アスペクト指向プログラミング  Aspect Oriented Programming  オブジェクト指向ではうまく分離できな い特徴(クラス間を横断 (cross- cutting) するような機能)を「アスペ クト」とみなし、アスペクト記述言語を もちいて分離して記述することでプログ ラムに柔軟性をもたせようとする試み。
  • 5. 具体例  例外処理  関数キャッシュ  ロギング  トランザクション  実行時間の計測  etc..
  • 6. try { doSomething(); //… } catch (OutOfBoundsException $e) { recoverError($e); } catch (RangeException $e) { recoverError($e); } 例外処理
  • 7. class A { よくある光景 function a() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } function b() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } function c() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } }
  • 8. 例外処理の問題  いくらエラーの回復処理を関数化しても、 try ~ catchブロック自体は何度も書く ことに  DRY(Don't Repeat Yourself)じゃない  「これ、さっきも書いたコードだな…」
  • 9. クラス分割や関数分割だけだとうまくモ ジュール化できないもの 横断的関心事=Aspect
  • 10. こういうパターンが多い function a() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } こう分割できたらいいのに… try { function a() { //… doSomething(); } catch (RuntimeException $e) { //… processError($e); } }
  • 11.
  • 12. pecl-AOP  AOPをextensionによって実装したもの  http://pecl.php.net/package/AOP  インストールさえできれば文法はわかり やすい  runkitっぽい # pecl install aop-beta
  • 13. AOP用語(pecl-AOPの場合)  Advice  Aspectをモジュール化したもの。pecl-AOP ではコールバック関数で実装  Joinpoint  Adviceを織り込める場所。  weave  AdviceをJoinpointに差し込むこと。
  • 14. 例外処理をAdvice化 function processError(AopJoinpoint $joinpoint) { try { return $joinpoint->process(); } catch (RuntimeException $e) { //エラー処理 } }
  • 15. Weave(織り込む) aop_add_around('A->*()', 'processError');  AクラスのすべてのメソッドにprocessError()を織り込む、という指令  これでAクラスのすべてのメソッドは、processError経由で呼ばれるよ うになる
  • 16. class A { function a() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } function b() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } function c() { try { doSomething(); //… } catch (RuntimeException $e) { processError($e); } } }
  • 17. class A { DRYになったね! function a() { doSomething(); //… } function b() { doSomething(); //… } function c() { doSomething(); //… } } aop_add_around('A->*()', function (AopJoinpoint $joinpoint) { try { return $joinpoint->process(); } catch (RuntimeException $e) { //エラー処理 } });
  • 18. 対応Joinpoint  before any method / function call  after any method / function call  around any method / function call  During the arousing of an exception of any method / function  after any method / function call, should the method terminate normally or not (triggers an exception or not)
  • 19. 応用例はいっぱいありそう  例外処理  関数キャッシュ  入出力のフィルタリング  ロギング  トランザクション  実行時間の計測  etc..
  • 20. 関数キャッシュ  関数自体にキャッシュシステムを組み込む add_aop_around('A->*()', function (AopJoinpoint $joinpoint) { $key = $joinpoint->getClassName() . '->' . $joinpoint->getMethodName(); $cache = apc_fetch($key, $success); if ($success) { return $cache; } $result = $joinpoint->process(); apc_store($key, $result); return $result; });
  • 21.
  • 22. pecl-AOPのヤバいところ  既存の関数やメソッドなら何でも置き換 え可能  テストのモックとして強力
  • 23. rand()の固定化 aop_add_around('rand()', function () { return 0; }); var_dump(rand()); var_dump(rand()); var_dump(rand());  rand()を同じ値しか返さない関数で置換  何度実行しても0を返す
  • 24. time()の固定化 aop_add_around('time()', function () { return 0; }); var_dump(time());  time()も初期値を自由に変更できる  201X年を再現する、ということが可能  timecopの方が特化してて便利だけど… それに近いことが可能  https://github.com/hnw/php-timecop
  • 25. 何でも置き換え  WebAPIにリクエストする部分を固定化 とか  DBに接続する部分を固定化とか  要はクラスの継承と無関係な継承・上書 きが可能  自由すぎてわけわからん  超強力 & 凶悪
  • 26.
  • 27. pecl-AOP面白いよ  超強力 & 凶悪  テストのお供に  書きにくいコードをすっきりDRYに  PHPのゆるさが5割増しになるのが悩ま しい
  • 28. 注意点  まだbeta扱いです。  インストールもこけたりテストもこけた りする  segmentation faultもよく起きる  実戦投入はまだ危険