У меня возникла проблема с глобальной областью видимости в PHP, где моя статическая переменная ведет себя так, как будто она повторно инициализируется несколько раз - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть класс PHP со статической переменной, которая инициализируется в 0.

В моем файле index.php я использую Async в Spatie для вызова функций из других классов (несколько классов), которые увеличивают ранее упомянутую статическую переменную (я также пытался использовать одноэлементный шаблон и PHP-переменную $ GLOBALS) ). Когда это будет сделано, я вызываю функцию Spatie pool-> wait (), а затем печатаю / записываю статическую переменную. Это всегда дает мне 0. Если я записываю переменную сразу после ее увеличения, то это дает мне 1, как будто переменная инициализируется снова для каждого вызова функции.

Код слишком сложен, чтобы отображать его здесь, поэтому я надеюсь, что я объяснил это достаточно подробно.

Есть ли способ получить переменную с правильной глобальной областью действия?

РЕДАКТИРОВАТЬ: По запросу я добавляю некоторые фрагменты кода, но некоторые классы и переменные для простоты заменены на общие.

Это класс PHP, в котором инициализируется переменная, здесь нет ничего интересного, переменная здесь не используется:

class ClassOne
{

    static $var = 0;
    ...
}

Это класс, в котором вызываются функции, в index.php он, конечно, создается, и вызывается его функция 'func':

class ClassTwo
{
    protected $pool;

    public function __construct()
    {
        // The Pool object is from the PHP Spatie Async library. 
        $this->pool = Pool::create();
    }

    public function func (array $data) { 
        foreach ($data as $datum) {
            for($iteration = 0; $iteration < $datum['iterations']; $iteration++) {
                $this->pool->add(function () use ($datum) {
                    $instance = new ClassThree();
                    $instance->call($datum['data']);
                })->then(function ($output) {
                    ...
                })->catch(function (Exception $exception) {
                    ...
                });
            }
        }

        $this->pool->wait();

        print 'Variable: ' . ClassOne::$var;
    }
    ...
}

Наконец, это функции, в которых переменная увеличивается, переменная здесь не затрагивается:

class ClassThree 
{
    public function call($data) {
        try {
            ...
            ClassOne::$var++;
        } catch {
            ...
        }
    }
}

Как я упоминал ранее, если бы я поместил 'print' из ClassTwo сразу после увеличения ClassThree, я бы получил 1 несколько раз, но таким образом я получу 0.

...