【问题】
在折腾
过程中,需要调试php代码,但是后来遇到错误:
[26-Oct-2012 07:08:45] PHP Fatal error: Call to undefined function translate_sanitize_file_name() in xxx\wp-includes\class-wp-xmlrpc-server.php on line 4562
相关的代码如下:function translate_sanitize_file_name($orig_file_name) {
$new_file_name = $orig_file_name;
...
return $new_file_name;
}
function mw_newMediaObject($args) {
...
$name = translate_sanitize_file_name( $data['name'] );
...
}
【解决过程】
1.参考:
确认了自己此处:
(1)已经声明(定义和实现)了该函数
(2)没有笔误,声明和调用的函数名都是translate_sanitize_file_name
(3)确定不是因为php版本不匹配导致的,因为此处是自定义的函数,所以根本不存在此问题
(4)不是跨文件调用
(5)更不存在跨文件调用且函数调用在定义之前的问题
所以,上述的问题,都不存在。
2.网上也看到一堆的解释,多数都是调用某个和系统有关的,比如sql数据库等,结果是由于没有载入相关的库文件而导致没有此函数供调用。
我这里,也不存在此问题。
3.后来还是通过自己的折腾,找到了原因。
原来是,此处完整的代码架构为:class wp_xmlrpc_server extends IXR_Server {
...
function translate_sanitize_file_name($orig_file_name) {
$new_file_name = $orig_file_name;
...
return $new_file_name;
}
function mw_newMediaObject($args) {
...
//$name = sanitize_file_name( $data['name'] );
$name = translate_sanitize_file_name( $data['name'] );
...
}
而人家原先的函数sanitize_file_name可以调用,而我此处自己写的函数translate_sanitize_file_name不能调用的原因是:
sanitize_file_name是wordpress系统函数,所以可以直接调用。
而我自己写的函数translate_sanitize_file_name,虽然函数都是正确的声明和实现。
但是由于此处是在class范围内,类定义的地方,所以需要调用自己的类内的函数,需要使用$this去引用。
参考别人代码,去改为:class wp_xmlrpc_server extends IXR_Server {
...
function translate_sanitize_file_name($orig_file_name) {
$new_file_name = $orig_file_name;
...
return $new_file_name;
}
function mw_newMediaObject($args) {
...
//$name = sanitize_file_name( $data['name'] );
$name = $this->translate_sanitize_file_name( $data['name'] );
...
}
就可以正常运行了。
【总结】
php中,如果是class定义内的函数互相调用,则记得不要漏了$this->,否则就会出现我这里的PHP Fatal error: Call to undefined的问题了。