Включить с помощью вспомогательного метода - глобальные переменные

Нет ничего плохого в вашем коде, я тестировал его локально с тем же кодом, только другой URL-адрес, и запрос POST отправляется правильно вместе с переданными параметрами:

Я рекомендую вам установить Telerik Fiddler 4 , чтобы увидеть сетевой трафик и подтвердить, что параметры действительно отправлены. Я использовал http://example.com как образец URL здесь. Я подозреваю, что проблема скорее на стороне сервера, чем на вашем приложении, или на то, что сервер ожидает разные параметры, чем то, что отправляется.

0
задан yivi 27 January 2019 в 10:37
поделиться

3 ответа

Я решил это с помощью списка аргументов переменной длины

public static function LoadWithParams($name, ...$args)
{
     foreach ($args as $n)
     {
         ${key($n)} = array_pop($n);
     }
     include Config::template_dir."/tpl.{$name}.php";
}

И вызов с

Templates::LoadWithParams("head", ["x" => $x]);
0
ответ дан Martin Perry 27 January 2019 в 10:37
поделиться

Когда вы вызываете include, включенный код наследует область, в которую он был включен. Поэтому, если вы хотите прочитать данные, созданные вне включаемого кода, данные должны находиться в локальной области, и вы можете перенести глобальные переменные в локальную область, используя ключевое слово global или ссылаясь на суперглобальный $ _GLOBAL. Однако это неправильный способ решения проблемы. Другое поведение при включении кода заключается в том, что код оценивается немедленно. Оставляя в стороне проблему загрязнения глобального пространства имен, это потенциально создает проблемы безопасности в вашем приложении - если включаемые файлы доступны напрямую по URL, кто-то может вызвать функциональность, обходя ограничения (такие как проверка аутентификации) в коде, который вызывает «включить», просто указав URL включаемого файла, например

HTTPS://example.com/include/user_admin.inc.php

Правильный способ решения проблемы - минимизировать встроенный код во включаемом файле, объявить желаемую функциональность в классах или функциях, явно вызывать эту функциональность в вызывающем коде после его включения. Обратите внимание, что вы можете вернуть значение из встроенного кода, выполняемого, когда оно включено, поэтому один из способов решения проблемы без необходимости реализовывать специфику каждого бита включенной функциональности заключается в следующем:

  $fn=include Config::template_dir."/tpl.{$name}.php";
  $fn($var);
0
ответ дан symcbean 27 January 2019 в 10:37
поделиться

Поскольку вы включаете файл в функцию, он не получает доступа к глобальным переменным. Вам нужна декларация global. tpl.menu.php должно быть:

<?php global $var; echo $var; ?>
0
ответ дан Barmar 27 January 2019 в 10:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: