2016-12-12 3 views
2

Я написал код, и у него есть странное поведение. Он генерирует смертельные ошибки для всех частных и защищенных переменных, которые я объявил, даже если я использую их с $this перед ними. Похоже, что область действия переменной $this не распознается.

Я использую версию PHP версии 7.1.0 и версию apache версии 2.4.23 (и я установил mpm worker), Netbeans, Ubuntu 16.04. Я также использую pThreads (https://pecl.php.net/package/pthreads). Я искал в Интернете и не нашел ничего подобного этим проблемам.

Класс пула, из которого распространяется мой класс, является классом pThreads. , например.

class interfacePool extends Pool { 

public $data = array(); 
private $workerCount; 
private $timeoutStart; 
private $timeout = 50; 

public function process() { 

    $this->timeoutStart = microtime(true); 

    $this->workerCount = count($this->workers); 

    while ($this->workerCount > 0 && $this->timeoutStart + (float)$this->timeout > microtime(true)) { 

     $this->collect(function ($task) { 

      if ($task->isCompleted()) { 

       $this->data = array_merge($this->data, json_decode($task->data, true)); 
       $this->workerCount--; 

      } 
      return $task->isCompleted(); 

     }); 

    } 

    $this->shutdown(); 

    return $this->data; 

} 

} 

И ошибка я получаю следующее:

PHP Fatal error: Uncaught Error: Cannot access private property interfacePool::$timeoutStart in /usr//local/apache2/htdocs/01_Web/controllers/interface.controller.php:21

трассировки стека:

0 /usr/local/apache2/htdocs/01_Web/controllers/interface.controller.php(110): interfacePool->process() 

1 /usr/local/apache2/htdocs/01_Web/libs/core.class.php(221): interfaceCtrl->getTariffs() 

2 /usr/local/apache2/htdocs/01_Web/index.php(35): core->run() 

3 {main} 
    thrown in /usr/local/apache2/htdocs/01_Web/controllers/interface.controller.php on line 21 

Линия, на которой происходит ошибка является $this->timeoutStart = microtime(true).

Класс interfacePool находится в файле interface.controller.php (я не пытаюсь получить доступ к этим переменным из другого места). Эти ошибки происходят через весь проект; везде я защищал или закрывал переменные.

+0

Пожалуйста отправьте свой класс "Pool" тоже. Изменить: Nevermind, это от расширения pthreads. –

+0

Просьба предоставить код всех файлов из вашей трассы. Единственное, что я могу себе представить, это то, что у вас есть динамический вызов с вызываемым или другим. Поэтому вы находитесь вне сферы действия. –

+0

класс пула от pthreads, вы можете увидеть его здесь: https://github.com/krakjoe/pthreads/blob/master/classes/pool.h –

ответ

4

Это просто ошибка в pthreads.

https://github.com/krakjoe/pthreads/commit/c521adc7b645b9a60f8c3e9b6f1331c7dc6b428b использует EG(fake_scope) неправильно, в конечном итоге с NULL рамки для вызова конструктора вместо zend_get_executed_scope. (Эта линия fcc.calling_scope = scope; должна быть fcc.calling_scope = zend_get_executed_scope(); вместо.)

И NULL сфера является внутренне, что эквивалентно не быть в любом контексте класса (т.е. не частный, ни защищенный доступ), объясняя свое поведение здесь.

Update: Исправлено в https://github.com/krakjoe/pthreads/commit/ec1b2fdd6e562db7224662ed79125d8f6dde9f44

+1

Я пинговал сопровождающего pthreads об этом http://chat.stackoverflow.com/transcript/message/34653904#34653904 - надеюсь, что скоро он будет исправлен :-) – bwoebi

Смежные вопросы