У меня есть этот класс потоков, который использует PHP-расширение pthread
:
class Task extends Thread { protected $arr = array(); public function run() { $this->arr[] = 1; $this->arr[] = 2; $this->arr[] = 3; var_dump($this->arr); } } $thread = new Task(); $thread->start(); $thread->join();
Результат необъяснимо показывает пустой массив. Может кто-нибудь кратко объяснить, почему?
У меня есть решение, но не полное объяснение, поэтому больше ответов было бы очень желанным.
Вот мой ребенок с Threaded
(сокращенный ради краткости):
class ObjectConstructorThreaded extends Threaded { protected $worker; protected $className; protected $parameters; protected $objectKey; public function __construct($className, $parameters) { $this->className = $className; $this->parameters = $parameters; } public function setWorker(\Worker $worker) { $this->worker = $worker; } protected function getWorker() { return $this->worker; } public function run() { $reflection = new \ReflectionClass($this->className); $instance = $reflection->newInstanceArgs($this->parameters); $this->objectKey = $this->getWorker()->notifyObject($instance); } public function getObjectKey() { return $this->objectKey; } }
И Worker
(снова обрезанный):
class ObjectServer extends Worker { protected $count = 0; protected $objects = array(); public function notifyObject($object) { $key = $this->generateHandle(); /* // Weird, this does not add anything to the stack $this->objects[$key] = $object; // Try pushing - fail! $this->objects[] = $object; // This works fine? (but not very useful) $this->objects = array($key => $object); */ // Try adding - also fine! $this->objects = $this->objects + array($key => $object); return $key; } }
Наконец, чтобы запустить поток:
$thread = new ObjectServer(); $thread->start(); $threaded = new ObjectConstructorThreaded($className, $parameters); $threaded->setWorker($this->worker); $thread->stack($threaded);
Как вы можете видеть из чистых комментариев, которые я написал в то время, попытки вставить или нажать на массив не удались, но переписать его (установив его на фиксированное значение или слияние старого значения и новой записи), похоже, работает ,
Поэтому я отношусь к потоковому потоку как к нетривиальным типам (массивам и объектам) эффективно неизменяемым и что их можно только сбросить и не изменить. У меня тоже был опыт работы с сериализуемыми классами.
Что касается того, почему это так, или если есть лучший подход, я обновлю этот ответ, если узнаю!