【问题标题】:How to access self:: in private function of class method in PHP?如何在 PHP 的类方法的私有函数中访问 self::?
【发布时间】:2015-03-26 18:32:46
【问题描述】:

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

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()。当我这样做时,我得到了 c 的错误。

致命错误:无法访问 self:: 当没有活动的类范围时

执行myClass::returnSetting 是可行的,但是在其中一个方法中通过其名称来引用该类有点尴尬。或者可以在 replace_callback 函数中执行self::replaceCallback 吗?有什么首选的方法吗?

PS:我需要将replaceCallback 函数作为字符串传递给preg_replace_callback,因为我需要支持PHP 5.2。

【问题讨论】:

  • 函数replaceCallback,即您在contentFilter 中定义的函数,无论如何都不是myClass 类的成员。无论如何,您不能使用self,因为该方法不是在类本身内部而是在其外部调用的。这就是为什么 self 不可访问,它将在 preg_replace 完成时通过 call_user_function 调用
  • 我知道,显然我还不够清楚。问题不是replaceCallback,问题是myClass::returnSetting应该在replaceCallback里面执行,怎么办?

标签: php class scope


【解决方案1】:

我采用的解决方案(源自之前发布的已被作者删除的答案)如下:

我将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;
  }
}

【讨论】:

    【解决方案2】:

    一个函数无论在哪里声明,总是有一个全局作用域,即使在myClass 中声明的replaceCallback 它的作用域总是全局的(即它没有类作用域,self:: 引用没有'不工作)

    所以你需要像在课堂外那样做myClass::functionName()

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

    【讨论】:

    • 好的,但是没有办法将父作用域“导入”到replaceCallback 中吗? global?将self 分配给变量?理想情况下,我会在replaceCallback 函数中执行self::functionName() inside,而不是将其称为myClass..
    • 您不能将self 保存在变量中。它只是当前类的一个捷径。即使你想这样做,你也需要 PHP5.4+ 和一个适当的类实例。 closure with $this support
    • @DarkBee在 javascript 中,可以简单地将父范围分配给一个变量,然后在无限嵌套的子函数中引用该变量。无论如何,谢谢
    猜你喜欢
    • 2019-10-15
    • 2015-10-12
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2017-09-08
    • 2023-03-04
    相关资源
    最近更新 更多