WordPress插件中PHP类内部调用成员函数报错的排查及正确调用方法咨询
你遇到的问题根本不是类内函数调用的语法错误,而是短代码回调的调用上下文不匹配导致的致命错误——PHP致命错误会直接让页面空白(如果服务器没开启前端错误显示的话),错误日志没记录大概率是服务器的错误日志配置没开或者路径不对。
错误根源
当你用add_shortcode("pd", array("pdCategories","ShortcodeParse_c"));注册短代码时,WordPress会以静态方法的形式调用ShortcodeParse_c。但静态方法里是没有$this的——$this只有在类的实例对象中才有意义,静态调用时没有实例,所以你写$this->ShowCategories_c()会触发「Using $this when not in object context」的致命错误,直接导致页面空白。
而你注释掉$this->...的代码能正常运行,是因为那时候静态调用ShortcodeParse_c时没有使用$this,不会触发错误。
两种解决方案
方案一:使用类实例注册短代码(推荐)
你已经实例化了$pd = new pdCategories();,只需要把短代码注册改成用这个实例绑定方法即可,这样WordPress会调用实例的方法,$this就会正确指向这个实例:
<?php class pdCategories { public function ShortcodeParse_c($atts) { $temp = ""; $temp.= "test<br>"; $temp.= $atts["category"]; $temp.= $this->ShowCategories_c($atts["category"]); // 现在能正常调用了 return $temp; } private function ShowCategories_c($kats) { $temp = "starting...<br>"; return $temp; } } // 先定义类,再实例化,最后用实例注册短代码(更规范) $pd = new pdCategories(); add_shortcode("pd", array($pd, "ShortcodeParse_c")); ?>
方案二:改用静态方法调用(适合无实例状态的场景)
如果你的类不需要维护实例状态(比如不需要使用类的成员变量),可以把两个方法都改成静态方法,调用时用self::代替$this->:
<?php class pdCategories { public static function ShortcodeParse_c($atts) { $temp = ""; $temp.= "test<br>"; $temp.= $atts["category"]; $temp.= self::ShowCategories_c($atts["category"]); // 静态方法用self::调用 return $temp; } private static function ShowCategories_c($kats) { $temp = "starting...<br>"; return $temp; } } // 静态方法注册短代码的方式不变 add_shortcode("pd", array("pdCategories","ShortcodeParse_c")); ?>
额外调试提示
如果想看到具体的错误信息,可以在WordPress的wp-config.php里开启调试模式:
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', true);
这样错误会直接显示在页面上,或者写入wp-content/debug.log文件,方便后续排查问题。
内容的提问来源于stack exchange,提问作者MH LI

