如何在PHP中的类方法的私有函数中访问self ::

时间:2015-03-26 18:32:47

标签: php class scope

以下是给定类的静态方法:

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。

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)

一个函数总是有一个全局范围,无论它在哪里被声明,即使replaceCallbackmyClass中声明它的范围总是全局的(即它没有类范围,{{ 1}}引用不起作用)

所以你需要像在课堂外做的那样self::

“PHP中的所有函数和类都具有全局范围 - 即使它们是在内部定义的,也可以在函数外部调用它们,反之亦然。” doc