Вопрос или проблема
Мне нужна помощь с использованием глобальных констант внутри 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));
Таким образом, вам не нужно переопределять константы внутри замыкания или повторно подключать файлы. Вы просто используете константу как обычно. Надеюсь, это решит вашу проблему.