Problem mit __get()

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit __get()

    Hi,

    Ich bin gerade dabei eine Config Klasse in PHP5 zu schreiben. Bis jetzt kann sie .ini oder .xml Files auslesen, welche als mehrdimensionales array gespeichert werden dieses Array möchte ich gerne mit der "magischen" __get() Funktion abfragen, was aber nicht so funktioniert wie ich möchte.

    PHP-Code:
    // _data beinhaltet das mehrdimensionale array
     
    public function __get($name)
        {
            
    $result null;
            if (isset(
    $this->_data[$name])) {
                
    $result $this->_data[$name];
            }
            return 
    $result;
        } 
    Die Abfrage sieht dann so aus:
    PHP-Code:
    $config = new Config(Config_Ini::load('config.ini')); //die config.ini wird als array in _data gespeichert.

    $config->test //das funktioniert noch, würde array("testwert" => "test") beinhalten

    $config->test->testwert //sollte eigentlich string "test" sein funktioniert aber nicht... 
    Die __get() funktion übergibt $name ja selbstständig, ich hab also überprüft wie $name aussieht wenn man den testwert aufrufen möchte. Aber anstatt "test->testwert" stand dort einfach nur "test" innen.

    Weiß jemand wie ich das Problem lösen kann?

  • #2
    Re: Problem mit __get()

    Original geschrieben von PHP-Checker
    Die __get() funktion übergibt $name ja selbstständig, ich hab also überprüft wie $name aussieht wenn man den testwert aufrufen möchte. Aber anstatt "test->testwert" stand dort einfach nur "test" innen.
    schalte mal error_reporting(E_ALL) ein, dann erhälst du:
    Notice: Trying to get property of non-object in ...

    was bei $config->test->testwert auch logisch ist:
    $config->test liefert dir einen string aus dem config-array zurück. dann folgt ein weiterer objektzugriff auf den string: $config->test->testwert und das liefert null.

    Weiß jemand wie ich das Problem lösen kann?
    du müsstest deine __get methode umschreiben, dass sie im falle eines unterarrays ein neues config-object zurückliefert (mit dem unterarray als konfiguration).

    Kommentar


    • #3
      hmm das hab ich mir auch schon gedacht... ok das wird jetzt bisschen kompliziert aber ich versuchs mal :-)

      Kommentar


      • #4
        Original geschrieben von PHP-Checker
        ... ok das wird jetzt bisschen kompliziert aber ich versuchs mal :-)
        aber wirklich nur ein bisschen - in etwa so:
        PHP-Code:
        public function __get($name)
         {
          if(!isset(
        $this->_data[$name]))
           return 
        null;

          if(!
        is_array($this->_data[$name]))
           return 
        $this->_data[$name];

          
        $class_name=get_class($this);
          
        $c=new $class_name();
          
        $c->loadConfigByArray($this->_data[$name]));
          return 
        $c;
         } 

        edit: loadConfigByArray() war nur eine fiktive methode, dein konstruktor erwartet ja schon ein array, also $c=new $class_name($this->_data[$name]);
        Zuletzt geändert von 3DMax; 25.11.2006, 20:42.

        Kommentar


        • #5
          Muss man zwar noch umschreiben aber ich probiers mal schnell aus...

          Ok funktioniert musste es noch abändern, da das Array im Konstruktur als Parameter erwartet wird:

          PHP-Code:
            public function __get($name)
           {
            if(!isset(
          $this->_data[$name]))
             return 
          null;

            if(!
          is_array($this->_data[$name]))
             return 
          $this->_data[$name];

            
          $class_name=get_class($this);
            
          $c=new $class_name($this->_data[$name]);
            return 
          $c;
           } 
          Danke :-)
          Zuletzt geändert von PHP-Checker; 25.11.2006, 20:52.

          Kommentar


          • #6
            So jetzt hab ich wieder ein Problem aber diesmal mit der __set($name, $value):

            PHP-Code:
            $config->database->dbname "test";

            // __set Methode
            public function __set($name$value)
            {
              
            print_r($name);
              echo 
            "<br>";
              
            print_r($value);

            bei dem Code lautet die Ausgabe für $name einfach nur "dbname", $value macht keine Probleme aber ich weiß nicht wo mein ->database hin ist?

            Weißt du wie ich das lösen kann?

            Kommentar

            Lädt...
            X