Klassenkommunikation Troubles

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von dbr, 12.09.2005.

  1. dbr

    dbr Thread Starter MacUser Mitglied

    Beiträge:
    45
    Zustimmungen:
    0
    MacUser seit:
    28.05.2005
    Habe auf meinem Webhost ein spezielles Problem mit der Verwendung von PHP Klassen die untereinander kommunizieren. Auf meiner lokalen PHP-Installation funktioniert es jedoch reibungslos.

    Konkret geht es darum, dass beispielsweise eine Variable einer Mutterklasse nicht von einer Zugriffsklasse verändert werden kann. Siehe untenstehendes Beispiel.

    Wie ist dieses Verhalten zu erklären? Und wie kann ich das Problem lösen? Hab einfach keine Idee mehr wie ich da rangehn könnte.


    Thx a lot

    Grts, Michael


    <?

    class mutterklasse {

    var $publicvar = "";

    function mutterklasse() {
    }

    }

    class zugriff {
    function zugriff($mutterklasse) {
    $mutterklasse->publicvar = "Testvalue";
    }
    }

    $mutterklasse = new mutterklasse();

    $zugriff = new zugriff($mutterklasse);

    echo "Ausgabe: ".$mutterklasse->publicvar;
    // bleibt bei der PHP-Installation des Webhosts leer
    ?>
     
  2. dms

    dms Gast

    Meinem Verständniss nach macht es der Online-Rechner hier ganz richtig. $mutterklasse ist nur eine Variable, die hier innerhalb der Methode zugriff->zugriff() nicht verfügbar ist.
     
  3. dbr

    dbr Thread Starter MacUser Mitglied

    Beiträge:
    45
    Zustimmungen:
    0
    MacUser seit:
    28.05.2005
    naja aber im konstruktor der klasse zugriff wird ein objekt von mutterklasse übergeben über welches es nun wieder möglich ist auf die mutterklasse zuzugreifen. auslesen beispielsweise funktioniert ja soweit. nur das verändern dürfte ev. wegen diverser sicherheitseinstellungen nicht verfügbar sein. die mutterklasse verliert den wert sobald die funktionen der zugriffsklasse durchlaufen wurden.
     
  4. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.045
    Zustimmungen:
    1.318
    MacUser seit:
    13.09.2004
    Das das OO-mäßig nicht sauber ist, weißt Du aber?
    Die Zugriffe auf Instanzvariable sollten immer mit Objektmethoden funktioniern, auch bei public Variablen ( die es ja erst ab PHP5 gibt!). Das heißt Mutterklasse müßte eigentlich zwei Methoden getMyVar() und setMyVar() enthalten. Diese kapseln dann OO-mäßig den Zugriff und den Wert in der Instanz eines Objektes. Ein anderes Objekt kann dann ja über diese Accessoren darauf zugreifen. Z.B. im Concstructor.


    __construct {
    neuvar=$mutterklasse->getMyVar();

    }

    new ist nicht mehr als ein Allocater für den Speicherplatz eines solchen Objektes. Das man das als Funktion mit Parametern aufruft, ist mir neu!
    Wenn dann bekommt die Klasse einen Constructor ( in PHP4 manuell), der dann mit den Parametern aufgerufen werden kann.
     
    Zuletzt bearbeitet: 13.09.2005
  5. dms

    dms Gast

    Hoppla, hab ich ganz übersehen. Sorry.
     
  6. michanismus

    michanismus MacUser Mitglied

    Beiträge:
    434
    Zustimmungen:
    0
    MacUser seit:
    23.08.2004
    Hallo,

    so funktioniert es. Wie schon gesagt wurde, um
    PHP5 treu zu bleiben aber PHP4 nicht auszuschliessen,
    solltest du __construct verwenden.

    Bei deiner Klasse "zugriff" sollte die Variable $mutterklasse
    eine Referenz sein. In deinem Fall auf die Klasse
    mutterklasse.

    Hier die Lösung:

    PHP:
    <?php

    class mutterklasse
    {
        var 
    $publicvar;
        
        function 
    mutterklasse()
        {
            
    mutterklasse::__construct();
        }

        function 
    __construct()
        {
            
    $this->publicvar '';
        }

    }

    class 
    zugriff
    {

        function 
    zugriff(&$mutterklasse)
        {
            
    zugriff::__construct($mutterklasse);
        }

        function 
    __construct(&$mutterklasse)
        {
            
    $mutterklasse->publicvar "Testvalue";
        }    
    }

    $mutterklasse =& new mutterklasse();

    $zugriff =& new zugriff($mutterklasse);

    echo 
    "Ausgabe: ".$mutterklasse->publicvar;
    ?>
    Gruß, Micha
     
    Zuletzt bearbeitet: 14.09.2005
  7. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.045
    Zustimmungen:
    1.318
    MacUser seit:
    13.09.2004
    Ja, so wie Micha das schreibt, ist es plausibel. OO-mäßig ist das allerdings weiterhin voll am Konzept vorbei. $zugriff greift direkt auf Instanzvariabln eines fremden Objektes zu! Wenn das 20 Zeilen eines n-tausend-Zeilen Projektes wären, so wäre das die Sollbruchstelle bei der nächsten Änderung des Projektes.
    Wenn schon OO, dann doch bitte mit allen Vorteilen, also Accessoren für jede Instanzvariable. Was passiert wenn Publicvar ein array wird? Wo ist dann der OO-Vorteil hin?
     
  8. dbr

    dbr Thread Starter MacUser Mitglied

    Beiträge:
    45
    Zustimmungen:
    0
    MacUser seit:
    28.05.2005
    thx for help! hab das problem nun mit einer referenz gelöst...

    @wegus... das setzen und auslesen der publicvar passiert bei mir natürlich mit funktionen. jedoch hab ich im beispiel zu demonstrationszwecken die variable auf die harte tour beschrieben. ;)

    bei genauerem nachdenken ist das mit der referenz aber ohnehin die einzige saubere lösung... doch wär ich da im traum nicht selbst draufgekommen *g*

    danke nochmal!

    schöne grüße
    Michael
     
  9. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.045
    Zustimmungen:
    1.318
    MacUser seit:
    13.09.2004
    dann hab ich auch gar nix gesagt :rolleyes: *flöt*
     
  10. dbr

    dbr Thread Starter MacUser Mitglied

    Beiträge:
    45
    Zustimmungen:
    0
    MacUser seit:
    28.05.2005
    hab mich nun ein bisschen schlau gemacht.

    im neuen objektmodell von php5 werden objekte immer als referenzen betrachtet. das explizite übergeben als referenz ist also nicht mehr notwendig.

    ich hab mich nun dafür entschieden mein projekt ausschließlich auf php5 laufen zu lassen, da der code durch das neue objektmodell weitaus übersichtlicher ist.

    just for info :)
     

Diese Seite empfehlen