Così ad un certo punto, una chiamata AJAX invia una JSON, che trasformo in oggetti e conservare in sessione:classe PHP non sono definiti dopo deserialisation
if ($deps = json_decode($raw_json, true))
{
$pkgs = array();
foreach ($deps['vector'] as $key)
{
if (strcasecmp($key['package'], $key['component']) == 0)
{
$package = new Package();
$package->name = $key['package'];
$package->version = $key['version'];
$package->cxx_include = $key['cxx_inc'];
$package->cxx_link = $key['cxx_link'];
$pkgs[] = $package;
}
else
{
foreach($pkgs as $package)
{
if ($package->name == $key['package'])
{
$component = new Component();
$component->name = $key['component'];
$component->cxx_link = $key['cxx_link'];
$package->components[] = $component;
}
}
}
}
$_SESSION['pkgs'] = serialize($pkgs);
Le classi reali sono semplicemente:
class Component
{
public $name;
public $cxx_link;
}
class Package
{
public $name;
public $version;
public $cxx_inclue;
public $cxx_link;
public $components = array();
}
Quando ad un certo punto più tardi, ho deserialise e cerco di analizzare loro:
$pkgs = isset($_SESSION['pkgs']) ? unserialize($_SESSION['pkgs']) : array();
foreach ($pkgs as $package)
{
fwrite($cmake, "find_package(" . $package->name . " " . $package->version . " ");
if (count($package->components) > 0)
{
fwrite($cmake, "COMPONENTS ");
foreach ($package->components as $component)
fwrite($cmake, $component->name. " ");
fwrite($cmake, "REQUIRED)\r\n");
}
if (isset($package->cxx_include))
// ERROR here: undefined variable
fwrite($cmake, "include_directories(${".$package->cxx_include."})\r\n");
if (isset($package->cxx_link))
// ERROR here: undefined variable
fwrite($cmake, "target_link_libraries($rapp_name ${".$package->cxx_link."})\r\n");
foreach ($package->components as $component)
{
if (isset($component->cxx_link))
// ERROR here: undefined variable
fwrite($cmake, "target_link_libraries($rapp_name ${".$component->cxx_link."})\r\n");
}
}
Quello che mi lascia perplesso in realtà, i s NOT che la variabile indefinita è $ component-> cxx_link o $ package-> cxx_link, ma ciò che viene mostrato è il valore reale di JSON.
Ad esempio, se il JSON è:
{
"vector": [
{
"package": "Boost",
"version": "1.54",
"component": "Boost",
"cxx_inc": "Boost_INCLUDE_DIRS",
"cxx_link": "Boost_LIBRARIES"
},
{
"package": "Boost",
"version": "1.54",
"component": "date_time",
"cxx_inc": "",
"cxx_link": "Boost_DATE_TIME_LIBRARY"
},
{
"package": "Boost",
"version": "1.54",
"component": "filesystem",
"cxx_inc": "",
"cxx_link": "Boost_FILESYSTEM_LIBRARY"
},
{
"package": "Opencv",
"version": "3.0",
"component": "OpenCV",
"cxx_inc": "OpenCV_INCLUDE_DIRS",
"cxx_link": "OpenCV_LIBS"
},
{
"package": "Eigen3",
"version": "3.0",
"component": "Eigen3",
"cxx_inc": "EIGEN3_INCLUDE_DIR",
"cxx_link": ""
}
]
}
ricevo come errori:
PHP Notice: Undefined variable: .Boost_INCLUDE_DIRS.
PHP Notice: Undefined variable: .Boost_LIBRARIES.
PHP Notice: Undefined variable: .OpenCV_INCLUDE_DIRS.
Quali sono i valori a cui ho impostato i membri della classe. Se sto capendo correttamente, l'operazione di assegnazione durante l'iterazione JSON, fa qualche tipo di copia superficiale?
EDIT In base ai commenti di Barmar, ho rimosso serialize/unserialize e spostato la definizione di classe nella parte superiore di ciascun file che utilizza queste classi. Non ricevo più l'errore di caricamento automatico, ma ottengo ancora esattamente lo stesso errore variabile non definito.
Perché stai serializzando quando assegni la variabile di sessione? Non è necessario farlo, il meccanismo di sessione PHP lo fa internamente per te. – Barmar
Si sta assegnando a '$ _SESSION ['pkgs']', ma si sta unserializzando '$ _SESSION ['rapp_pkgs']'. – Barmar
@Barmar nah che è stato un refuso quando ho copiato il codice quassù, entrambi i rapp_pkgs ovunque, ma per individuare questo –