调用在php_pthread线程上下文中创建的对象的受保护方法

时间:2014-02-24 16:19:59

标签: php multithreading scope pthreads

我正在尝试使用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功能时(例如,在主上下文中创建对象),相同的代码可以正常工作。

我做错了什么?

1 个答案:

答案 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;

因此,如果您仍想继续使用多线程,则需要密切关注自动加载器,以确保线程上下文首次加载所需的类。