2012-11-22 7 views
5

Ich versuche, ein Rezept aus, wie String-Ressourcen in PHP zu speichern, aber ich kann nicht scheinen, um zu arbeiten. Ich bin ein wenig unsicher, wie die __get-Funktion in Bezug auf Arrays und Objekte funktioniert.__get Ressource in PHP „Kann nicht Objekt des Typs stdClass als Array verwenden“

Fehlermeldung: "Fatal error: Kann nicht Objekt des Typs stdClass als Array in /var/www/html/workspace/srclistv2/Resource.php auf Zeile 34"

Was mache ich falsch?

/** 
* Stores the res file-array to be used as a partt of the resource object. 
*/ 
class Resource 
{ 
    var $resource; 
    var $storage = array(); 

    public function __construct($resource) 
    { 
     $this->resource = $resource; 
     $this->load(); 
    } 

    private function load() 
    { 
     $location = $this->resource . '.php'; 

     if(file_exists($location)) 
     { 
      require_once $location; 
      if(isset($res)) 
      { 
       $this->storage = (object)$res; 
       unset($res); 
      } 
     } 
    } 

    public function __get($root) 
    { 
     return isset($this->storage[$root]) ? $this->storage[$root] : null; 
    } 
} 

Hier ist die Ressource-Datei QueryGenerator.res.php genannt:

$res = array(
    'query' => array(
     'print' => 'select * from source prints', 
     'web' => 'select * from source web', 
    ) 
); 

Und hier ist der Ort, ich versuche, es zu nennen:

$resource = new Resource("QueryGenerator.res"); 

    $query = $resource->query->print; 

Antwort

3

Es ist wahr, dass Sie definieren $storage als Array in der Klasse, aber dann assigne Sie es in load Methode Objekt ($this->storage = (object)$res;).

Felder der Klasse können mit folgenden Syntax aufgerufen werden: $object->fieldName. Also in Ihrem __get Methode sollten Sie tun:

public function __get($root) 
{ 
    if (is_array($this->storage)) //You re-assign $storage in a condition so it may be array. 
     return isset($this->storage[$root]) ? $this->storage[$root] : null; 
    else 
     return isset($this->storage->{$root}) ? $this->storage->{$root} : null; 
} 
+0

Ich denke, das funktioniert direkt $ this-> Lagerung -> $ root –

+0

@ElzoValugi Sicher, es tut. Ich benutze das, weil ich _think_ es für "Nicht-PHP" -Programmierer verständlicher ist. – Leri

+0

@PLB: Mit dieser Funktion wird NULL zurückgegeben (aus dem "else" -Teil der Prüfung). Immer noch mit "$ resource-> query-> print" als ob es sich um einen Skalar mit einer Zeichenkette handeln würde. –

Verwandte Themen