问一下我遇到的这个奇怪的问题,我正在研究elastix的源代码,是一个软交换系统的web访问界面,
然后我想根据其操作数据库往回找,找到怎么从最初的用户操作(按下哪个按钮)。问题是,我找到了操作数据库的函数,并且只有这一个函数,没有别的函数执行这个DB操作了,
但是,没有任何一个PHP调用了这个函数。而这个函数的确是执行了(我注释掉它之后,从画面上点击提交,DB里没有插入数据)。这让我极其郁闷,
难道PHP里的类的函数,可以被其他非PHP的东西调用?
要不然它是怎么被调用的?
它只是一个普通的函数。贴出函数来:
class core_conf {    function core_devices_addsip($account) {
global $db;
global $currentFile; ...... $compiled = $db->prepare('INSERT INTO sip (id, keyword, data, flags) values (?,?,?,?)');
$result = $db->executeMultiple($compiled,$sipfields);
if(DB::IsError($result)) {
die_freepbx($result->getDebugInfo()."<br><br>".'error adding to SIP table');
}
    }
}我刚接触PHP,只是了解点儿皮毛,这问题完全把我搞蒙了。

解决方案 »

  1.   

    你是指 core_devices_addsip ???
    在项目的所有文件中搜索 core_devices_addsip 串你也可以在这个方法里写上
    print_r(debug_print_backtrace());
    运行一下就可以观察到都是谁在调用它
      

  2.   

    斑竹辛苦了,
    刚才一直在试验你告诉我的这个打印方法,
    很遗憾,我的页面毫无动静,加了这句和没加这句没啥区别。是不是和我的页面有关系?
    这个函数所在的文件名是:functions.inc.php
    里面只有一个类:class core_conf其实我的全部页面只有一个:index.php,
    随着点击上面的按钮,页面的一部分内容被重新加载,郁闷了。
      

  3.   

    或许是你找错了目标跟踪程序的运行要自底向上
    即从界面出发,一层层的剥离。为此你需要写一些简单的桩页面function f1() {
      f2();
    }
    function f2() {
      debug_print_backtrace();
    }
    f1();#0  f2() called at [D:\AMP\web\ide_tmp.php:4]
    #1  f1() called at [D:\AMP\web\ide_tmp.php:9]
      

  4.   

    斑竹多谢了,我找到在哪儿调用了,
    思路是按照你说的从页面到DB调用,
    先找到的页面代码里submit按钮,
    然后找到submit导致的提交操作调用的函数,
    然后在其中找到了调用函数:
    core_devices_add($deviceid,$tech,$devinfo_dial,$devicetype,$deviceuser,$description,$emergency_cid)
    这个函数里,是把字符串:“core_devices_add”和参数$tech拼起来,放到一个变量里,
    然后调用这个变量,其实也就是调用拼起来的函数名。
    而拼起来之后,其实就是我要找的函数:“core_devices_addsip”。就是在这里被调用的。原来,php的方法也是可以用变量来调用的。
    这就是为什么我一直没找到的原因。我一直误以为只要是调用方法,就必须调用方法的全名,
    没想到php可以用变量代表方法名,而变量又可以拼合而成,
    所以,搜索全名是搜不到的。多谢斑竹提供了思路。
    谢谢了!^_^