[OOP] Problem mit Overloading

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

  • [OOP] Problem mit Overloading

    Tag,

    habe eine kleine Template-Klasse, die via Overloading die Template-Variablen besetzt.
    Der relevante Code sieht so aus:

    PHP-Code:
    class tpl
    {

    public 
    $file;                            

    protected 
    $str;                            
    protected 
    $var = array();                

    .
    .
    .

    public function 
    __set($varname$varvalue)        
        {
        
        
    $this->var[$varname] = $varvalue;
        
        }
        
    public function 
    __get($requested)                
        {

        if(isset(
    $this->var[$requested]))
            {
            return 
    $this->var[$requested];
            }
        
        } 
    Eigentlich billig so weit.
    So wird mit der Klasse gearbeitet:

    PHP-Code:

    $tpl 
    = new tpl("file");

    $tpl->variable = array("test1""test2""test3");

    array_push($tpl->variable"test4"); 
    Der erste schreibende Aufruf nach der nicht vorhandenen Eigenschaft "variable" ist erfolgreich.
    Der zweite endet mit diesem Fehler:

    Fatal error: Cannot access undefined property for object with overloaded property access in /sonstewo on line xyz

    Meine Frage: hängt das mit folgenden, bereits bekannten Bug zusammen?

  • #2
    Für die, die es interessiert. Ich habe mal PHP 5.0.2 probiert und bekomme die selbe Fehlermeldung.
    Anscheinend kann man bis jetzt via Overloading nichts weiter mit solchen "virtuellen Eigenschaften" machen als sie aus dem Objekt-Kontext heraus direkt mit einem Zuweisungsoperator einen Wert zu geben. Als Argument für Funktionen taugen sie zumindest bei Array-Manipulation nichts.

    Schade...dabei machen diese im Grunde genommen und aufs Wesentliche reduziert nichts anderes als die überladenen Eigenschaften anhand eines Namens zu identifizieren und den Wert im Speicher, der dazugehört entsprechend zu bearbeiten.

    Kommentar


    • #3
      geh das ganze doch mal im kopf durch, dann solltest du merken wo das eigentlich problem an dem ganzen liegt ..

      PHP-Code:
      $tpl->foo 'xyz';

      // wird intern aufgerufen
      tpl::__set('foo''xyz');

      // dort passiert folgendes
      $this->var[$varname] = $varvalue;
      // effektiv also $this->var['foo'] = 'xyz'

      // was passiert ? richtig ..
      tpl::_set('var[\'foo\']''xyz');

      //du siehst, es kann gar nicht funktionieren 
      die lösung besteht darin deine variablen in ein array wie tpl::_var zu packen und in der __set funktion auf das erste zeichen reagieren .. wenn _ dann return false

      hoffe das war einigermaßen verständlich und nachvollziehbar
      mfg,
      [color=#0080c0]Coragon[/color]

      Kommentar


      • #4
        [QUOTE]Original geschrieben von Coragon Rivito

        die lösung besteht darin deine variablen in ein array wie tpl::_var zu packen und in der __set funktion auf das erste zeichen reagieren .. wenn _ dann return false
        ...
        hoffe das war einigermaßen verständlich und nachvollziehbar
        Ehrlich gesagt weniger. Was soll mir das bringen, als erstes Zeichen den Underliner abzufangen?
        Ein klassen-interner Variablen-Container in Form eines Arrays gibts bei mir.
        Er heißt nur tpl::var und ist zudem als protected deklariert, damit über Overloading gearbeitet wird. Es ist ein Array, das als Indizes die Namen der Pseudo-Variablen trägt und jeweils als Wert eben den zugewiesen Wert dieser Variablen.

        Was soll mit Variablen sein, die mit '_' anfangen? Und was bringt return false?
        Davon führt er die gewünschte Operation auch nicht aus.

        Der Bug, dessen URL ich im Eröffnungspost angegeben habe spiegelt im Grunde genommen genau das selbe Problem wieder. Hier versucht man es mit einer Eigenschaft einer Klasse, die ein Objekt einer anderen Klasse ist.
        Fakt schein eher eins: der Zugriff über Overloading funktioniert derzeit nur mit skalaren Datentypen...

        Irgendwie wäre es auch sinnlos, wenn array_push() im tatsächlichen Engine-Code von PHP nur den Interpreter nochmal für $array[] = $wert aufrufen würde.
        Man hätte die Funktion nicht geschaffen, wenn es nicht Situationen gäbe, in denen man mit dem Syntax der eckigen Klammern nicht arbeiten kann sondern einen Funktionsaufruf braucht. Daher müsste low-level-access gegeben sein.

        Kommentar


        • #5
          dann hab ich wohl was missverstanden oder so
          sorry
          mfg,
          [color=#0080c0]Coragon[/color]

          Kommentar


          • #6
            Hm...jetzt bleibt die Frage, ob das nun als Bug gesehen wird oder nicht.
            Ich hatte eigentlich gehofft, dass sich das Overloading mit mehr als nur den simplen Zuweisungen von Werten zu Objekteneigenschaften benutzen lässt.

            Das würde einige Tore öffnen....

            Kommentar

            Lädt...
            X