以下是给定类的静态方法:
class myClass {
public static function contentFilter($content) {
// ... irrelevant code
if (!function_exists('replaceCallback')) {
function replaceCallback($matches) {
// relevant line of code
$result = return_setting($params);
return $result;
};
}
$new_content = preg_replace_callback($regex, 'replaceCallback', $new_content);
return $new_content;
}
}
return_setting
内的函数replaceCallback
是来自同一类的静态returnSetting
方法的全球化版本。代码有效,但在我访问它之前我必须全局化该函数感觉不对,我觉得我应该能够self::returnSetting()
。当我这样做时,我得到了错误。
致命错误:当没有类范围处于活动状态时,无法访问self ::
使myClass::returnSetting
有效,但在其中一个方法中通过名称引用该类有点尴尬。或者可以在replace_callback函数中执行self::replaceCallback
?有没有首选的方法呢?
PS:我需要将replaceCallback
函数作为字符串传递给preg_replace_callback
,因为我需要支持PHP 5.2。
答案 0 :(得分:1)
我使用的解决方案(源于之前发布的答案,已被其作者删除)如下:
我将replaceCallback
函数作为该类的私有成员,以便我可以直接在其中执行self::returnSetting()
。为了兼容性,我将replaceCallback
函数作为preg_replace_callback
传递给array('self','replaceCallback')
。
class myClass {
private static function replaceCallback($match) {
$output = self::returnSetting('param');
// bunch of other stuff
return $output;
}
public static function contentFilter($content) {
// ... irrelevant code
$new_content = preg_replace_callback($regex, array('self','replaceCallback'), $new_content);
return $new_content;
}
}
答案 1 :(得分:0)
一个函数总是有一个全局范围,无论它在哪里被声明,即使replaceCallback
在myClass
中声明它的范围总是全局的(即它没有类范围,{{ 1}}引用不起作用)
所以你需要像在课堂外做的那样self::
“PHP中的所有函数和类都具有全局范围 - 即使它们是在内部定义的,也可以在函数外部调用它们,反之亦然。” doc