У меня есть эта проблема, где мне интересно, если это ошибка PHP или намеренное поведение. Если я назначу в дочернем классе ресурс MySQL родительскому члену, то значение будет потеряно при работе в качестве потока.
Этот код не запускается — ресурс MySQL должен отображаться дважды:
<?php
class MyFileAbstract extends Threaded
{
protected static $m_Connection;
public static function init() {
static::openFile();
echo "<br>Member accessed from parent: ";
print_r(self::$m_Connection); # the resource is empty
}
}
class MyFile extends MyFileAbstract
{
public static function openFile() {
self::$m_Connection = fopen("/etc/php.ini", "r");
echo "<br>Member accessed from child: ";
print_r(self::$m_Connection)."<br>"; # the resource has value
}
}
class MyThread extends Thread
{
public function run() {
MyFile::init();
}
}
$myThread = new MyThread();
$myThread->start();
echo "<br>Correct output:";
MyFile::init();
?>
Это результат — ожидаемый результат для «Пользователь получил доступ от родителя:«должно быть что-то вроде»Код ресурса № 2«:
Member accessed from child: Resource id #2
Member accessed from parent:
Correct output:
Member accessed from child: Resource id #3
Member accessed from parent: Resource id #3
Я должен изменить это, а затем член $m_Connection
получает / сохраняет ресурс от fopen()
, Примечание: это работает в потоке!
<?php
class MyFileAbstract extends Threaded
{
protected static $m_Connection;
public static function openFile()
{
$sFileName = static::getFileName();
self::$m_Connection = fopen($sFileName, "r");
echo "Member accessed from parent: ";
print_r(self::$m_Connection); # the resource has value
}
}
class MyFile extends MyFileAbstract
{
public static function getFileName()
{
return "/etc/php.ini";
}
}
class MyThread extends Thread
{
public function run()
{
MyFile::openFile();
}
}
$myThread = new MyThread();
$myThread->start();
?>
Выход:
Member accessed from parent: Resource id #2
Требования для запуска примеров:
Я должен подключиться к MySql в теме по этой статье: http://php.net/manual/en/intro.pthreads.php
ОБНОВИТЬ:
Я изменил код: он открывается /etc/php.ini
вместо подключения к базе данных MySql. Тот же результат -> ресурс теряется при возврате из расширенного класса. Примеры теперь работают 1: 1 без изменения / адаптации чего-либо.
Я все еще думаю, что это ошибка. Теперь я нашел обходной путь, когда ресурс явно назначен члену класса в openFile()
функционировать как parent::
а не как self::
:
<?php
class MyFileAbstract extends Threaded
{
protected static $m_Connection;
public static function init() {
static::openFile();
echo "<br>Member accessed from parent: ";
print_r(self::$m_Connection); # the resource is empty
}
}
class MyFile extends MyFileAbstract
{
public static function openFile() {
# the resource keeps now the value when using parent:: instead of self::
parent::$m_Connection = fopen("/etc/php.ini", "r");
echo "<br>Member accessed from child: ";
print_r(parent::$m_Connection)."<br>";
}
}
class MyThread extends Thread
{
public function run() {
MyFile::init();
}
}
$myThread = new MyThread();
$myThread->start();
echo "<br>Correct output:";
MyFile::init();
?>
Результат теперь правильный:
Member accessed from child: Resource id #2
Member accessed from parent: Resource id #2
Correct output:
Member accessed from child: Resource id #3
Member accessed from parent: Resource id #3
Других решений пока нет …