Я заметил, что не могу использовать объекты, созданные в дочернем потоке в родительском потоке.
Допустим, внутри синхронизированной функции в классе, который расширяет поток, я создаю объект, исвойство:
$this->hit = true;
$this->synchronized
(
function ()
{
$this->obj = new stdClass;
$this->obj->result = "you have a result in an object.";
$this->result = "you have a result in a property."
$this->wait();
$this->hit = false;
}
);
... и затем я пытаюсь получить его на другой стороне синхронизированной функции в родительском потоке:
if ($job->hit)
{
$job->synchronized
(
function ($job)
{
$job->notify();
echo $job->obj->result . "^^^Getting object created in child thread doesn't work for some reasons^^^.\n\n";
echo $job->result . ", and that's ok.\n";
},
$job
);
}
Следующее будет жаловаться:
Примечание PHP: Попытка получить свойство необъекта в /srv/cordmon/src/SleepThread.php в строке 71 ^^^ Получение объекта, созданного в дочернем потоке, не работает по некоторым причинам ^^^.
У вас есть результат в свойстве, и это нормально.
Я сделал несколько попыток, которые я не буду перечислять здесь для краткости,но я не могу вывести объект из дочерних потоков в родительский поток.Другие типы данных не представляют этой проблемы, и поэтому я представляю, что могу получить то, что мне нужно, от массивов в реальном мире.
Тем не менее, мне интересно, почему это так, и если есть правильный путьделать то, что я пытаюсь.Я знаю, что потоки не входят в основную область, и я знаю, что анонимные функции также имеют свою собственную область, но я предполагаю, что должен быть способ (кроме, например, использования json_encode / _decode или подобных обходных путей).
Заранее спасибо.