ホームページ  >  記事  >  バックエンド開発  >  イベントメカニズムのPHP実装の分析例_PHPチュートリアル

イベントメカニズムのPHP実装の分析例_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:48:29778ブラウズ

PHP によるイベント メカニズムの実装例の分析

この記事の例では、PHP がイベント メカニズムを実装する方法について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです:

イベント機構を組み込んだ言語は少なく、PHPにはそのような機能はありません。簡単に言うと、イベントは実装が簡単な Observer パターンです。ただし、違いは、イベント リスナーは誰でも追加できますが、イベント リスナーを直接含むオブジェクトによってのみトリガーできることです。これは少し難しいです。 PHP には debug_backtrace 関数があり、現在の呼び出しスタックを取得できます。これにより、イベントをトリガーする関数を呼び出すオブジェクトにそのオブジェクトが直接含まれているかどうかを判断できます。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

/**

* イベント

*

* @著者 xiezhenye

*/

クラスイベント{

プライベート $callbacks = array();

プライベート$ホルダー;

関数 __construct() {

$bt = debug_backtrace();

if (count($bt)

$this->holder = null;

戻る;

}

$this->holder = &$bt[1]['オブジェクト'];

}

関数attach() {

$args = func_get_args();

switch (count($args)) {

ケース1:

if (is_callable($args[0])) {

$this->コールバック[]= $args[0];

戻る;

}

休憩;

ケース2:

if (is_object($args[0]) && is_string($args[1])) {

$this->callbacks[]= array(&$args[0], $args[1]);

}

戻る;

デフォルト:

戻る;

}

}

関数notify() {

$bt = debug_backtrace();

if ($this->ホルダー &&

((count($bt) >= 2 && $bt[count($bt) - 1]['object'] !== $this->holder)

|| (カウント($bt)

throw(new Exception('通知はホルダー内でのみ呼び出すことができます'));

}

foreach ($this->コールバックを $callback として) {

$args = func_get_args();

call_user_func_array($callback, $args);

}

}

}

この記事が皆様の PHP プログラミング設計に役立つことを願っています。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1022668.html技術記事イベントメカニズムのPHP実装の分析例 この記事では、イベントメカニズムのPHP実装方法について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです: 組み込みのイベント メカニズムを備えた言語は多くありません...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。