【问题标题】:PHP ob_start: callback a static method with $thisPHP ob_start:用 $this 回调一个静态方法
【发布时间】:2015-05-21 00:07:52
【问题描述】:

使用 PHP 的 ob_start($callback),您可以像这样将静态方法作为回调传递:

class TemplateRenderer {
  function myCallback($bufferContents) {
    return 'Foobar instead of the buffer';
  }
}

ob_start(array('TemplateRenderer', 'myCallback'));

或者你可以像这样引用一个对象:

$myTemplateRenderer = new TemplateRenderer();
ob_start(array($myTemplateRenderer, 'myCallback'));

这两种方法都可以,但我想知道是否可以从类方法中启动输出缓冲区,并使用 $this 引用回调

class TemplateRenderer {
  function myCallback($bufferContents) {
    return 'Foobar instead of the buffer';
  }

  function init() {
    // --- this doesn't work ----
    ob_start(array($this, 'myCallback'));
    // --- this doesn't work either ----
    ob_start(array('this', 'myCallback'));
  }
}

TemplateRenderer::init();

如果可能的话,从它自己的类中引用“可调用”的语法是什么?

【问题讨论】:

  • 使用TemplateRenderer::init()调用函数时,$this应该是什么? $this 仅在您使用 $object->method() 语法时设置。

标签: php output-buffering ob-start


【解决方案1】:

我会听从 Barmar 的建议,但如果您出于某种原因不想进行实例化,您可以尝试以下解决方案:

class TemplateRenderer {
  static function myCallback($bufferContents) {
    return 'Foobar instead of the buffer';
  }

  function init() {
    ob_start(array('self', 'myCallback'));
  }
}

TemplateRenderer::init();

【讨论】:

  • 谢谢,我想这就是我一直在寻找的答案:'self' 我尝试过 'this' 和 $this。实际上,我现在在尝试它的开发服务器上遇到错误:“无效的回调 self::myCallback,当没有类范围处于活动状态时无法访问 self::”,但我认为我在正确的轨道上。
【解决方案2】:

您需要使用对象调用init(),以便设置$this

$myTemplateRenderer = new TemplateRenderer();
$myTemplateRenderer->init();

【讨论】:

  • 抱歉,当我试图简化此线程的代码示例并提及两个用例(静态方法和对象方法)时,我认为我的问题在翻译中丢失了。不管怎样,我今天早上又试了一次,对象样式确实适用于 $this
猜你喜欢
  • 2012-04-26
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2016-06-26
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多