2016-12-12 1 views
2

Ich schrieb einige Code und es hat ein seltsames Verhalten. Es löst fatale Fehler für alle privaten und geschützten Variablen, die ich deklariert habe, auch wenn ich sie mit $this davor verwenden. Es scheint, als ob der Umfang der $this Variable nicht erkannt wird.

Ich benutze PHP Version 7.1.0 und Apache Version 2.4.23 (und ich installierte die mpm Worker), Netbeans, Ubuntu 16.04. Ich benutze auch pThreads (https://pecl.php.net/package/pthreads). Ich habe im Internet gesucht und nichts Ähnliches gefunden.

Die Pool-Klasse, aus der meine Klasse besteht, ist eine Klasse von pThreads. z.B.

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; 

} 

} 

Und der Fehler ich bin immer ist die folgende:

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

Stapelüberwachung:

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 

Die Linie, auf der der Fehler der $this->timeoutStart = microtime(true) auftritt, ist.

Die Klasse interfacePool befindet sich in der Datei interface.controller.php (ich versuche nicht, von irgendwo anders auf diese Variablen zuzugreifen). Diese Fehler treten während des gesamten Projekts auf. überall habe ich geschützte oder private Variablen.

+0

Bitte posten Sie Ihre "Pool" -Klasse. Bearbeiten: Nevermind, es ist von Pthreads Erweiterung. –

+0

Bitte geben Sie den Code aller Dateien aus Ihrer Ablaufverfolgung an. Das einzige, was ich mir vorstellen kann, ist, dass Sie einen dynamischen Anruf mit einer aufrufbaren oder etwas anderem haben. Daher sind Sie außerhalb des Geltungsbereichs. –

+0

die Pool-Klasse ist von Pthreads, können Sie es hier sehen: https://github.com/krakjoe/pthreads/blob/master/classes/pool.h –

Antwort

4

Es ist einfach ein Fehler in Pthreads.

https://github.com/krakjoe/pthreads/commit/c521adc7b645b9a60f8c3e9b6f1331c7dc6b428b verwendet EG(fake_scope) falsch, mit einem NULL Spielraum für den Konstruktoraufruf statt zend_get_executed_scope enden. (Diese Linie fcc.calling_scope = scope; sollte fcc.calling_scope = zend_get_executed_scope(); stattdessen sein.)

Und ein NULL Umfang ist, intern, das entspricht in keinem Klassenkontext zu sein (das heißt kein privater noch geschützter Zugang) und erklärt, Ihr Verhalten hier.

aktualisieren: Auch Fest in https://github.com/krakjoe/pthreads/commit/ec1b2fdd6e562db7224662ed79125d8f6dde9f44

+1

Ich habe den Betreuer von Pthreads darüber gepingt http://chat.stackoverflow.com/transcript/message/34653904#34653904 - hoffe, es wird bald behoben werden :-) – bwoebi

Verwandte Themen