Ankündigung

Einklappen
Keine Ankündigung bisher.

Klasse zugreifen

Einklappen

Neue Werbung 2019

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

  • Klasse zugreifen

    Hallo,

    Ich versuche schon seit einiger Zeit eine Klasse zu erstellen, die ich von überall erreichen will.

    Meine Klasse:
    PHP-Code:
    <?php

        
    class userinterface
        
    {
            private 
    $vorname;
            private 
    $nachname;
            
            function 
    namerstellen($n)
            {
                
    $this->vorname $n;
            }
            
            function 
    showname()
            {
                return 
    $this->vorname;
            }
            
            function 
    __destruct()
            {
            }
            
            
    // singleton instance 
            
    private static $instance NULL

        
    // getInstance method 
        
    public static function getInstance() 
        { 
            if(!
    self::$instance
            { 
                
    self::$instance = new self(); 
            }     

            return 
    self::$instance
        }
        }
    ?>
    Hier will ich (Vorname) füllen:

    PHP-Code:
    $user userinterface::getInstance();
    $user->namerstellen("Test"); 
    Und hier will ich die Ausgeben:

    PHP-Code:
    $user userinterface::getInstance();
    echo 
    $user->showname(); 
    Und jetzt zu mein Problem, wenn ich das alles durchlaufen lasse, zeigt er mir nix an, obwohl ich ja Test als Parameter mitgegeben habe.

    Warum ist das so? bzw wo ich der Fehler?


    Gruß
    b4nan1

  • #2
    Crossposting: http://phpforum.de/forum/showthread.php?t=280034

    Das Singleton vermieden werden sollte, wurde dort bereits gesagt und am besten schaust Du Dir das tut hier mal an: http://www.peterkropff.de/site/php/oop.htm
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Wenns auch nicht schön gelöst ist, aber bei mir funktioniert Dein kleines Script!
      Haste ErrorReporting an? Nicht daß er vorher schon Dein Script abbricht?!
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

      Kommentar


      • #4
        Hey Arne,

        Danke für dein Testen.
        Nein habe ich nicht an.

        Ich versuche halt ein paar kleine Sachen, und ich weiss das es nicht schön ist die Lösung, da es GLOBAL ist!

        Ich habe eine DB, und wenn ich mich einlogge, wird das ausgeführt!

        Login.php
        PHP-Code:

        <?php
            
        include("mysqlset.php");
            include(
        "class/userinterface.php");

            
        $connection mysql_connect ("$_MySql_Ip""$_MySql_Usr""$_MySql_Pw") or die ("Keine verbindung möglich!");
            
        mysql_select_db ("$_MySql_UserDb") or die ("Die Datenbank existiert nicht");

             if (
        $_SERVER['REQUEST_METHOD'] == 'POST') {
             if(!
        session_start())
                
        session_start();

              
        $username $_POST['username'];
              
        $passwort $_POST['passwort'];

              
        $hostname $_SERVER['HTTP_HOST'];
              
        $path dirname($_SERVER['PHP_SELF']);

                
        $passwort md5($passwort);
                
        $abfrage "SELECT * FROM tb_acc WHERE name = '$username'";
                
        $ergebnis mysql_query($abfrage);
                
                
        $n 0;
                
        $h1 =  array();
                
        $h2 = array();
                
                while(
        $row mysql_fetch_object($ergebnis))
                {
                    
        $n 1;
                    
        array_push($h1,$row->name); // $h1 = $row[9];
                    
        array_push($h2,$row->pw); // $h2 = $row[3];

                      // Benutzername und Passwort werden überprüft
                    
        if ($username == $h1[0] && $passwort == $h2[0]) {
                    
        $_SESSION['angemeldet'] = true;
                    
                    
        // Weiterleitung zur geschützten Startseite
                    
        if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1'
                    {
                        if (
        php_sapi_name() == 'cgi'
                        {
                        
        header('Status: 303 See Other');
                        }
                    else 
                    {
                        
        header('HTTP/1.1 303 See Other');
                    }
                    }        
                    
                    
        header('Location: http://'.$hostname.($path == '/' '' $path).'/index.php');
                    
                    
        $user userinterface::getInstance();
                    
        $user->namerstellen($username);
                    
                    exit;
                    }
                }    

                if (
        $n == 1)
                {

                }
                
                if (
        $n == 0
                {
                    echo 
        "Benutzer nicht vorhanden!";
                }
              }    
        ?>
        Klasse:

        PHP-Code:
        <?php

            
        class userinterface
            
        {
                private 
        $vorname;
                private 
        $nachname;
                
                function 
        namerstellen($n)
                {
                    
        $this->vorname $n;
                }
                
                function 
        showname()
                {
                    return 
        $this->vorname;
                }
                
                function 
        userinterface()
                {
                    
        $this->userinterface = NEW userinterface();
                }
                
                function 
        __destruct()
                {
                }
                
                
        // singleton instance 
                
        private static $instance NULL

            
        // getInstance method 
            
        public static function getInstance() 
            { 
                if(!
        self::$instance
                { 
                    
        self::$instance = new self(); 
                }     

                return 
        self::$instance
            }
            }
        ?>
        Und hier soll es angezeigt werden(index.php)

        PHP-Code:
                    <?php 
                        
        include("class/userinterface.php");
                        
        $user userinterface::getInstance();
                        echo 
        $user->showname();
                        
                    
        ?>
        Und bei mir steht dann nix, wenn ich mich einlogge!
        Es steht erst was da, wenn ich in der klasse den rückgabewert extra deferiere!

        Warum ist das so?

        Normal müsste es doch gehen oder?

        PS: Ich finde es cool, wenn mir einer was dazu sagt obwohl es mit mein Thema nix zu tun hat!
        Ich weiss das es gefährlich ist, das so zu nutzen, ich will es einfach als Testzweck erstmal so nutzen bzw Testen!

        Kommentar


        • #5
          Hallöchen,

          du solltest dein Objekt schon mit Daten befüllen, bevor du versuchst diese auszugeben. Vergiss nicht, dass der Zustand deiner Anwendung zwischen den Requests verloren geht.

          Viele Grüße,
          lotti
          [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

          Kommentar


          • #6
            Mache ich doch mit der Funktion?
            Also kein Konstruktor, sondern meine Funktion füllt die Variable! Oder?

            Kommentar


            • #7
              Aber Du arbeitest mit header-Weiterleitung! Da verlierst Du den Zustand Deiner Klasse, sprich: es ist nichts befüllt!
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Hallöchen,

                Zitat von b4nan1 Beitrag anzeigen
                Mache ich doch mit der Funktion?
                Also kein Konstruktor, sondern meine Funktion füllt die Variable! Oder?
                So wie ich das sehe, passiert beim Aufruf deiner index.php folgendes:
                PHP-Code:
                <?php
                // Klasse "userinterface" einbinden
                include("class/userinterface.php"); 

                // Instanz ermitteln
                // (!) Da bisher keine Instanz vorhanden ist, wird ein neues, leeres Objekt erzeugt
                $user userinterface::getInstance(); 

                // Name ausgeben
                // (!) Hier findet keine Ausgabe statt, da das Objekt leer ist.
                echo $user->showname();
                Alles was du augenscheinlich davor gemacht hast, geschah im Kontext des vorherigen Requests. Jedes HTTP-Request erzeugt seinen eigenen Kontext und fängt im Prinzip bei 0 an. Sessions sind ein bewährtes Mittel um Informationen zwischen Requests verfügbar zu machen.

                Du solltest dich zwingend damit vertraut machen, wie HTTP-Requests ablaufen und welche Auswirkungen das auf deine Scripts hat. Auch rate ich dir dazu, ordentliche Namen für deine Klassen, Methoden und Eigenschaften zu wählen und dich für eine Sprache zu entscheiden:

                PHP-Code:
                class User{
                    
                /** @type {string} */
                    
                protected $firstname null;

                    
                /** @type {string} */
                    
                protected $lastname null;

                    
                /**
                     * @return {string}
                     */
                    
                public function getFirstname(){
                        return 
                $this->firstname;
                    }

                    
                /**
                     * @return {string}
                     */
                    
                public function getLastname(){
                        return 
                $this->lastname;
                    }

                PS: Singletons lassen sich in vielen Fällen vermeiden und gelten gemeinhin als Anti-Pattern.

                Viele Grüße,
                lotti
                [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                Kommentar


                • #9
                  PHP-Code:
                  $connection mysql_connect ("$_MySql_Ip""$_MySql_Usr""$_MySql_Pw"
                  So viel "Fehler" in einer Zeile

                  1. mysql_ sollte nicht mehr verwendet werden
                  2. "$varName" ist sinnlos!

                  PS: Außerdem ist md5 nicht für Passwörter geeignet und PHP_SELF darf so nicht verwendet werden (__DIR__ wäre vllt. ne Alternative)!

                  PS2: Deine While-schliefe ist so wie sie da ist sinnlos, da du immer nur $h1[0] prüfst, deine DB sollte aber lieber den namen UNIQUE setzen, dann weißt du, dass max. 1 Element zurückgegeben werden kann.
                  [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
                  [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

                  Kommentar


                  • #10
                    Ok, und das bedeutet?
                    bzw wie muss ich das schreiben?

                    Ich meine warum geht die Klasse verloren wenn die GLOBAL auf getInstance ist?

                    Bei C/C++ und C# wäre die immer noch da, und ich kann da ohne Probleme drauf zu greifen!

                    Der andere sagt, ich sollte mein Grundwissen von C nutzen, Witz wenn es so Funktionieren würde, hätte ich kaum hier im Forum nach gefragt!

                    Kommentar


                    • #11
                      Ok, und das bedeutet?
                      Arne Drews: Aber Du arbeitest mit header-Weiterleitung! Da verlierst Du den Zustand Deiner Klasse, sprich: es ist nichts befüllt!

                      Ich meine warum geht die Klasse verloren wenn die GLOBAL auf getInstance ist?
                      Lottikarotti: Alles was du augenscheinlich davor gemacht hast, geschah im Kontext des vorherigen Requests. Jedes HTTP-Request erzeugt seinen eigenen Kontext und fängt im Prinzip bei 0 an. Sessions sind ein bewährtes Mittel um Informationen zwischen Requests verfügbar zu machen.

                      Du solltest dich zwingend damit vertraut machen, wie HTTP-Requests ablaufen und welche Auswirkungen das auf deine Scripts hat. Auch rate ich dir dazu, ordentliche Namen für deine Klassen, Methoden und Eigenschaften zu wählen:


                      Bei C/C++ und C# wäre die immer noch da, und ich kann da ohne Probleme drauf zu greifen!
                      Dann dürfte das für Dich ja verständlich sein und du müsstest es entsprechend anpassen können.

                      Der andere sagt, ich sollte mein Grundwissen von C nutzen, Witz wenn es so Funktionieren würde, hätte ich kaum hier im Forum nach gefragt!
                      Welcher "andere" und warum machst du es dann nicht? Die meisten Begrifflichkeiten dürften dir ja dann nicht neu sein.
                      while (!asleep()) sheep++;

                      Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

                      Kommentar


                      • #12
                        Zitat von b4nan1 Beitrag anzeigen
                        Ok, und das bedeutet?
                        bzw wie muss ich das schreiben?
                        mysql_ sollte nicht mehr verwendet werden
                        http://php.net/manual/en/migration55.deprecated.php Stichwort PDO oder mysqli

                        "$varName" ist sinnlos!
                        http://php-de.github.io/jumpto/code-...n-doppelquotes

                        md5 nicht für Passwörter geeignet
                        http://php.net/manual/de/faq.passwords.php
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          Hallöchen,

                          Zitat von b4nan1 Beitrag anzeigen
                          Bei C/C++ und C# wäre die immer noch da, und ich kann da ohne Probleme drauf zu greifen!
                          Weil jeder HTTP-Request einen eigenen PHP-Prozess erzeugt. Dieser ist in sich geschlossen und weiß im Prinzip nichts von dem Script das vorher ausgeführt wurde. Und ja, auch eine header-Weiterleitung erzeugt einen neuen Request.

                          Zitat von b4nan1 Beitrag anzeigen
                          Der andere sagt, ich sollte mein Grundwissen von C nutzen, Witz wenn es so Funktionieren würde, hätte ich kaum hier im Forum nach gefragt!
                          Es ist sicherlich nicht verkehrt, wenn man eine andere Programmiersprache kann. Bei der Web-Entwicklung mit PHP sollte man sich allerdings im Klaren darüber sein, wie die Dinge ablaufen und was genau bei einem Request passiert. Eine Header-Weiterleitung tut im Prinzip nichts anderes als deinem Browser mitzuteilen, dass er, nachdem das Request verarbeitet wurde, eine andere URL aufrufen soll.

                          Viele Grüße,
                          lotti
                          [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                          Kommentar


                          • #14
                            Bei C/C++ und C# wäre die immer noch da, und ich kann da ohne Probleme drauf zu greifen!
                            Die erneute Request-Anforderung Deiner Weiterleitung ist vergleichbar mit dem Schliessen und wieder Öffnen Deiner C/C++ oder auch C#-Anwendung.
                            Wenn Du dann immer noch auf Deine im Speicher abgelegten Daten der ersten Instanz zugreifen kannst, mußt Du mir das unbedingt mal zeigen...
                            Competence-Center -> Enjoy the Informatrix
                            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                            Kommentar


                            • #15
                              Und genau das meine ich!
                              Ist klar das wenn das Programm zu ist, auch alles weg ist, aber mache ich die Seite als Vergleich zu? NEIN!
                              Daher läuft es anders

                              Ich glaube ich lasse den php quatsch sein, und nutze dann einfach IIS mit C#

                              Kommentar

                              Lädt...
                              X