【问题标题】:access private static function from closure called in global function php 5.3.5从全局函数 php 5.3.5 中调用的闭包访问私有静态函数
【发布时间】:2014-05-05 23:15:41
【问题描述】:

我遇到了一个奇怪的问题。我正在开发一个应该适用于 PHP5.3 的程序。今天,安装了PHP5.3.5的服务器在运行我的程序时给了我以下错误:
Fatal error: Cannot access self:: when no class scope is active on line 19

我在任何其他具有更高 PHP 版本的服务器上都没有这个问题。但是我必须找到一个解决方案。
为了使问题易于理解,我制作了以下小脚本。基本上我调用一个带有闭包作为参数的全局函数,它调用一个私有静态函数。
我研究了这个问题,似乎Closure::bind 将是解决方案,但仅适用于 PHP5.4+。我需要 PHP5.3 的解决方案,但我走投无路了。

<?php

function doSth($c)
{
    $c();
}

class foo
{
    private static function bar()
    {
        echo 'OK';
    }

    public static function go()
    {
        doSth(function()
        {
            self::bar();
        });
    }
}

foo::go();

【问题讨论】:

  • 试试:doSth(function() using (self) { self::bar(); });
  • @Sammitch:你是说use吗?不幸的是,这似乎是不允许的。 (Parse error: syntax error, unexpected T_STRING, expecting '&amp;' or T_VARIABLE)

标签: php closures static-methods php-5.3 private-members


【解决方案1】:

不需要声明self...你需要这样调用函数:

$this->bar() 不是 self::bar();

【讨论】:

  • 由于这个函数是静态的,$this 甚至不会被初始化。
  • 啊....你会做 foo::bar()。另外,您确定要将该功能设为私有且不受保护吗?另一种选择是添加一个返回 self 的 init 函数。
  • 是的,我确定我希望它是私有的。我的课就是这样运作的。唔。我怀疑 getInstance() 函数会起作用,因为 PHP 认为它在类之外。但我会试一试 - 你永远不会知道。
  • 好吧。正如我所预料的那样。它不会那样工作:/ 在过去的几天里,我开始怀疑这是 PHP 5.3.5 中的一个错误,因为它在更高版本中工作。
猜你喜欢
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多