Ankündigung

Einklappen
Keine Ankündigung bisher.

__set() verhindern das erzeugen einer neuen Variablen

Einklappen

Neue Werbung 2019

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

  • __set() verhindern das erzeugen einer neuen Variablen

    Also mit __set( $name, $value ) kann ich ja variablen einner klasse setzen die als private gekenzeichnet sind.
    Das Problem ist das __set aber auch eine neue Variable erzeugt falls diese nicht vorhanden ist.
    kann ich das verhindern??
    Hier mein Code :

    PHP-Code:

    class MyClass{
       private 
    $MyVar;
       
       function 
    __set$name$value ){
          
    $this->$name $value;
       }

    }

       
    $foo = new MyClass();
       
    $foo->MyVar     "bla";
       
    $foo->MyErrVar "blu";
       echo 
    $foo->MyErrVar;
       echo 
    $foo->MyVar
    Jetzt will ich verhindern dass MyErrVar überhaupt erzeugt wird da man sich ja immer mal verschreiben kann und somit eine Variable erzeugt und werte dort reinschreibt die für eine andere gedacht waren und somit ist man bei der fehlersuche verloren.

  • #2
    kann man innerhalb der Funktion nicht $name mit einem Array gültiger Variablennamen abgleichen und bei fehlender Angabe mit false beenden??
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      hmm..
      auf diese idee bin ich nicht gekommen.
      Schon mal nicht schlecht obwohl einbischen unsauber wie ich finde

      Kommentar


      • #4
        so wie die Funktion jetzt definiert ist kann man sie aber auch gleich weglassen oder?

        Code:
           function __set( $name, $value ){ 
              if (!in_array ($name , 
                             array ('MyVar' ,
                                    'OtherVar'
                                    ))) return false;
              $this->$name = $value; 
           }
        Unsauber?
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Macht echt keinen Sinn.
          Warum setzt du die Vars nicht gleich auf public?

          Ich vewende __get() etc. nur in Dekoratoren oder Datenobjekten, in denen die Werte in assoziativen Arrays vorliegen.

          Basti

          Kommentar


          • #6
            mal ne blöde frage: was sind'n Dekoratoren?
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7

              Kommentar


              • #8
                Abgesehen davon, dass ich __set() ebenfalls für eher schlecht halte, suchst du vermutlich get_class_vars():
                PHP-Code:
                public function __set($name$value)
                {
                    if(
                array_key_exists($nameget_class_vars(get_class($this))) {
                        
                $this->$name $value;
                    }

                Kommentar


                • #9
                  ...müsste array_key_exists() anstatt in_array() sein, da die Property-Namen die Schlüssel im Array sind.

                  Und, im Falle, dass das Attribut nicht existiert sollte eine Exception oder eben ein Fehler geworfen werfen. Andernfalls wäre das kein Spaß beim Debuggen!

                  Basti

                  Kommentar


                  • #10
                    Warum setzt du die Vars nicht gleich auf public?
                    weil ich soo besser kontrolieren kann welche werte reinkommen.
                    Bsp. : ein Vorname darf keine zahlen enthalten!
                    Dies kann ich abfangen und eine Exception aufwerfen falls jemand eine zahl speichert ! :wink:

                    Kommentar


                    • #11
                      Zitat von xabbuh
                      Abgesehen davon, dass ich __set() ebenfalls für eher schlecht halte, suchst du vermutlich get_class_vars():
                      PHP-Code:
                      public function __set($name$value)
                      {
                          if(
                      in_array($nameget_class_vars(get_class($this))) {
                              
                      $this->$name $value;
                          }

                      das ists Danke

                      Kommentar


                      • #12
                        Zitat von Basti
                        ...müsste array_key_exists() anstatt in_array() sein, da die Property-Namen die Schlüssel im Array sind.
                        Hast Recht, Code geändert...

                        Kommentar


                        • #13
                          Zitat von shocky
                          Warum setzt du die Vars nicht gleich auf public?
                          weil ich soo besser kontrolieren kann welche werte reinkommen.
                          Bsp. : ein Vorname darf keine zahlen enthalten!
                          Dies kann ich abfangen und eine Exception aufwerfen falls jemand eine zahl speichert ! :wink:
                          Das stimmt natürlich. Bei meinen Datenobjekten (die übrigens auch überladen sind, aber weil die Attribute intern in Datatype-Objekten gespeichert werden, die aber nach außen nicht direkt sichtbar sein sollen) kannst du reinhauen, was du willst und erst bei einem expliziten Aufruf von isValid() oder implizit über getErrors() oder save() wird festgestellt, dass da womöglich was nicht stimmt.

                          Ist dort aber natürlich auch so angebracht, da die "karputten" DataObjects ja wiederum z.B. die Formulare speisen, in denen sich der Benutzer verbessern soll.

                          Basti

                          Kommentar


                          • #14
                            joa das kann man natürlich soo sehen!

                            Ich versuche es aber immer schon bereits bevor die daten gespeichert werden dies zu überprühfen ( ne angewohnheit von c# ) obwohl das mir jetzt echt zu schaffen mach obs den sinnvoll ist bei ner scriptsprache wie PHP.
                            Denn das Script wird abgearbeitet und dann ists vorbei und dazwischen irgendwo kann man ja nicht einfach mal ein fenster aufgehen lassen das sagt bitte nur buchstaben eingeben

                            Ich muss sagen du bringst meine heille welt gerade einbischen durcheinander

                            Kommentar


                            • #15
                              Aber warte mal soo habe ich doch ebenfalls eine gute möglichkeit die eingabe zu testen!!!

                              ich nehme dann ein Attribut wie $IsValid was beim jeden __set dan den entsprechenden wert krigt (true oder false ) ( muss natürlich im set ne fallunterscheidung machen zwischen den verschiedenen Vars) dann muss ich später nur noch IsValid abfragen und weis schon obs verarbeitet werden kann

                              Kommentar

                              Lädt...
                              X