Как использовать константы внутри Amp\parallelMap в PHP?

Вопрос или проблема

Мне нужна помощь с использованием глобальных констант внутри amp\parallelMap. У меня есть файл инициализации, который я require_once в своем проекте, где я определяю глобальные константы, такие как MAX_DATA.

Вот упрощенная версия моего кода:

$pool = new DefaultPool(self::THREAD_COUNT);

$results = wait(parallelMap($data, function ($point) {
   return $this->reCalc($point); // трудоемкая задача
}, $pool));

Метод reCalc требует доступа к глобальной константе MAX_DATA, но я не могу получить к ней доступ внутри замыкания, переданного в parallelMap. Я получаю ошибку “Неопределенная константа MAX_DATA”.

Единственное решение, которое я нашел, это снова определить константу внутри замыкания или повторно включить файл инициализации:

$max = MAX_DATA;

$pool = new DefaultPool(self::THREAD_COUNT);

$results = wait(parallelMap($data, function ($point) use ($max) {
   if (!defined('MAX_DATA')) define('MAX_DATA', $max);
   
   return $this->reCalc($point); // трудоемкая задача
}, $pool));

Существует ли лучший способ получить доступ к глобальным константам внутри замыкания, переданного в parallelMap, без их повторного определения?

Ответ или решение

Чтобы использовать глобальные константы внутри функции parallelMap в PHP, вы можете воспользоваться конструкцией use, которая позволяет захватить необходимые переменные и константы в замыкание. В вашем случае, если константа MAX_DATA определена в файле загрузки, вам не нужно определять её снова в замыкании.

Вот как можно корректно модифицировать ваш код, чтобы избежать повторного определения константы:

// Предполагаем, что константы определены в вашем bootstrap файле
require_once 'path/to/bootstrap.php';

$pool = new DefaultPool(self::THREAD_COUNT);

$results = wait(parallelMap($data, function ($point) {
    return $this->reCalc($point); // времяемкая задача
}, $pool));

Вам нужно добавить use для доступа к константе MAX_DATA, не просто передавая её значение, но и проверяя, что она доступна внутри замыкания:

require_once 'path/to/bootstrap.php'; // Подключаем файл с определениями констант

$pool = new DefaultPool(self::THREAD_COUNT);

$results = wait(parallelMap($data, function ($point) {
    // Используем константу непосредственно
    return $this->reCalc($point); // времяемкая задача
}, $pool));

Если MAX_DATA определена в глобальной области и вам нужно обеспечить доступ, вы можете использовать глобальную область доступа внутри замыкания при помощи оператора global:

require_once 'path/to/bootstrap.php'; // Подключаем файл с определениями констант

$pool = new DefaultPool(self::THREAD_COUNT);

$results = wait(parallelMap($data, function ($point) {
    // Объявляем, что используем глобальную область
    global $MAX_DATA; 
    return $this->reCalc($point, $MAX_DATA); // передаем kонстанту в метод
}, $pool));

Но наличие глобальных переменных не рекомендуется — это может привести к трудностям с отладкой и снижению читаемости кода. Использование замыкания с use и передача необходимых значений предпочтительнее.

Кроме того, если у вас есть необходимость использовать константу только внутри метода reCalc, вы можете сделать это напрямую, без необходимости захвата в замыкание, так как константы имеют глобальную видимость:

require_once 'path/to/bootstrap.php';

$pool = new DefaultPool(self::THREAD_COUNT);

$results = wait(parallelMap($data, function ($point) {
    return $this->reCalc($point); // метод автоматически имеет доступ к MAX_DATA
}, $pool));

Таким образом, вам не нужно переопределять константы внутри замыкания или повторно подключать файлы. Вы просто используете константу как обычно. Надеюсь, это решит вашу проблему.

Оцените материал
Добавить комментарий

Капча загружается...