1. #1
    Avatar von Jokuu
    Registriert seit
    08.03.2014
    Beiträge
    263
    Thanked 108 Times in 74 Posts

    Standard Globale Variable ohne Kapselung

    Hi,

    ich habe in einer Klasse eine globale Variable auf die ich von außen zugreifen möchte. Kapselung ist eigentlich nicht nötig daher dachte ich es wäre sinnvoll sie einfach wegzulassen, also

    PHP-Code:
    class Meine_Klasse{
        public 
    $user_data

    Bei anderen habe ich gesehen, dass die dann trotzdem kapseln

    PHP-Code:
    class Meine_Klasse{
        private 
    $user_data
        public function 
    get_user_data(){
            return 
    $user_data;    
        }
        public function 
    set_user_data($new_data){
            
    $this->user_data $new_data;
        }

    Sehe da aber keinen Vorteil. Es müsste sogar schlechter sein denn wenn ich jetzt das hier mache:

    PHP-Code:
    $meine_klasse = new Meine_Klasse;
    $user_data $meine_klasse->get_user_data();
    echo 
    $user_data["name"]; 
    habe ich doch nur unnötig mehr Zeilen und kopierte Variablen. Einfacher wäre es also ich würde es öffentlich machen, dann könnte ich das machn:

    PHP-Code:
    $meine_klasse = new Meine_Klasse;
    echo 
    $user_data["name"]; 
    Finde ich einfacher, verständlicher, kürzer. Also wäre doch alles erfüllt dass der Code so besser ist, oder?
    Ich sehe einfach keinen Sinn wieso man pauschal immer kapseln sollte obwohl es nichts zu kapseln gibt
    Meine Tochter neulich im Zoo in der Arktisabteilung: "Guck mal Papi, da sind Linuxe!"

  2. #2

    Registriert seit
    17.07.2014
    Beiträge
    50
    Thanked 26 Times in 16 Posts

    Standard AW: Globale Variable ohne Kapselung

    Ich denke es ist Geschmackssache...
    Zum einen hat man was damit zu tun, was man in die Variable speichert. Ich zum teil nutze eine Variable für die MySQL Daten, und erlaube da nicht einfach per direkten Zugriff darauf zu schreiben. PDO::FETCH_OBJECT gefällt mir nicht so, daher diese Variante.

    Aber auch hat das was mit Datenintegrität zu tun. Wenn du eine Variable public machst, kannst du überall im Code diese verändern. Gerade in deinem Beispiel Namen sehe ich das eher als kritisch an, zumal das ja nichts ist, was man ständig ändert. Da ist z.B. eine Setter FUnktion nützlich, damit eine Änderung 1. nicht ausversehen und 2. vollständig durchgeführt werden. z.B. beim Ändern des Namens dann ein DB-Update.
    Das mag am Anfang vielleicht garnicht geplant sein, aber wenn man es von Anfang an mit Gettern/Settern macht ist es am Ende übersichtlicher, sauberer und sicherer.



    //Edit:
    Eine Variable in einer Klasse ist niemals global, da sie nur im Scope ihre gültigkeit hat. Simmulieren könntest du es höchstens mit einer Klassenkonstante/Static
    Geändert von BeTwo (18.07.2014 um 14:36 Uhr)

  3. #3
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    446
    Thanked 361 Times in 236 Posts

    Standard AW: Globale Variable ohne Kapselung

    Den Scope einer Variable kann man im Nachhinein großzügiger gestalten, ohne große Probleme. Aber das spätere Einschränken des Scopes wird deutlich aufwändiger, speziell wenn die entsprechende Variable häufig genutzt wird.
    Kurz: Private/Protected -> Public ist einfach. Public -> Private/Protected kann Aufwand hervorrufen.

    Wie ich in einem anderen Thema von dir bereits erwähnt habe, sollte man den Scope grundsätzlich so klein wie möglich halten. Getter und Setter sind da leider ein notwendiges Übel in vielen Sprachen, aber es gibt glücklicherweise auch andere Sprachen, dessen pfiffige Entwickler zumindest syntaktischen Zucker reingehauen haben.

    An der Namensgebung (user_data) in deinem kleinen Codeausschnitt lässt sich vermuten, dass es sich um eine Datenhaltungsklasse handelt. Wenn du dort einen Wert änderst, findet sich in deinem Programm doch sicher das ein oder andere Objekt, das über diese Änderung informiert werden möchte, oder nicht? Zum Beispiel die Präsentationsschicht. Möchtest du es jedes Mal von Hand machen, wenn du den Wert änderst, oder möchtest du diese Benachrichtigung nur einmal herunter tippen und bei jeder Wertänderung den Setter die Arbeit machen lassen? Ich hoffe, du tendierst zu Letzterem.

Ähnliche Themen

  1. Cro ohne Maske
    Von Mr.Bombastic im Forum Musik ♫
    Antworten: 36
    Letzter Beitrag: 26.06.2014, 00:15
  2. Antworten: 5
    Letzter Beitrag: 31.12.2013, 15:01
  3. Antworten: 2
    Letzter Beitrag: 19.03.2013, 19:35
  4. Mac OS X ohne CD formatieren?
    Von MaskuL1n im Forum OS X
    Antworten: 1
    Letzter Beitrag: 06.12.2012, 15:17
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.