Objekte und Funktion

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

  • Objekte und Funktion

    Hallo!

    Ich programmiere schon seit einigen Jahren PHP, erstelle aber gerade die erste Anwendung in der ich Objekte intensiv nutze und stoße auf folgendes Problem:

    -Ich habe ein Klasse definiert, in deren Objekte ich Informationen zu Bildern speichern will.

    -Mit einer Erzeugerfunktion erzeuge ich einen gewisse Anzahl von Objekten dieser Klasse. Da die Objekte innerhalb einer Funktion erzeugt werden, stehen sie aber nicht global zu Verfügung. Ich benötige die Bildobjekte aber in jeder Situation. Also sowohl außerhalb der Erzeugerfunktion, also auch biem nächsten aufruf innerhalb der Erzeugerfunktion.

    Wie kann ich also innerhalb einer Funktion globale Variablen(Objekte) erzeugen, deren Name ich zuvor nicht kenne und die mir anschließen überall zur Verfügung stehen (auch in der Funktion selbst)?

    Vielen Dank,
    Stefan


    Hier mein Beispiel:


    PHP-Code:
    <?php
    // Speichert die existenz eines Logos
    $aLogos = array();

    class 
    logo {
        var 
    $iId;
        
        function 
    logo($iId) {
            
    $this->iId $iId;
        }
    }


    function 
    erstelleLogo($iId) {
        global 
    $aLogos;
        
    $sName "logo".count($aLogos);
        
        
    //Hier versuche ich den zukünftigen Namen des Objektes global zu registrieren
        //Das Objekt ist dann auch außerhalb der Funktion präsent, aber nicht bei einem
        //erneuten Funktionsaufruf
        
    global $$sName;
        
        
    // Hier wird geprüft, ob das zu erzeugende Objekt schon existiert
        
    if (in_array ($iId$aLogos) || is_object($$sName)) {
            
    $key array_search ($iId$aLogos);
            
    $sName "logo".$key;
            
            
    // Hier wird das Objekt nicht gefunden
            
    echo "$sName ist ein Objekt\"".is_object($$sName)."\"<br>";
            
            return $
    $sName;
        }
        
    // Erstelle es, falls es noch nicht existiert
        
    else {
            
    array_push($aLogos$iId);
            $
    $sName = new logo($iId);
            return $
    $sName;
        }
    }

    // Erstelle ein Logo "1" (ID:1)
    $newLogo erstelleLogo(1);
    echo 
    "newLogo: $newLogo<br>";
    echo 
    "LogoID->".$newLogo->iId."<br><br>";
            
    // Erstelle ein Logo "2" (ID:2)
    $newLogo erstelleLogo(2);
    echo 
    "newLogo: $newLogo<br>";
    echo 
    "LogoID->".$newLogo->iId."<br><br>";

    // Prüfe, ob logo0 (ID:1) auch global zu erreichen ist.
    // Klappt, wenn In der erstelleLogo Funktion global $$sName verwendet wird
    echo "logo0 ist ein Objekt\"".is_object($logo0)."\"<br><br>";
    // Ausgabe: logo0 ist ein Objekt"1"

    // Versuche erneut ein Logo "1" zu erzeugen.
    // Springt beim erstellen in den true Pfad, kann dort aber nicht auf das Objekt zugreifen.
    $newLogo erstelleLogo(1);
    // Ausgabe: logo0 ist ein Objekt""

    ?>

  • #2
    Du kannst über

    $GLOBALS['werte']="eins,zwei,drei";

    doch globale Werte festlegen. Diese sind immer und überall lesbar. So kann man über den festen Wert 'werte' dann die anderen dynamischen Namen speichern und so addressieren :

    $GLOBALS['eins'] = new Object;

    mache ich auch so und geht prima....

    Gruß

    BKE

    Kommentar


    • #3
      Re: Objekte und Funktion

      Original geschrieben von spy23
      Wie kann ich also innerhalb einer Funktion globale Variablen(Objekte) erzeugen, deren Name ich zuvor nicht kenne und die mir anschließen überall zur Verfügung stehen (auch in der Funktion selbst)?
      Warum sammelst du die Objekte innerhalb der Funktion nicht erst mal in einem Array - und lässt die Funktion dieses dann an die aufrufende Stelle zurückgeben?


      Die Trennung der Scopes gibt's schließlich nicht rein aus Spaß an der Freud', und allzu viel mit globalen Variablen rumwirblen verwässert die Sache doch nur.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        @wahsaga
        Wenn ich die Objekte innerhalb der Funktion in einem Array sammle und dieses zurück gebe, müsste ich im folgenden Code überprüfen, ob ein Objekt doppelt erzeugt wurde. Dies soll aber von vorn herein verhindert werden. Deshalb sollte die Funktion die Möglichkeit haben zu prüfen, ob ein Objekt bereits existiert, bevor es durch new ein zweites Mal erstellt wird.

        @bke15
        Könnte funktionieren. Ich halte die Lösung aber nicht für die elegenteste. Gibt es da nix netteres?



        Noch mal zur Erläuterung:

        In einer Datenbank befinden sich sehr viele Bilder. Der User bestimmt welche der Bilder er sehen will. (Durch Auswahl einer Kategorie, etc.) Ich sende also eine Anfrage an die Datenbank und erhalte eine Antwort mit den Bilder_ID's, die die Anfrage erfüllen.
        Nun sollen in einer Schleife diese ID's abgearbeitet werden und zu jeder ID ein Objekt erzeugt werden
        PHP-Code:
        function erstelleLogo($iId
        , dies soll aber nicht geschehen, wenn diese ID zuvor schon einmal ein Objekt erzeugt hat.

        Die Funktion erstelleLogo hat es also immer nur mit einem Objekt zu tun.

        Wenn ich ein Array mit allen Objekten erzeuge und dies der Funktion via Reference übergebe, wäre das toll. Wie aber durchsuche ich ein Array mit Objekten nach der Existenz einer Eigenschaft eines Objektes?

        Stefan

        Kommentar


        • #5
          Hi,

          Wie soll denn ein Objekt ein zweites mal erzeugt werden? Dann müsste sich die ID ja zwei mal in deiner Kategorie befinden, was dem Sinn von IDs wiedersprechen würde...

          Gruß Thomas

          €: Und abzufragen, ob ein Objekt schon erzeugt wurde ist wohl auch ganz einfach...du gehst einfach durch dein Array mit den Objekten und fragst bei jedem Objekt die ID an...
          Oder Du legst ein zusätzliches Array mit den IDs an und fragst ob der ID-Wert im Array ist.
          Zuletzt geändert von Alrik; 07.02.2006, 18:27.

          Kommentar


          • #6
            Ein Bild, dessen ID sich in zwei Kategorien befindet, würde bei zwei verschiedenen Datenbankabfragen ausgegeben.

            Dann würde die Funktion erneut ein Objekt mit dieser ID erzeugen.

            Ich habe auch darüber nachgedacht Objekte aller Bilder zu erzeugen, dies würde mich aber zu viele Ressourcen kosten.

            Stefan

            Kommentar


            • #7
              Wieviele Datenbankabfragen löst denn ein User bei dir gleichzeitig aus...?

              Kommentar


              • #8
                Das ist doch nicht Thema der Frage.

                Ich möchte die Objekte die gesamte Sitzung hindurch aufrecht erhalten. Da kann es durchaus mehrmals vorkommen, dass man ein Bild mehrmals zu Gesicht bekommt. Falls im Verlauf eine bereits angezeigte Seite noch einmal besucht wird, würden ja auch alle Bilder ein zweites Mal angezeit, bzw. deren Objekte neu erzeugt.

                Man kann sich das Array der Objekte als eine Art Warenkorb vorstellen. Dort möchte man ja auch nicht, das ein Artikel zwei mal auftaucht.

                Kommentar


                • #9
                  Und warum packst du dann nicht die Objekte wie oben erwähnt in ein Array?

                  €: Du kannst auch gleich alle Bilderobjekte erzeugen lassen und dann nur noch deine Objekte ansprechen ohne nochmal auf die Datenbank zuzugreifen.

                  Kommentar


                  • #10
                    Ich würde die Objekte gern in ein Array packen. Nur wie verhindere ich, dass ein Objekt zwei mal in das Array geschrieben wird?

                    oder

                    Wie durchsuche ich effektiv ein Array voller Objekte nach einer bestimmten Eigenschaft der Objekte?




                    €: Wie effektiv ist denn ein Array mit 10.000 Objekten, obwohl nur 50 davon gebraucht werden?

                    Kommentar


                    • #11
                      Wie du verhinderst, dass ein Objekt 2 mal im Array erscheint habe ich weiter oben geschrieben.

                      Zum Verwalten großern Mengen von Objekten...ich muss mal nachgucken, eventuell habe ich da was....

                      €: Informier dich über die Entwurfsmuster Iterator und Fliegengewicht (flyweight) und vielleicht noch Beobachter (observer).
                      Zuletzt geändert von Alrik; 07.02.2006, 19:47.

                      Kommentar


                      • #12
                        Kann ich denn das Array mit den Objekten nach einer bestimmten Eigenschaft sortieren lassen? In diesem Fall nach der Id.

                        Wenn ich sort() verwende klappt es jetzt noch, wird es aber auch noch funktionieren, wenn das Objekt viele Eigenschaften bekommt?

                        Stefan

                        Kommentar


                        • #13
                          irgendwie will sich mir die die logik der struktur nicht erschliessen ... imho scheint mir der einsatz von sessions sinnvoller. wenn du aber partout auf objekten bestehst, kannst du auch mit einer referenz auf ein array arbeiten. aber der sinn erschliesst sich mir trotzdem noch nicht.

                          vielleicht beschreibst du mal genauer, was du nun im detail mit deinen bildern und deren auswahl pro user vorhast.
                          Kissolino.com

                          Kommentar


                          • #14
                            Also:

                            Es befinden sich viele Bilder in einer Datenbank. Jedem dieser Bilder sind Schlagworte zugeordnet.

                            Wenn man die Seite betritt werden einige Bilder (die meist gesehnen, die neueste, etc.) angezeigt. Der User kann aber auch nach anderen Bildern suchen oder durch die Datenbank browsen.

                            Für jedes angezeigt Bild soll ein Objekt erstellt werden, in dem alle relevanten Daten zu dem Bild gespeichert sind. (ID, Titel, die Posotion in den "Charts", ein generierter Downloadlink, etc.)

                            Einige dieser Eigenschaften sind nicht statisch und können deshalb nicht in der Datenbank gespeichert werden (Bestellnummer, Veränderungen).

                            Jeder User der Seite erzeugt somit Objekte, die nur für ihn gelten und auch persönliche Inhalte aufweisen (zum Beispiel die Bestellnummer).

                            Wenn nun ein User die Startseite betritt, werden 12 Bildobjekte erzeugt und die Bilder werden angezeigt. Durchsucht er die Datenbank nach "Fussball", werden alle relevanten Fussball Bilder gezeigt. Ist aber eines der ersten 12 Startbilder schon ein Fussballbild, so soll dieses Objekt nicht erneut erzeugt werden.

                            Läd der User ein neue Seite, so soll das Array mit allen Objekten wieder zur Verfügung stehen. Dazu würde ich Sessions verwenden.

                            Kommentar


                            • #15
                              Original geschrieben von spy23
                              Ist aber eines der ersten 12 Startbilder schon ein Fussballbild, so soll dieses Objekt nicht erneut erzeugt werden.
                              Ja dann mach's doch einfach nicht ...

                              Irgendwas wird die Bilder ja wohl eindeutig machen - mindestens die Kombination Pfad/Name.
                              Und wenn ein Bild schon vorhanden ist, dann packst du's halt nicht mehr mit dazu.
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X