PHP的 - 从一个匿名的回调访问外部类(php - Access outer class from

2019-10-22 11:04发布

我有这样的代码:

class Server {
  private $stopper;

  public function setStopper() { $this->stopper = TRUE; }

  public function startServer() {
    $consumer = new Consumer();
    $consumer->onConsume(function($data) {
      global $consumer;
      // some processing
      if( ?? ) { // how to access stopper here??
         $consumer->stop();
         // also how to access stopServer() here??
      }
    });
    $consumer->consume();
  }

  public function stopServer() { ... }

}

此代码是应该永远运行下去,除非文件setStopper()被调用。 到目前为止,我set_time_limit一段时间后停止代码。 但我需要实现setStopper的方式,所以我可以停止服务器时需要的,而不是“过了一会”。

我需要这个,因为,在onConsume连接到流API和运行匿名电话回来,每当新的数据是可用的,我不想杀死超时的PHP应用程序由于一些锁的问题。 我想平稳地停止服务器。

谁能告诉如何访问stopperstopServer回调里面? 我可以用下面的语法?

...(function($data) use ($this) {...

我还以为里面存储回调类值,但setStopper的动态调用和值可能不会更新!

有没有更好的方式来处理这种情况呢?

跟进: PHP -动态更新单例类的价值

Answer 1:

你可以创建一个封闭围绕$consumer对象以及词法对象$this (如果你使用PHP <5.4,则需要重命名$this对别的东西,因为你不能use($this) ):

 $self = $this;
 // You may not need to do this, I cannot remember off-hand whether 
 // closures have access to private variables or not
 $stopper = $this->stopper;
 $consumer->onConsume(function($data) use($consumer, $self, $stopper) {
  if( $stopper ) {
     $consumer->stop();
     $self->stopServer();
  }
});

参见实施例#3上的链接到手册页。

我还应该注意到这里的完整性,如果这是一个长期的过程,那么对象被引用里面的关闭将在函数退出后,周围挂起的时长。 例如:

function makeAdder($x) {
    return function($n) use($x) {
        return $x + $n;
    };
}

$adder = makeAdder(5);
echo $adder(2); // Output 7
echo $adder(5); // Output 10
echo $adder(4); // Output 9

这是一个封闭的一个典型的例子。 通常情况下,一旦makeAdder函数返回其内部变量$x就会掉出来的范围,并准备进行垃圾回收。 因为它不过是匿名函数的范围内的约束,它会流连无限期(直到脚本的终止) 引用包含范围内也被释放(即通过unset($adder) )。 这意味着,一旦你的函数被调用,额外引用$consumer$this$stopper会保留,直到类实例本身被破坏。

没有意识到这可能会导致一些严重的性能问题。



Answer 2:

这里同样的问题,我使用输出缓冲器从ob_start / ob_end_flush和一个功能我有应该是动态的,相关联的一个来ob_start解析器(然而参数I推入应在供以后用于解析使用$缓冲器的缓冲器使用的阵列将它们插入)时刻i有这些行的代码从一个阵列充满数据:

if(!empty($this->__b2))
        array_filter ($this->__b2,function($var)use(**&$buffer**){
                $buffer = preg_replace("/<\/body>/i", $var.'</body>', $buffer);
        });

我使用的是只有一个类单,我用“::”了很多。 你在我的情况array_filter怎么看坏了没有&$缓冲区



文章来源: php - Access outer class from an anonymous callback