我正在尝试使用php_pthreads功能,并且我的某个库类遇到了一个奇怪的问题。
该类的父类有一个公共构造函数,它调用一个自己的受保护方法。我需要的类扩展了该受保护的方法,因此当调用构造函数时,它将调用该重新定义的方法。简化代码:
class FoobarParent {
public function __construct() {
$this->_init();
}
protected function _init() {
// do something
}
}
class Foobar extends FoobarParent {
protected function _init() {
// do something
}
}
现在,当我尝试在线程中使用该类的实例时,我得到Call to protected method Foobar::_init() from context 'FoobarParent'
:
class T extends Thread {
public function run() {
$foo = new Foobar();
}
}
请注意,该对象是在线程上下文中创建的,而不是从外部传递的 - 这是我检查的第一件事。
只有在线程run()
方法中调用代码时才会发生该错误。当不涉及pthreads
功能时(例如,在主上下文中创建对象),相同的代码可以正常工作。
我做错了什么?
答案 0 :(得分:0)
到目前为止,它似乎是php_pthreads中的一个问题,当在父上下文中已经定义了在线程上下文中实例化的类时,会发生这种问题。它发生在PHP 5.4和5.5版本以及相应的php_pthreads构建中。
以下是一个例子:
<强> FoobarParent.php 强>
class FoobarParent {
protected function _init() {
}
public function __construct() {
$this->_init();
}
}
<强> Foobar.php 强>
require_once('FoobarParent.php');
class Foobar extends FoobarParent {
protected function _init() {
print __METHOD__ . PHP_EOL;
}
}
<强> dummy.php 强>
// uncomment the line below to exhibit an error in the thread context
//require_once('Foobar.php');
class T extends Thread {
public function run() {
// if the class used in thread context is only defined there, everything
// is going to be fine
require_once('Foobar.php');
$foobar = new Foobar();
}
}
$t = new T();
$t->start();
$t->join();
print "Finished" . PHP_EOL;
因此,如果您仍想继续使用多线程,则需要密切关注自动加载器,以确保线程上下文首次加载所需的类。