0

由于 MVC 的原因,我希望能够触发一个函数来查找函数何时被调用,因为 Codeigniter 围绕其核心有函数,所以我想挂钩一个函数,例如setcookie并在它被调用时创建一个文件(从触发功能)例如:

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

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

4

2 回答 2

1

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

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

这个想法是,当您想要调试 if 条件评估此代码时,您将预定义的 pf 代码存储在常量中。

如果您正在生产中,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
于 2012-04-13T18:51:23.407 回答
1

您基本上需要看的是Observers

观察者模式(又名 Dependents,发布/订阅)是一种软件设计模式,其中称为主体的对象维护其依赖者列表(称为观察者),并自动通知它们任何状态更改,通常通过调用其中一个他们的方法。它主要用于实现分布式事件处理系统。观察者也是熟悉的 MVC 架构模式中的关键部分。事实上,观察者模式最初是在 Smalltalk 基于 MVC 的用户界面框架中实现的。1

你为什么不试试这里描述的:

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

于 2012-04-13T17:45:21.107 回答