Ankündigung

Einklappen
Keine Ankündigung bisher.

Öffentliche Eigenschaften vs Getter Setter

Einklappen

Neue Werbung 2019

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

  • Öffentliche Eigenschaften vs Getter Setter

    PHP 7.4 ist draußen und wieder scheint alles gegen die Wand zu laufen.

    Ich bin mit C# unterwegs gewesen und habe da gelernt, dass man keine Klassenvariablen direkt öffentlich macht. Also hab ich seit Jahren Propertys definiert, wo die Operation der Variablen zwansläufig über Methoden laufen. Vormals Getter und Setter.
    Über die definition reiner Getter, kann ich z.B: erzwingen, dass das Property nur lesbar ist.

    Seit PHP 7.4 fangen scheinbar Entwickler an, sich über die Typisierung von Klassenvariablen zu freuen und werfen alle Konventionen über Borad. z.B. die, eine Property über eine Metode zu kontollieren.

    Was verstehe ich falsch?

    Variante bisher:
    PHP-Code:

    class Auto{
       private 
    $benzin_in_liter;
       private 
    $tankinhalt_max 50;

       public 
    tanken$benzinmenge ){

          if( 
    $this -> tankinhalt_max $benzinmenge ){
            return;
          }

          
    $this -> $benzin_in_lieter $benzinmenge;
       }


    Mit PHP 7.4 wäre der Ansatz ja so. Was allerding absolut dämlich wäre

    PHP-Code:
    class Auto{
       public 
    int $benzin_in_liter;

    oder so?

    PHP-Code:
    class Auto{
       public 
    Tank50 $benzin_in_liter;

    bitcoin.de <- Meine Freelancerwährung


  • #2
    Was hindert dich daran weiterhin reguläre Getter und Setter zu schreiben? Offenbar ist PHP noch nicht so weit, dass das so flexibel eingesetzt werden kann. Hinzu kommt ja auch noch, dass Interfaces in PHP das nicht supporten.

    Kommentar


    • #3
      Mit PHP 7.4 wäre der Ansatz doch einfach so

      PHP-Code:
      class Auto {
          private 
      int $benzin_in_liter;
          private 
      int $tankinhalt_max 50;


          public function 
      tanken($benzinmenge) {

              if (
      $this->tankinhalt_max $benzinmenge) {
                  return;
              }

              
      $this->benzin_in_liter $benzinmenge;
          }


      Ich wüsste nicht, dass sich irgendwas an der Sichtbarkeit geändert hat.

      PHP-Code:
      <?php
      class Auto {
          private 
      int $benzin_in_liter 0;
          private 
      int $tankinhalt_max 50;


          public function 
      tanken($benzinmenge) {

              if (
      $this->tankinhalt_max $benzinmenge) {
                  return;
              }

              
      $this->benzin_in_liter $benzinmenge;
          }

          public function 
      __toString() {
              return 
      'Aktueller Tank: ' $this->benzin_in_liter;
          }

      }

      $auto = new Auto();
      echo 
      $auto "\n";

      $auto->tanken(30);
      echo 
      $auto;
      Aktueller Tank: 0
      Aktueller Tank: 30
      Relax, you're doing fine.
      RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

      Kommentar


      • #4
        Du kannst dir den Setter jetzt sparen wenn es dir nur um die Typisierung der Properties geht, ansonsten bieten sich weiterhin Getter & Setter an. Du kannst individuelle Constraints natürlich auch in die Typen verlagern (hier Tank50), aber das kann sich negativ auf die Usability deiner Klassen auswirken.

        Kommentar


        • #5
          OK. Ich dachte schon. PHP hätte echte Fortschritte gemacht. Ich find nur lustig, wie auf verschiedenen Blogs über php 7.4 das Property als Lösung public gesetzt wurde, nur weil es nun typisierbar ist.
          bitcoin.de <- Meine Freelancerwährung

          Kommentar


          • #6
            Zitat von Alpha Beitrag anzeigen
            OK. Ich dachte schon. PHP hätte echte Fortschritte gemacht. Ich find nur lustig, wie auf verschiedenen Blogs über php 7.4 das Property als Lösung public gesetzt wurde, nur weil es nun typisierbar ist.
            Das ist ja auch nicht verkehrt wenn es nur um die Typisierung geht.

            Vorher (ging ja nicht anders):
            PHP-Code:
            class Hero{

              private 
            $name;

              public function 
            setName(string /* ! */ $name){
                
            $this->name $name;
              }

              public function 
            getName(): string /* ! */ {
                return 
            $this->name;
              }


            vs

            Nachher:
            PHP-Code:
            class Hero{

              public 
            string $name;


            Kommentar


            • #7
              Warum Auto und Tank nicht trennen?

              PHP-Code:
              class Auto {

                  private 
              Tank $tank;

                  public function 
              __construct() {
                      
              $this->tank = new Tank(50);
                  }

                  public function 
              tanken(int $amount) {
                      
              $this->tank->add($amount);
                  }

                  public function 
              getTankValue(): int {
                      return 
              $this->tank->getCurrent();
                  }

              }

              class 
              Tank {

                  private 
              int $max;

                  private 
              int $current 0;

                  public function 
              __construct(int $max) {
                      
              $this->max $max;
                  }

                  public function 
              getCurrent(): int {
                      return 
              $this->current;
                  }

                  public function 
              add(int $amount) {
                      
              $this->current min(
                          
              $this->current $amount,
                          
              $this->max
                      
              );
                  }


              Kommentar


              • #8
                Zitat von Alpha Beitrag anzeigen
                OK. Ich dachte schon. PHP hätte echte Fortschritte gemacht. Ich find nur lustig, wie auf verschiedenen Blogs über php 7.4 das Property als Lösung public gesetzt wurde, nur weil es nun typisierbar ist.
                Naja PHP hat schon Fortschritte gemacht, man muss auch nicht immer alle Variablen verstecken und diese dann über getters und setters setzen. Sichtbarkeit bedeutet ja nicht dass man generell aus Prinzip alles auf private setzt und dann nur getter und setter nutzt. Es gibt durchaus Fälle wo man einfach nur eine Eigenschaft hätte von einem bestimmten Datentyp und früher ging das entweder über setter oder magic method. Im Vergleich dazu hat es sich schon sehr geändert.

                Ich hoffe dass mit php 8 wir dann auch C# getters/setters machen können, dann haben meine Klassen weniger Code
                apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

                Kommentar


                • #9
                  [QUOTE=Blar;n1567201]Warum Auto und Tank nicht trennen?
                  ...

                  Jupp. Aber dann verlagert man das Problem nur zum Tank.

                  bitcoin.de <- Meine Freelancerwährung

                  Kommentar

                  Lädt...
                  X