我通过这种JavaScript方法将数组传递给PHP文件:
/**
* The PHP file which receives the data
*
* @type {string} The php filename
*/
const INSTALL_FILE = "install.php";
/**
* Passes roadTaxData to the php install file which could be get with the $_POST operator
*/
function passToPHP (paramName, data) {
var httpc = new XMLHttpRequest(); // simplified for clarity"
httpc.open("POST", INSTALL_FILE, true); // sending as POST
httpc.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
/*
Test purposes
*/
httpc.onreadystatechange = function () { //Call a function when the state changes.
if (httpc.readyState == 4 && httpc.status == 200) { // complete and no errors
console.log(httpc.responseText); // some processing here, or whatever you want to do with the response
}
};
httpc.send(paramName + "=" + data);
}
在我接收数据的PHP文件中(确实如此,我正在调用方法并实际测试它)我有这样的事情:
$road_tax_data = json_decode($_POST['road-tax_data'], true);
require "RoadTaxDataParser.php";
RoadTaxDataParser::set('test', $road_tax_data);
哪个参考此文件:
class RoadTaxDataParser
{
private static $data = [];
public static function set ($key, $value) {
self::$data[$key] = $value;
}
public static function get ($key) {
return self::$data[$key];
}
}
并且(希望)将数据存储在其中。
问题
当我尝试在我的get()
文件中的RoadTaxDataParser
中调用index.php
方法时,这样:
echo RoadTaxDataParser::get('test');
我收到错误说:
注意:未定义索引:test in 第13行的C:\ Users \ Bas \ Documents .... \ Cars \ RoadTaxDataParser.php
预期结果
我希望我可以通过HTTP请求在一个Registry类中存储数据,然后在需要时获取数据。
这样做的目的是我不想用JavaScript做任何计算或html部署,我想用PHP做这件事。
问题
如何从JavaScript HTTP请求中将数据存储在类中,然后使用index.php
文件将其调回?
我自己尝试
我尝试了Axel告诉我的会话。在我的install.php
文件中这样:
header('Content-Type: application/json');
$road_tax_data = json_decode($_POST['road-tax_data'], true);
$_SESSION['rtd'] = $road_tax_data;
然后通过我的index.php
:
var_dump($_SESSION['rtd']);
这给了我这个错误:
注意:未定义的变量:_SESSION in C:\用户\巴斯\文件... 。\ Cars \ index.php第26行NULL
答案 0 :(得分:2)
没有像PHP的即时应用服务器这样的东西。
每个脚本都需要一次又一次地将整个应用程序上下文加载到内存中。这是PHP的巨大劣势。
如果你有一个对象,存储上下文值,比如你的RoadTaxDataParser,你需要保存状态,并在下一个脚本中恢复它,执行脚本后sinc,清除内存和RoadTaxDataParser的实例离开了。
你可以这样做,使用单例设计模式(代码未测试):
class RoadTaxDataParser
{
public static $__instance = null;
private static $data = [];
public static function set ($key, $value) {
self::$data[$key] = $value;
$_SESSION['rtdp'] = self; // could be done better
}
public static function get ($key) {
return self::$data[$key];
}
public static function getInstance() {
if ( self::$__instance != null )
return self::$__instance;
self::$__instance = isset($_SESSION['rtdp']) ? $_SESSION['rtdp'] : new RoadTaxDataParser();
return self::$__instance;
}
然后
RoadTaxDataParser::getInstance()->set('test', $road_tax_data);
此外,您需要先在每个脚本中启动会话:
session_start();
请参阅php.net/manual/en/function.session-start.php - 作为第一个声明!
实际上,只有在脚本终止时才需要将对象同步到会话中,而不是每次分配值时都要同步。但这需要另一个处理程序,这会使结构复杂化。