以下是给定类的静态方法:
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;
}
}
replaceCallback
内部return_setting
函数是同一类中的静态returnSetting
方法的全球化版本。代码有效,但感觉不对,我必须先全球化函数才能访问它,我觉得我应该能够做self::returnSetting()
.当我这样做时,我得到错误ofc。
致命错误:无法访问 self:: 当没有类范围处于活动状态时
做myClass::returnSetting
工作,但是在其中一个方法中通过类的名称引用该类有点尴尬。或者可以在replace_callback功能中做self::replaceCallback
?有没有首选的方法可以做到这一点?
PS:我需要将replaceCallback
函数作为字符串传递给preg_replace_callback
因为我需要支持 PHP 5.2。
我采用的解决方案(来自之前发布的答案,该答案已被其作者删除(如下:
我使replaceCallback
函数成为类的私有成员,以便我可以直接在其中执行self::returnSetting()
。为了兼容,我将replaceCallback
函数作为array('self','replaceCallback')
传递给preg_replace_callback
。
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;
}
}
无论
在哪里声明函数,它总是有一个全局作用域,即使replaceCallback
myClass
声明,它的作用域将始终是全局的(即它没有类作用域,self::
引用不起作用(
所以你需要像课外一样做myClass::functionName()
"PHP 中的所有函数和类都具有全局范围 - 它们可以在函数外部调用,即使它们是在函数内部定义的,反之亦然。.doc