kostenloser Webspace werbefrei: lima-city


Klassen und Objektbezeichnung

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    airfield-manager

    Kostenloser Webspace von airfield-manager

    airfield-manager hat kostenlosen Webspace.

    Hallo ich versuche mich gerade ein wenig in die Thematik Klassen einzuarbeiten.

    Leider verzweifle ich dabei Objekte sinnvoll zu erstellen.

    Alle gefundenen Tutorials zeigen das ein Objekt so aussieht

    $object = new Klasse();

    Damit ist aber das Objekt fest betitelt und ich kann nur soviele Objekte erstellen, wie ich im Programmcode definiert habe.

    Wenn ich nun aber Beispielsweise jeden User einer Webseite als Objekt abbilden will kann ich dies nicht, weil ich nicht weiss wieviele Objekte ich programmieren muss.
    Davon ab wäre es extrem umständlich und aufwändig einen Code wie folgt umzusetzen:

    $user1 = new Klasse();
    $user2 = new Klasse();
    ...
    $user180 = new Klasse();

    Wie also kann ich eine variable Anzahl Objekte gescheit erstellen?

    Vielen Dank an die Profis hier im Forum für die Hilfe ;)

    Stefan
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hi Stefan

    Ich bin auch nicht wirklich der objektorientere Guru, bin mich auch am Einarbeiten.
    Am einfachsten löst du dies jedoch mit einem Array:

    foreach( ... )
    {
     $user[] = new Klasse();
    
    }


    Der Index beginnt bei 0 und wird automatisch hochgezählt.
    Dort wo du die Daten wieder benötigst ist halt auch wieder eine Schleife notwendig, sofern du nicht auf einen bestimmten Eintrag (z.B. immer den ersten = 0) zugreifen willst.

    Hoffe ich konnte dir weiter helfen.

    Beste Grüsse
    Meron


  4. Autor dieses Themas

    airfield-manager

    Kostenloser Webspace von airfield-manager

    airfield-manager hat kostenlosen Webspace.

    also das würde heissen mein erstes Objekt ist $user[0] dann $user[1]
    Aber ist dass dann nicht alles irgendwie nur ein einziges Objekt?
  5. Nein, Arrays und Variablen sind ja immer nur die Adressierung eines Speicherbereiches.
    Als einfaches Beispiel: $a[0] = 5, $a[1] = 10, $a[0] != $a[1], nur die Adressierung ist vereinfacht, die Werte darin und damit auch ein Objekt ist aber komplett unabhängig.

    Das mit der Aufzählung hast du richtig verstanden.

    Was nicht möglich ist, ist übrigens folgendes $user->irgendeineMethode(), da $user nicht auf ein Objekt verweist, sondern nur $user[0], $user[1], ....
  6. Autor dieses Themas

    airfield-manager

    Kostenloser Webspace von airfield-manager

    airfield-manager hat kostenlosen Webspace.

    Danke für den Tipp.

    Habe auch noch das Thema variable Variablen gefunden, damit geht auch das was ich gesucht hatte.

    $a = 'user1';
    $$a = new Klasse();


    $$a wäre in dem Fall $user1 So kann ich Objekte doch unterschiedliche Namen zuweisen ohne diese hardcodieren zu müssen ;)



    Nächste Frage:
    Kann ich jetzt auch noch mehrere Objekte in einer Session speichern?

    Objekte in ein Array schreiben und das dann in der Session speichern scheint nicht zu funktionieren.
  7. Hi Stefan

    Ich kenne mich mit variablen Variablen nicht aus, sehe aber gerade nicht was der Vorteil derer sind in deinem konkreten Beispiel, denn am Schluss codierst du die Anzahl möglicher User ja doch wieder fix ein ($a = 'user1'; $b = 'user2';, und wenn jetzt ein dritter User erstellt werden soll, dann muss ein $c = 'user3' fix einprogrammiert werden).

    Um Objekte über die Laufzeit von PHP zu speichern müssen diese serialisiert werden (http://ch2.php.net/manual/de/function.serialize.php) und anschliessend in der nächsten Datei wieder deserialisiert (http://ch2.php.net/manual/de/function.unserialize.php).

    Die Zeichenkette die du mit serialize erhälst kannst du entweder in der Datenbank, in einer Datei oder wahrscheinlich auch in der Session speichern (wobei ich das noch nie versucht habe), generell gilt aber: pro Objekt ein serialize.

    Gruss
    Meron
  8. Autor dieses Themas

    airfield-manager

    Kostenloser Webspace von airfield-manager

    airfield-manager hat kostenlosen Webspace.

    Nein nicht ganz

    $a = User (als variabler Wert aus EIngabe oder Datenbank oder wo immer du die Daten her haben willst)

    $$a = das neue Objekt heisst nun $User und das für jedes $a was du erstellt hast

    Bzw für jeden Inhalt von $a hast du nun ein anderes Objekt
  9. Ich habe gerade zufälligerweise diesen Thread gefunden und wollte noch folgendes anmerken.

    1. Wenn man Nutzer als Objekte abbilden will, müssen die Daten ja irgendwoher kommen und irgendwohin gehen. Danach richtet sich dann auch, wie ich sie in meinem Programm verwalte. Werden beispielsweise immer Objetke aus einer Datenbank gelesen, verarbeitet und dann sofort ausgegeben, reicht eine Variable, etwa

    $result = mysql_query("...");
    while(($data = mysql_fetch_assoc($result)) !== NULL) {
            $tmp = new Test($data["username"]);
            echo "<li>Nutzer: ".htmlspecialchars($tmp->getUsername())."</li>\n";
    }
    2. Die Technik zum dynamischen Zugriff auf Variablen verwende ich nur äußerst selten. Wenn die Möglichen Werte für $a aus dem Beispiel nicht fest voreingestellt sind, kann das auch ein großes Sicherheitsrisiko bedeuten, insbesondere, wenn die Daten auf irgendeine Weise vom Nutzer eingegeben werden können.

    3. Bezüglich der Frage, ob man Objekte in einer Session speichern kann:
    <?php
    
    session_start();
    
    class Test {
    
    	private $username;
    
    	function Test($username) {
    		$this->username = $username;
    	}
    
    	function getUsername() {
    		return $this->username;
    	}
    
    }
    
    $_SESSION["test"] = array();
    $_SESSION["test"][] = new Test("Linux-Fan");
    $_SESSION["test"][] = new Test("Ma_Sys.ma");
    
    header("Content-Type: text/plain; charset=UTF-8");
    print_r($_SESSION);
    
    ?>
    Kurz gesagt: Geht einfach, wie man es erwartet.

    Ich hoffe das hilft weiter.
  10. Autor dieses Themas

    airfield-manager

    Kostenloser Webspace von airfield-manager

    airfield-manager hat kostenlosen Webspace.

    Hey masysma, das sieht wirklich brauchbar aus. Danke sehr

    Wenn ich nun aber
    $tmp = new Test($data["username"]);
    benutze ,
    wie heisst das Objekt dann? Also wie kann ich erneut drauf zugreifen? Ist das $tmp aber wie würde dann das Objekt vom 2. User heissen?


    Die Session kann auch ein Array sein? Das öffnet mir glaub ganz neue Möglichkeiten. :-D
  11. airfield-manager schrieb:
    Wenn ich nun aber
    $tmp = new Test($data["username"]);
    benutze ,
    wie heisst das Objekt dann? Also wie kann ich erneut drauf zugreifen? Ist das $tmp aber wie würde dann das Objekt vom 2. User heissen?
    Der zweite User heißt auch wieder $tmp. Die Variable wird also überschrieben. Du kannst danach nicht mehr auf den ersten zugreifen.
    Das brauchst du auch nicht, denn er wurde ja schon ausgegeben. Wenn doch, dann nutze ein Array.
  12. Ausgehend von deinem Beispiel mit einem User Objekt, hier mal ein praktisches Beispiel wie man das Objekt definiert und mehrere Instanzen verwalten kann:
    class User {
    
      // Felder
      public $ID;
      public $Name;
      public $Email;
    
      // Constructor
      public function __construct($id, $name, $email) {
        $this->ID = $id;
        $this->Name = $name;
        $this->Email = $email;
      }
    
    }

    Das User Objekt ist definiert und wie dir mit Sicherheit aufgefallen ist habe ich ein zusätzliches Feld hinzugefügt "ID". Datenbank Einträge über einen String als Selector zu manipulieren kann sehr schnell in die Hose gehen. Also benutz besser die ID des Eintrags, um Probleme zu vermeiden.

    Um jetzt mehrere Instanzen von dem User Objekt zu verwalten, kannst du folgenden Code verwenden:
    $res = mysql_query('...');
    $users = array();
    while(($data = mysql_fetch_assoc($res)) !== NULL) {
      $users[$data['ID']] = new User($data['ID'], $data['Name'], $data['Email']);
    }

    Dies ist die simpelste Methode um mehrere Objekte auf einmal zu verwalten, aber es geht auch noch ein wenig einfacher und schonender für die Application:
    class UserManager {
    
      protected static $users = array();
    
      public static getUserByID($id) {
        if(!isset(static::$users[$id]) or !(static::$users[$id] instanceof User)) {
          // Benutzer aus der Datenbank laden, Objekt erstellen und dem static::$users array zuweisen...
        }
        return static::$users[$id];
      }
    
      // Und so weiter...
    
    }

    In der oben angerissenen Klasse, werden User Instanzen erst generiert wenn sie benötigt werden. Statt getUserByID($id), kann man natürlich auch andere Felder benutzen die in der Datenbank abgelegt sind. Genauso sind auch Batch Abfragen möglich und viele andere Dinge die einem da so noch einfallen.

    Wichtig ist nur, dass du genau weißt wo welche User Instanz abgelegt ist und wie diese identifiziert wird. Eine Limit hast du in dem meisten Fällen eher nicht, dennoch bedeutet das nicht dass du jetzt einfach alle User in ein einzelnes Array packen solltest. Immer nur so viel laden/abfragen/bearbeiten wie es nötig ist.
  13. Autor dieses Themas

    airfield-manager

    Kostenloser Webspace von airfield-manager

    airfield-manager hat kostenlosen Webspace.

    Hey, vielen Dank das hilft mir weiter ;) So langsam versteh scheinbar auch ich das :-D
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!