Нет ничего плохого в вашем коде, я тестировал его локально с тем же кодом, только другой URL-адрес, и запрос POST отправляется правильно вместе с переданными параметрами:
Я рекомендую вам установить Telerik Fiddler 4 , чтобы увидеть сетевой трафик и подтвердить, что параметры действительно отправлены. Я использовал http://example.com
как образец URL здесь. Я подозреваю, что проблема скорее на стороне сервера, чем на вашем приложении, или на то, что сервер ожидает разные параметры, чем то, что отправляется.
Я решил это с помощью списка аргументов переменной длины
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]);
Когда вы вызываете include, включенный код наследует область, в которую он был включен. Поэтому, если вы хотите прочитать данные, созданные вне включаемого кода, данные должны находиться в локальной области, и вы можете перенести глобальные переменные в локальную область, используя ключевое слово global или ссылаясь на суперглобальный $ _GLOBAL. Однако это неправильный способ решения проблемы. Другое поведение при включении кода заключается в том, что код оценивается немедленно. Оставляя в стороне проблему загрязнения глобального пространства имен, это потенциально создает проблемы безопасности в вашем приложении - если включаемые файлы доступны напрямую по URL, кто-то может вызвать функциональность, обходя ограничения (такие как проверка аутентификации) в коде, который вызывает «включить», просто указав URL включаемого файла, например
HTTPS://example.com/include/user_admin.inc.php
Правильный способ решения проблемы - минимизировать встроенный код во включаемом файле, объявить желаемую функциональность в классах или функциях, явно вызывать эту функциональность в вызывающем коде после его включения. Обратите внимание, что вы можете вернуть значение из встроенного кода, выполняемого, когда оно включено, поэтому один из способов решения проблемы без необходимости реализовывать специфику каждого бита включенной функциональности заключается в следующем:
$fn=include Config::template_dir."/tpl.{$name}.php";
$fn($var);
Поскольку вы включаете файл в функцию, он не получает доступа к глобальным переменным. Вам нужна декларация global
. tpl.menu.php
должно быть:
<?php global $var; echo $var; ?>