T-Rex: Sichtbare Eigenschaft die man nicht ändern darf

Moin,

hab da eine Klasse. Diese Klasse liest beim initialisieren diverse Informationen aus der Datenbank (Tabelle). So z.B. den Primary Key (da gibts immer nur ein Feld für).

Jetzt möchte ich zwecks Übersicht keine Methode(n) welche mir die Informationen liefern, sondern am liebsten so ein Konstrukt:
$objKlasse::namePrimaryKey oder $objKlasse->namePrimaryKey

Wichtig ist, dass man die Infos nicht verfälschen kann. Also hab ich da an eine Klassekonstante gedacht. Aufgrund der Wertzuweisung nach der Initialisierung kommt das aber wiederum nicht in Frage, ergo muss es eine Public Eigenschaft sein. Diese könnte man aber jeder Zeit ändern.
Lösung?

Gruß
Konstanter Konstantin aus Konstanz
T-Rex

  1. Hi,

    Jetzt möchte ich zwecks Übersicht keine Methode(n) welche mir die Informationen liefern, sondern am liebsten so ein Konstrukt:
    $objKlasse::namePrimaryKey oder $objKlasse->namePrimaryKey

    Wichtig ist, dass man die Infos nicht verfälschen kann. Also hab ich da an eine Klassekonstante gedacht. Aufgrund der Wertzuweisung nach der Initialisierung kommt das aber wiederum nicht in Frage, ergo muss es eine Public Eigenschaft sein. Diese könnte man aber jeder Zeit ändern.
    Lösung?

    public getter, private setter?
    (Beide sind de facto public, aber der setter könnte ja prüfen, wer ihn gerade aufruft.)

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. public getter

      Ist doch wieder eine Methode oder?
      Gerade die will ich ja nicht :D.

      Gruß
      der mit den komischen Wünschen
      T-Rex

      1. Hi,

        public getter

        Ist doch wieder eine Methode oder?
        Gerade die will ich ja nicht :D.

        Nenne die Eigenschaft intern anders, und biete sie über __get an.

        z.B.

          
        class TTT {  
          private $_myfield;  
          public function __get($name) {  
            if ($name == 'myfield') {  
               return $this->_myfield;  
            }  
          }  
          
          public function __construct() {  
             $this->_myfield = '1234567890qwet';  
          }  
        }  
          
        $obj = new TTT();  
        echo $obj->myfield;  
        
        

        Man beachte, dass das Feld _myfield heißt (mit Unterstrich).

        Bis die Tage,
        Matti

        1. Das ist eine schöne Lösung :)
          Wobei zur Vervollständigung fehlt noch die Set Methode:

            
          class TTT {  
            private $_myfield;  
            public function __get($name) {  
              if ($name == 'myfield') {  
                 return $this->_myfield;  
              }  
            }  
            
            public function __set($name,$value) {  
              if ($name != 'myfield') {  
                 $this->$name = $value;  
              }  
            }  
            
            public function __construct() {  
               $this->_myfield = '1234567890qwet';  
            }  
          }
          

          Danke !

          Gruß
          Dem Geholfen wurde
          T-Rex

          1. Tach!

            Das ist eine schöne Lösung :)
            Wobei zur Vervollständigung fehlt noch die Set Methode:

            Nein, dann kannst du ja gleich ein les- und schreibbares public $myfield; nehmen. Für das Schreiben in das private $_myfield; braucht es keine __set()-Methode.

            dedlfix.

            1. Hello,

              Nein, dann kannst du ja gleich ein les- und schreibbares public $myfield; nehmen. Für das Schreiben in das private $_myfield; braucht es keine __set()-Methode.

              Versuch doch mal mit seiner __set-Methode das 'myField' zu beschreiben. :-)

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Tach!

                Nein, dann kannst du ja gleich ein les- und schreibbares public $myfield; nehmen. Für das Schreiben in das private $_myfield; braucht es keine __set()-Methode.
                Versuch doch mal mit seiner __set-Methode das 'myField' zu beschreiben. :-)

                Ach, da ist ein != ... na, das ist ja einerseits für das Vorhaben unnötig, andererseits kann man damit alle anderen - auch privaten - Variablen beschreiben.

                dedlfix.

                1. Ach, da ist ein != ... na, das ist ja einerseits für das Vorhaben unnötig

                  Nein ist es nicht, denn von Außen könnte man immer noch die Public Eigenschaft setzen und dann wird die dem __get bevorzugt. Dann hätte der Workaround nichts gebracht, da man immer direkt auf die Public Eigenschaft zugreifen würde

                  andererseits kann man damit alle anderen - auch privaten - Variablen beschreiben.

                  hmmm... das hab ich nicht getestet, dass ist eine gute idee :).

                  Gruß
                  der halb getestete
                  T-Rex

                  1. Tach!

                    Ach, da ist ein != ... na, das ist ja einerseits für das Vorhaben unnötig
                    Nein ist es nicht, denn von Außen könnte man immer noch die Public Eigenschaft setzen und dann wird die dem __get bevorzugt. Dann hätte der Workaround nichts gebracht, da man immer direkt auf die Public Eigenschaft zugreifen würde

                    Stimmt auch wieder. Wenn keine Public-Eigenschaft vorhanden ist, dann wird sie ja einfach gesetzt, wenn kein __set() das verhindert.

                    Es gibt aber eine bessere Lösung: mach die Eingenschaft mit ihrem richtigen Namen private und schreib nur einen Zugriff über __get(). Damit kann man die "private" Eigenschaft lesen, weil __get() quasi stärker als private ist, aber beim Schreiben kommt ein Fatal error: Cannot access private property.

                    andererseits kann man damit alle anderen - auch privaten - Variablen beschreiben.
                    hmmm... das hab ich nicht getestet, dass ist eine gute idee :).

                    Du hast jetzt eine Blacklist, willst aber eigentlich eien Whitelist haben. (Ohne Eintrag für deine Eigenschaft, also eine leere Whtelist, wenn nicht noch was anderes erlaubt sein soll.)

                    dedlfix.

          2. Hi,

            Das ist eine schöne Lösung :)

            Das ist ja auch das, was ich vorschlug.
            Und selbstverständlich nutzt es eine zusätzliche Methode – was du gerade vorher angeblich explizit nicht wolltest.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?