kostenloser Webspace werbefrei: lima-city


Objekte speichern

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    unihookey

    unihookey hat kostenlosen Webspace.

    Ist es mit php möglich eine Klasse so du deklarieren, dass die Instanzen auf dem Server oder mysql gespeichert werden, dass man auf jeder Seite auf die Instanz zugreifen kann und sie nach der Änderung auf einer anderen Seite anwählen kann und die Ändereung auch dort sind?
    Wenn das eine wirklich blöde Frage ist entschuldigt bitte, bin Anfänger in OOP auf php.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. t*****b

    Du könntest Eigenschaften von Objekten zB in einer Datenbank speichern und von dieser wieder laden.
  4. Autor dieses Themas

    unihookey

    unihookey hat kostenlosen Webspace.

    dass ich es so machen kann war mir bewusst, aber gibt es denn keinen anderen Weg?
  5. Serialization.
    http://php.net/manual/de/function.serialize.php

    Funktioniert auch mit Objekten, aber nicht mit Resourcen ( Wie etwa einer mysql-Resource ).
    Hier steht auch noch mal ein bisschen was:
    http://www.php.net/manual/de/language.oop5.serialization.php

    Beitrag zuletzt geändert: 10.4.2012 13:41:20 von adrians
  6. du kannst aber auch folgendes machen (pseudocode):
    <?php
    // hier deklarierst deine klassen (auch über 'include')
    session_start();
    if (empty($_SESSION['<objekt>'])) {
      $_SESSION['<object>'] = new <classe>();
    }
    // weitere klassen - falls vorhanden - wie oben in die session laden
    ...
    // objekte wie gewohnt aus der session verwenden:
    $var = $_SESSION['<object>']->member(<parameter>);
    wichtig ist dabei, dass du die reihenfolge einhältst
    1. klassen deklarieren
    2. session starten
    3. wenn nötig, objekt in der session erzeugen (sonst ist es ohnehin von vorher schon vorhanden)
    sonst ist deine objekte in der session sind unbrauchbar (die verlieren ihre member-funktionen)

    Beitrag zuletzt geändert: 10.4.2012 13:51:46 von hemiolos
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    hemiolos schrieb:
    if (empty($_SESSION['<objekt>'])) {
      $_SESSION['<object>'] = new <classe>();
    Fast.

    Damit das beim nächsten Seitenaufruf auch noch verwendet werden kann, musst du am Ende Folgendes schreiben:
    $_SESSION['<object>'] = serialize($_SESSION['<object>']);

    Um das nächste Mal das Objekt auch wieder verwenden zu können, musst du es natürlich auch wieder vorbereiten:
    $_SESSION['<object>'] = unserialize($_SESSION['<object>']);


    Ansonsten bleiben dir die Objekte nicht ganz 1:1 erhalten, es kommt zu "incomplete Object"-Fehlermeldungen.
  8. hackyourlife schrieb:
    ...
    also es ist für mich so wie du beschreibst, nicht erkennbar:
    <?php
    // hemiolos.lima-city.de/forum/obj_in_sess.php
    
    error_reporting(E_ALL | E_STRICT);
    
    $content = null;
    
    
    class CClass {
    
      public function __construct() {
        global $content;
        $content .= '<h3>constructor here</h3>';
      }
    
      public function test() {
        return '<h3>test here</h3>';
      }
    }
    
    session_start();
    if(!empty($_POST['action']) && $_POST['action'] === 'kill object') {
      unset($_SESSION['OClass']);
    }
    
    if(empty($_SESSION['OClass'])) {
      $_SESSION['OClass'] = new CClass();
    }
    
    
    $content .= $_SESSION['OClass']->test();
    
    
    echo <<< EOT
    <!DOCTYPE html>
    <html>
      <head>
        <title>CLASS TEST</title>
      </head>
      <body>
        $content
        <form action="" method="post">
          <input type="submit" name="action" value="reload" />
          <input type="submit" name="action" value="kill object" />
        </form>
      </body>
    </html>
    EOT;


    es ist so wie da steht vol funktionstüchtig.

    Beitrag zuletzt geändert: 10.4.2012 14:17:43 von hemiolos
  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    hemiolos schrieb:
    hackyourlife schrieb:
    ...
    also es ist für mich so wie du beschreibst, nicht erkennbar
    Versuch mal folgendes, um den Fehler zu bekommen (:biggrin:)
    <?php
    // hemiolos.lima-city.de/forum/obj_in_sess.php
    
    error_reporting(E_ALL | E_STRICT);
    
    $content = null;
    
    session_start();
    
    include('sessionObjectsClass.php');
    
    if(!empty($_POST['action']) && $_POST['action'] === 'kill object') {
      unset($_SESSION['OClass']);
    }
    
    if(empty($_SESSION['OClass'])) {
      $_SESSION['OClass'] = new CClass();
    }
    
    
    $content .= $_SESSION['OClass']->test();
    
    
    echo <<< EOT
    <!DOCTYPE html>
    <html>
      <head>
        <title>CLASS TEST</title>
      </head>
      <body>
        $content
        <form action="" method="post">
          <input type="submit" name="action" value="reload" />
          <input type="submit" name="action" value="kill object" />
        </form>
      </body>
    </html>
    EOT;
    <?php
    //sessionObjectsClass.php:
    
    class CClass {
    
      public function __construct() {
        global $content;
        $content .= '<h3>constructor here</h3>';
      }
    
      public function test() {
        return '<h3>test here</h3>';
      }
    }
    
    ?>
    Der Grund: zum Zeitpunkt von session_start() müssen schon alle Klassendefinitionen geladen sein, was hier nicht der Fall ist. Wenn du die Serialize-Variante anwendest, muss jeweils erst bei dem jeweiligen unserialize die jeweilige Klasse definiert worden sein, was bei einem Haufen an includes die Sache vereinfacht.

    Ansonsten hast du recht.
  10. hackyourlife schrieb:
    hemiolos schrieb:
    hackyourlife schrieb:
    ...
    also es ist für mich so wie du beschreibst, nicht erkennbar
    Versuch mal folgendes, um den Fehler zu bekommen (:biggrin:)
    <?php
    // hemiolos.lima-city.de/forum/obj_in_sess.php
    
    error_reporting(E_ALL | E_STRICT);
    
    $content = null;
    
    session_start();
    
    include('sessionObjectsClass.php');
    
    if(!empty($_POST['action']) && $_POST['action'] === 'kill object') {
      unset($_SESSION['OClass']);
    }
    
    if(empty($_SESSION['OClass'])) {
      $_SESSION['OClass'] = new CClass();
    }
    
    
    $content .= $_SESSION['OClass']->test();
    
    
    echo <<< EOT
    <!DOCTYPE html>
    <html>
      <head>
        <title>CLASS TEST</title>
      </head>
      <body>
        $content
        <form action="" method="post">
          <input type="submit" name="action" value="reload" />
          <input type="submit" name="action" value="kill object" />
        </form>
      </body>
    </html>
    EOT;
    <?php
    //sessionObjectsClass.php:
    
    class CClass {
    
      public function __construct() {
        global $content;
        $content .= '<h3>constructor here</h3>';
      }
    
      public function test() {
        return '<h3>test here</h3>';
      }
    }
    
    ?>
    Der Grund: zum Zeitpunkt von session_start() müssen schon alle Klassendefinitionen geladen sein, was hier nicht der Fall ist. Wenn du die Serialize-Variante anwendest, muss jeweils erst bei dem jeweiligen unserialize die jeweilige Klasse definiert worden sein, was bei einem Haufen an includes die Sache vereinfacht.

    Ansonsten hast du recht.
    und warum sollte ich bitte ein fehler bekommen wollen/sollen, wenn ich kein fehler haben will/soll/muss?¿

    meine lösung ist immerhin eine auf die frage. der rest ist dichtung.

    Beitrag zuletzt geändert: 11.4.2012 3:44:47 von hemiolos
  11. 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!