Почему моя переменная становится null, когда я вызываю функцию use?

Я решил применить подход, описанный в этой <a href="https://programbox.ru/2022/08/20/%D0%BA%D0%B0%D0%BA-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D1%83-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%BA/" rel="nofollow">статье</a>, которая упоминается в ответе 3. Вот как примерно выглядит мой код: 

<pre><code class="php">$randomNonce = bin2hex(openssl_random_pseudo_bytes(32));

return [
   ....
   'components' =&gt; [
      ...
      'on beforeRequest' =&gt; function () use ($randomNonce) {
            Yii::$app-&gt;params['defaultNonce'] = $randomNonce;
       },
      ....
  ]
]</code></pre>

Однако внутри функции переменная $randomNonce оказывается равной null. В то время как, если я использую следующий код:

<pre><code class="php">$randomNonce = bin2hex(openssl_random_pseudo_bytes(32));

        $callback = function () use ($randomNonce) {
            Yii::$app-&gt;params['defaultNonce'] = $randomNonce;
        };</code></pre>

всё работает корректно, и переменная не равна null. В чем может заключаться проблема?
  • 4 января 2025 г. 11:23
Ответы на вопрос 1
Проблема, с которой вы столкнулись, связана с областью видимости переменной `$randomNonce` и тем, как она используется в анонимной функции.

Когда вы объявляете переменную `$randomNonce` перед массивом конфигурации и затем используете `use ($randomNonce)` в функции обратного вызова, как в вашем первом примере, переменная `$randomNonce` должна ссылаться на ту же самую переменную, которая была объявлена ранее, и вы не должны получать `null`. Если вы всё равно получаете `null`, возможно, есть несколько причин:

1. **Переназначение переменной**. Убедитесь, что переменная `$randomNonce` не изменяется или не переназначается до того, как вызывается функция обратного вызова. Например, если у вас есть какой-то код между объявлением переменной и использованием функции, он может изменять ее значение.

2. **Ошибки в контексте**. Проверьте, не вызывается ли ваша функция обратного вызова в другом контексте, где переменная `$randomNonce` могла бы не храниться правильно.

3. **Ошибка в доступе к константе**. Если вы где-то в коде переопределяете значение `Yii::$app->params['defaultNonce']`, убедитесь, что это не происходит до вызова функции обратного вызова, что может вводить в заблуждение.

Пример вашего кода, который работает (второй случай), показывает, что анонимная функция правильно получает `$randomNonce` и сохраняет его состояние, так как вы сначала определяете функцию и затем вызываете её позже.

Таким образом, идея состоит в том, чтобы убедиться, что когда вы передаете `$randomNonce` с помощью `use`, он действительно имеет то значение, которое вы хотите, и что нет другого кода, который мог бы повлиять на его значение. 

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