Ankündigung

Einklappen
Keine Ankündigung bisher.

Nullable interface

Einklappen

Neue Werbung 2019

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

  • Nullable interface

    Hallo Leute,

    es gibt ja die Seite https://php-vote.com/ wo man Ideen für PHP8 einreichen kann und andere Voten für oder gegen. Ich habe soeben die Idee mit Nullable interface eingetragen https://php-vote.com/idea/36 da ich was ähnliches für Countable haben wollte. Manchmal will ich halt prüfen ob ich ein NullObject habe oder nicht. Aktuell mache ich das mit instanceof, ich fände es aber is_null besser.

    Was meint ihr? Schlechte Idee? Habe ich an irgendwas nicht gedacht?

    Ich bin mir aktuell nicht sicher ob es "Meinungsumfrage" ist oder "Software Design"
    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


  • #2
    Moin,

    NullObjekte sind ja gerade dafür da, dass man nicht extra irgendwelche Prüfungen vornehmen muss sondern ohne Bedenken Methoden aufrufen kann, ohne dass tatsächlich etwas passiert. Z.B. (Sinnhaftigkeit mal außen vor gelassen)
    PHP-Code:
    interface Sender {

        public function 
    send(string $message): void;
    }

    class 
    MailSender implements Sender {
        public function 
    send(string $message) : void {
            
    // TODO: Implement send() method.
        
    }
    }

    class 
    SmsSender implements Sender {
        public function 
    send(string $message) : void {
            
    // TODO: Implement send() method.
        
    }
    }

    class 
    NullSender implements Sender {
        public function 
    send(string $message): void {}
    }

    class 
    SenderFactory {
        
    /**
         * @param $param
         * @return Sender
         */
        
    public function make($param) {
            switch (
    $param) {
                case 
    'Mail':
                    return new 
    MailSender();
                case 
    'SMS':
                    return new 
    SmsSender();
                case 
    'None':
                default:
                    return new 
    NullSender();
            }
        }

    Der Client bekommt von der Factory die passende Sender-Klasse zurück. Ob er damit eine Email, SMS oder gar nichts sendet... interessiert ihn nicht wirklich, er muss sich eh auf die Factory verlassen dass er die richtige Klasse bekommt.

    Hast du ein konreteres Beispiel in dem du auf null/Nullable prüfen würdest?
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

    Kommentar


    • #3
      Ich verstehe den Verwendungszweck nicht so ganz. Das "NullObject" ist ja erstmal auch nur ein gewöhnliches Objekt dessen Aufrufe einfach nur ins Leere führen um sich Nullchecks zu ersparen. Es ist also nicht "null", was den is_null-Aufruf ad absurdum führt. Da müsstest du etwas genauer ausführen was eigentlich die Beweggründe sind und wieso Alternativen hier nicht anwendbar sind.

      Kommentar


      • #4
        Das entstellt den Sinn von NULL. Wie willst du unterscheiden ob ein $object null ist, oder $object ein Objekt das Nullable implementiert (und grade meint null zu sein)? Das gibt es vielleicht in deinem Use Case nicht, für das allgemeine Design der Sprache wäre das aber richtig hässlich.

        Kommentar


        • #5
          Geht die Idee vielleicht eher in Richtung Optionals?

          Kommentar


          • #6
            Zitat von VPh Beitrag anzeigen
            Hast du ein konreteres Beispiel in dem du auf null/Nullable prüfen würdest?
            Also in meinem Fall wäre das, ich hole mir Entites aus einem Repository heraus, modiziere die Werte und rufe vom Repository dann ->updateOrReplace($entity); auf. In der Methode muss aber vorher prüfen ob ich ein null object übergeben habe weil sonst würde ich ja ein leeren Datensatz in die DB Schreiben. Ich habe Fälle, wo das entity als Nulloebject erzeugt wird.

            erc ja ich weiß was ein NullObject pattern ist, aber wenn man nach hässlichkeit in der Sprache geht, dann wäre ArrayAccess zb auch hässlich, wieso sollte man einem Objekt einen ArrayAccess geben?

            lottikarotti alternativen sind ja da und anwendbar, ich arbeite mit instanceof und breche dementsprechend ab. Ich werde mal nächste Woche in meinem Code mir die Beispiele raussuchen und posten.

            xm22 also ich weiß nicht ob das https://docs.microsoft.com/en-us/dot...le-value-types Optional sind,aber es gibt die UseCases halt

            oder hier https://docs.microsoft.com/en-us/dot...tframework-4.8

            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


            • #7
              BlackScorp Der Sinn ist aber nicht, darauf Methoden aufzurufen, sondern definieren zu können, ob etwas Null sein kann und das zu prüfen.

              EDIT: ich sehe gerade, dass du das in deinem ersten Post geschrieben hast

              Kommentar


              • #8
                Ich glaube das hat sich eh erledigt, mein Vorschlag wurde heruntergevoted
                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
                  Zitat von BlackScorp Beitrag anzeigen
                  erc ja ich weiß was ein NullObject pattern ist, aber wenn man nach hässlichkeit in der Sprache geht, dann wäre ArrayAccess zb auch hässlich, wieso sollte man einem Objekt einen ArrayAccess geben?
                  Mir geht es nicht um Design Patterns. Es geht um die Funktion von null in der Sprache.

                  PHP-Code:
                  $a null;
                  $b = new Class() implements Nullable { public function __isNull(): bool { return true; } }; 
                  Was passiert: (?!)

                  PHP-Code:
                  $a === $b
                  $a 
                  == $b
                  is_null
                  ($a)
                  is_null($b)
                  isset(
                  $a)
                  isset(
                  $b)
                  empty(
                  $a)
                  empty(
                  $b)
                  $a === null
                  $b 
                  === null
                  in_array
                  (...)

                  $fn fn (?OtherClass $x) => $x?$x->getFoo():'-';

                  $fn($a)
                  $fn($b
                  PHP ist in der Hinsicht schon jetzt alles andere als sauber. Da muss echt nicht noch eine Kelle oben drauf.

                  Kommentar

                  Lädt...
                  X