Verständnissfrage zu "::"

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

  • Verständnissfrage zu "::"

    Hallo,

    ich habe da mal eine Verständnissfrage zum ::-Operator.

    Dazu eine kleine Beispiel-Klasse
    PHP-Code:
    class User
    {
        private 
    $_intUserID;

        public function 
    __construct($intUserID)
        {
            
    $this->_intUserID=(int)trim($intUserID);
        }

        public function 
    isValidUser()
        {
            if(
    $this->_intUserID>0)
            {
                
    // weitere tests
            
    }
        }

    Diese kann ich nun ohne Probleme instanzieren und die Methode verwenden.
    PHP-Code:
    $u = new User(2);
    $u->isValidUser(); 
    Aber warum kann ich die Methode nicht direkt aufrufen? Also mit:
    PHP-Code:
    User::isValidUser(2); 
    Der Parser bemängelt die Verwendung von $this in der Methode bei dieser Art des Aufrufes.
    Wird beim Operator :: nicht die Klasse neu instanziert, der Konstruktor aufgerufen und somit auch die Verwendung von $this möglich?
    Wo liegt mein (Denk)Fehler?

    Fragt sich Poscht

  • #2
    Mit :: ohne new Klasse greifst du auf statische Methoden zu. Dazu muss aber die Methode und die ganze Klasse als static deklariert sein
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      IMHO muss lediglich die aufgerufene Methode static und public sein. Klassen an sich unterscheiden AFAIK gar nicht zwischen statisch und dynamisch. $this ist natürlich nicht möglich, da es sich auf das Instanzierte Objekt bezieht. In statischen Methoden/Klassen ist self zu benutzen: self::$meineVariable oder self::meineMethode().
      Zuletzt geändert von unset; 16.01.2008, 13:34.
      [FONT="Helvetica"]twitter.com/unset[/FONT]

      Shitstorm Podcast – Wöchentliches Auskotzen

      Kommentar


      • #4
        Ok, das war der entscheidende Hinweis.

        Auszug aus dem PHP-Handbuch zu static.
        "Weil statische Methoden ohne die Instanz eines erzeugten Objektes aufrufbar sind, ist die Pseudovariable $this nicht innerhalb von der als statisch deklarierten Methode verfügbar."

        Damit ist auch klar, warum mein Aufruf nicht geht.

        Danke für die Antworten!

        Kommentar


        • #5
          http://www.peterkropff.de/site/php/statisches.htm << Hier kannst du das auch nochmal gut nachlesen!
          Liebe Grüße,
          SteKoe!

          PHP Tutorials
          Peter Kropff | Quakenet | Schattenbaum.net

          Kommentar


          • #6
            Weils so schön dazu passt:
            PHP 5.3 wird uns u.a. mit einer Neuerung erfreuen
            Es gibt dann nicht nur: self:: und parent:: sondern auch löblicherweise static:: ! Zu allem Überfluss schenken sie uns dann auch noch: get_called_class(). Damit lässt sich dann sogar das Singleton Verhalten recht sauber vererben.
            Wir werden alle sterben

            Kommentar


            • #7
              Damit lässt sich dann sogar das Singleton Verhalten recht sauber vererben.
              Wenn die diesen Käse auch noch beheben, ja

              Kommentar


              • #8
                Ja, das kommt noch....
                hoffendlich
                PHP-Code:
                <?php 
                // only php >= 5.3
                error_reporting(E_ALL); 
                ini_set('display_errors'TRUE); // evtl. hilfreich 



                abstract class singleton 

                    private static 
                $instances= array(); 
                     
                    final public static function 
                getInstance() 
                    { 
                      
                $class get_called_class(); 
                      if(empty(
                self::$instances[$class])) 
                        
                self::$instances[$class] = new $class
                      return 
                self::$instances[$class]; 
                    } 

                    
                /* final */ protected function __construct(){} 
                    final private function 
                __clone(){} 



                class 
                mytest extends singleton 




                $my mytest::getInstance(); 

                echo 
                get_class($my); 
                ?>
                Mit etwas Nacharbeit bekommt man evtl. so gar noch die Konstruktoren mit Parameter zum "funzen"....
                Aber darum solls hier nicht gehen.
                Wir werden alle sterben

                Kommentar


                • #9
                  Original geschrieben von unset
                  IMHO muss lediglich die aufgerufene Methode static und public sein. Klassen an sich unterscheiden AFAIK gar nicht zwischen statisch und dynamisch. $this ist natürlich nicht möglich, da es sich auf das Instanzierte Objekt bezieht. In statischen Methoden/Klassen ist self zu benutzen: self::$meineVariable oder self::meineMethode().
                  Man kann auch nicht-statische Methoden statisch benutzen, sofern kein $this drin vorkommt. Es gibt dann lediglich eine Meldung auf Strict-Standards-Level (würde von error_reporting(E_ALL) nichtmal angezeigt werden):

                  PHP-Code:
                  class test {
                      public function 
                  statictest() {
                          echo(
                  "geht");
                      }
                  }
                      
                  $test = new test();
                      
                  $test->statictest();
                  echo(
                  "<br />");
                  test::statictest(); 
                  ich glaube

                  Kommentar


                  • #10
                    sofern kein $this drin vorkommt.
                    Leider auch nicht richtig!!


                    Deinen abwegigen Gedanken weitergedacht, wäre durchaus sowas einsetzbar:
                    PHP-Code:
                    class blabla
                    {
                      function 
                    dadu($pfad)  // public 
                      

                        if (!isset(
                    $this)) 
                        { 
                    // statischen Aufruf ermoeglichen 
                          
                    $selbst __CLASS__ 
                          
                    $child = @ new $selbst  
                          return 
                    $child->dadu($pfad); 
                        }
                        
                    // tuwas mit $this
                      
                    }

                    Aber, ist doch doof, oder nicht??
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      Aber, ist doch doof, oder nicht??
                      Auf jeden Fall ziemlich merkwürdig...
                      ich glaube

                      Kommentar

                      Lädt...
                      X