2015-05-19 16 views
6

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.

+2

Perché stai serializzando quando assegni la variabile di sessione? Non è necessario farlo, il meccanismo di sessione PHP lo fa internamente per te. – Barmar

+0

Si sta assegnando a '$ _SESSION ['pkgs']', ma si sta unserializzando '$ _SESSION ['rapp_pkgs']'. – Barmar

+0

@Barmar nah che è stato un refuso quando ho copiato il codice quassù, entrambi i rapp_pkgs ovunque, ma per individuare questo –

risposta

4

corresse:

Quindi il problema è che si sta utilizzando le virgolette doppie e non virgolette singole come stringhe. PHP ha una cosa chiamata variabili variabili e tu usi quella non voluta (vedi http://php.net/manual/en/language.variables.variable.php).

interruttore ogni stringa che contiene qualcosa come "${something}" di virgolette singole (o sfuggire il simbolo del dollaro come detto Alex) e si andrà tutto bene, vale a dire:

fwrite($cmake, "include_directories(${".$package->cxx_include."})\r\n");

sarebbe

fwrite($cmake, 'include_directories(${'.$package->cxx_include.'})'."\r\n");

(Si noti che non è possibile utilizzare \r o \n in stringhe di offerta singola.)

Vecchia risposta:

Hai un errore di battitura nella tua classe Package.

Assegnarlo a $package->cxx_include ma il nome effettivo manca una "d".

class Package 
{ 
    public $name; 
    public $version; 
    public $cxx_inclue; // typo 
    public $cxx_link; 
    public $components = array(); 
} 
+0

Questo non dovrebbe causare questo problema, perché PHP ti consente di creare proprietà aggiuntive semplicemente assegnandole. – Barmar

+0

Scommetto anche che si tratta di un altro errore di copia. – Barmar

+0

Sì, grazie per averlo notato, ma questa non è la fonte del problema –

Problemi correlati