2012-04-13 109 views
0

对于MVC的原因,我希望能够触发一个函数来查找函数何时被调用,因为Codeigniter在其核心有函数,我想钩一个函数如setcookie和创建例如当它被称为(从触发功能)的文件:Hook一个PHP函数调用时触发一个函数

function call_me() 
{ 
    $file = fopen('setcookie.txt', 'a+'); 
    fwrite($file, 'Called at ' . __CLASS__); 
    fclose(); 
} 

所以当setcookie被调用时,它应该触发call_me功能。有没有特定的功能或方法来做到这一点?我知道debug_backtrace,但那不是我想要的目的。

+0

http://php.net/manual/en/function.rename-function.php 重命名原始功能,别的东西,用这个名字创建你自己的函数,然后调用里面的原函数。缺点是你必须从PECL安装APD。 – strkol 2012-04-13 19:24:21

回答

1

你基本需要看的是Observers

观察者模式(亦称家属,发布/订阅)是一个 设计模式在其中一个对象,叫主题, 保持其家属的名单,被称为观察员,并通知 他们自动进行任何状态更改,通常通过调用其方法之一 。它主要用于实现分布式事件处理系统 。观察者也是熟悉的MVC 体系结构模式的关键部分。事实上,观察者模式是在Smalltalk的基于MVC的用户界面框架中实现的第一个 。 1

你为什么不尝试什么是说明如下:

http://devzone.zend.com/1384/observer-pattern-in-php/

1

我知道debug_backtrace,但是这不是我想要的目的。

我看到你坚持不使用回溯函数,但我仍然相信,当你想记录一个函数被调用时,回溯可以派上用场。

这个想法是,你有一个prefpf块代码存储在一个常量,每当你想调试条件评估这个代码。

如果您有任何疑问,if语句将阻止评估任何内容,以便您的代码的速度不受影响。如果它适合你,你可以修改它以满足你的需求,追踪更多的层次。

为了让我的观点成为一个完整的例子,如果我没有理解正确的,这不是你要找的,我的道歉!

要检查的例子,你有一个文件:test.php的

<?php 

define ('__SITE_PATH',realpath(dirname(__FILE__)).'/'); 
ini_set('log_errors', 1); 
ini_set('error_log', __SITE_PATH.'my_error_log.log'); 
include 'test1.php'; 
include 'test2.php'; 


define (__DEBUG_EVAL, ' 
    $dbt = debug_backtrace(); 
    error_log(
    "\n". 
    "Parent function file: "   . $dbt[1]["file"]  . "\n" . 
    "Parent function class: "  . $dbt[2]["class"]  . "\n" .   
    "Parent fiunction name: "  . $dbt[2]["function"] . "\n" .  
    "Par. fiunc. called from line: " . $dbt[2]["line"]  . "\n" . 

    "Child function file: "   . $dbt[0]["file"]  . "\n" . 
    "Child function class: "   . $dbt[1]["class"] . "\n" .   
    "Child fiunction name: "   . $dbt[1]["function"] . "\n" .  
    "Child fiunc. called from line: " . $dbt[1]["line"]  . "\n" . 
    "\n" 
    ); 
    '); 


test1::a(); 

    ?> 

这是test1.php

<?PHP 

class test1 
{ 
    public static function a() 
    { 
     test2::b(); 
    } 
} 

?> 

最后是TEST2。PHP

<?PHP 



class test2 
{ 
    public static function b() 
    { 
     if(defined('__DEBUG_EVAL')) eval(__DEBUG_EVAL); 
     echo 'Hello!'; 
    } 
} 

?> 

这是结果

[13-Apr-2012 14:37:18] 
Parent function file: C:\PHP-GTK\MyProjects\Electre\test1.php 
Parent function class: test1 
Parent fiunction name: a 
Par. fiunc. called from line: 29 
Child function file: C:\PHP-GTK\MyProjects\Electre\test2.php 
Child function class: test2 
Child fiunction name: b 
Child fiunc. called from line: 7