Ankündigung

Einklappen
Keine Ankündigung bisher.

Goto in PHP6

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #31
    __call() und __set() kann ich noch nachvollziehen, __get() finde ich Blödsinn. Man müsste das schon sehr, sehr genau dokumentieren, um später noch durchzublicken, welche Attribute es gibt und welche nicht, da benutze ich doch lieber ein herkömmliches Singleton-Pattern.
    Viel sinnvoller fände ich die Einführung von Propertys wie in C# oder Visual Basic.
    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

    Kommentar


    • #32
      Ganz ehrlich die Aussage mit der Alternative Singleton kapier ich nicht.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #33
        Zitat von Chriz Beitrag anzeigen
        Hm das sieht in der Tat auch gut aus, aber ich muss zu meiner Schande zugeben: Ich hatte nie wirklich Probleme mit __get/__set/__call Der Nachteil ist ja lediglich, dass die Auszeichnung fehlt und der Editor keine Vorschlaege macht, aber wie soll man das Problem auch loesen, wenn es um dynamische Eigenschaften geht - sie nicht verwenden ist halt ein schoenes Ziel, aber es kann auch enorm einschraenken.
        Nein, es schränkt nicht ein, sondern ermöglicht eine saubere Schnittstelle.

        Zitat von Manko10 Beitrag anzeigen
        __call() und __set() kann ich noch nachvollziehen, __get() finde ich Blödsinn. Man müsste das schon sehr, sehr genau dokumentieren, um später noch durchzublicken, welche Attribute es gibt und welche nicht, da benutze ich doch lieber ein herkömmliches Singleton-Pattern.
        Viel sinnvoller fände ich die Einführung von Propertys wie in C# oder Visual Basic.
        Es gibt keinen praktischen Nutzen von Magic Methods, außer die Faulheit/Inkompetenz der Programmierer zu fördern.
        Singleton hat damit a) nichts zu tun und b) sind Singletons keine Allheilmittel, ganz im Gegenteil. Es gibt nahezu kaum Einsatzzwecke, an denen Singletons sinnvoll sind.

        @dr.e.: Wir schweben auf der selben Wellenlänge.

        Kommentar


        • #34
          Zitat von Quadaptor-new Beitrag anzeigen
          Nein, es schränkt nicht ein, sondern ermöglicht eine saubere Schnittstelle.
          Was du von Hand machst uebernimmt halt __call, wo ist jetzt genau der Mehrwert?
          "Mein Name ist Lohse, ich kaufe hier ein."

          Kommentar


          • #35
            Hallo,

            __get() hat schon indirekt etwas mit Singleton zu tun.
            Natürlich, der Hauptnutzen besteht darin, dass man einfach faul ist, klar.
            Aber ein zweiter Nutzen (nicht allgemein von Magic Methods, sondern speziell von __get()) ist der, dass man teure, Attribute wie Datenbankverbindungen erst bei der ersten Verwendung erstellt.
            Das hat natürlich nicht direkt etwas mit Singleton zu tun, aber in den meisten Fällen könnte man solche Sachen mit Singleton lösen.
            Und wer hat hier geschrieben, dass Singleton ein Allheilmittel ist?
            Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

            Kommentar


            • #36
              @Manko10:
              __call() und __set() kann ich noch nachvollziehen, __get() finde ich Blödsinn. Man müsste das schon sehr, sehr genau dokumentieren, um später noch durchzublicken, welche Attribute es gibt und welche nicht, da benutze ich doch lieber ein herkömmliches Singleton-Pattern.
              Was bitte hat __get() und __set() mit Singleton zu tun? Ich glaube hier herrscht ein wenig Verwirrung um die eigentliche Bedeutung des Singleton-Pattern.


              Vielleicht nochmal ein Wort zu Singleton:
              Das Singleton Pattern wurde definiert um innerhalb einer Anwendung, oder eines Anwendungskomplexes, die jeweils aus unterschiedlichen Komponenten bestehen eine Information eines Objekts nur einmal vorhalten zu können/müssen. Im Allgemeinen kommt das Pattern immer dann zum Einsatz, wenn eine Komponente (DAO oder Business-Komponente) innerhalb einer Applikation von mehreren Stellen aus verwendet werden. Der Vorteil liegt dabei auf der Hand: Performance und Daten- bzw. Informationskonsistenz.

              Das Pattern wird zwar in den üblichen Applikationen und in den heute so verbreiteten PHP-Frameworks wie ZF, CakePHP, CodeIgniter, Symphony, ... zwar eingesetzt, jedoch nicht mit Verstand eingesetzt. Eigentlich bräuchte man das Pattern in diesen Konstrukten nicht, da die dort eingesetzten Komponenten nicht per Design von so globaler Bedeutung sind als dass die Gefahr entsteht, dass eine zweite Komponente eine identische Instanz eines Objekts (z.B. DAO) nochmal haben möchte (@quadaptor: hier gebe ich dir ein Stück weit Recht, wenn du sagst es findet nicht so häufig Einsatz). Interessant wird das Pattern jedoch weiterhin, wenn man komplexere Strukturen aufbaut, die bestimmte Komponenten mehrfach benötigen. Hier kommt es allerdings darauf an, ob die eingesetzte Bibliothek diese Art der Abstraktion versteht und anwenden kann. Konkret ist das Singleton-Pattern dann sinnvoll, wenn ich eine Business-Komponente in mehreren Bereichen der GUI verwenden möchte. Um diese Struktur überhaupt zu ermöglichen braucht es jedoch eine Komponente, die das PageController- und HMVC-Pattern implementiert.
              Viele Grüße,
              Dr.E.

              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              1. Think about software design before you start to write code!
              2. Discuss and review it together with experts!
              3. Choose good tools (-> Adventure PHP Framework (APF))!
              4. Write clean and reusable software only!
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

              Kommentar


              • #37
                Es ist mir durchaus bewusst, was ein Singleton-Pattern ist und wozu es gut ist.
                Aber die von mir beschriebene Nutzweise von __get() hat oft einen ähnlichen Charakter und lässt sich deshalb in einigen Fällen per Singleton nachbauen, zumindest wenn es sich nicht nur für eine Objekt gelten soll.

                Singleton ist allgemein dafür da, nur eine Instanz dieser Klasse zu erlauben. Nagut, vielleicht sollte man es weniger mit dem Singleton-Pattern als vielmehr mit dem Factory-Method-Pattern vergleichen.

                Aber gut lassen wir das, es ist immer noch etwas anderes, was man nicht unbedingt braucht.
                Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                Kommentar


                • #38
                  Ok, wir spielen also "Rate mal mit Rosenthal". Ich hätte da noch das FrontController-, das Composite- und das TableDataGateway-Pattern im Angebot. Ehrlich, Manko10, mit diesen Aussagen, kann ich dir

                  Es ist mir durchaus bewusst, was ein Singleton-Pattern ist und wozu es gut ist.
                  einfach nicht abnehmen. Ich beschäftige mich mit Softwaredesign schon eine ganze Weile und designe komplexe Applikationen, aber das kann ich beim besten Willen nicht unterschreiben.

                  __get(), bzw. auch __set() sind - nehmen wir die Art der Verwendung im ZF - "einfach nur" getter und setter. Nicht mehr, aber auch nicht weniger. Wenn ich mir die Zend_Config-Implementierung ansehe, kann ich bei beiden keine ansatzweise Ähnlichkeit zu Singleton feststellen. Ebenso wenig wie zum Factory-Pattern, denn __get() und __set() geben mir "einfach nur" Strings zurück.
                  Viele Grüße,
                  Dr.E.

                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  1. Think about software design before you start to write code!
                  2. Discuss and review it together with experts!
                  3. Choose good tools (-> Adventure PHP Framework (APF))!
                  4. Write clean and reusable software only!
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                  Kommentar


                  • #39
                    Nagut, zur Verdeutlichung, was ich meine:
                    PHP-Code:
                    <?php
                    class Factory
                    {
                        private static 
                    $instance null;
                        private 
                    $classes         = array();
                        
                        public static function 
                    getInstance() {
                            if (
                    self::$instance === null) {
                                
                    self::$instance = new Factory;
                            }
                            
                            return 
                    self::$instance;
                        }
                        
                        public function 
                    __get($name) {
                            
                    $name strtolower($name);
                            if (!
                    array_key_exists($name$this->classes)) {
                                
                    $this->classes[$name] = new $name;
                            }
                            
                            return 
                    $this->classes[$name];
                        }
                    }
                    ?>
                    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                    Kommentar


                    • #40
                      Hallo Manko10,

                      ich verstehe schon, wie du das meinst, jedoch könntest du den Code genauso wie folgt schreiben:

                      PHP-Code:
                      class Factory
                      {
                          private static 
                      $instance null;
                          private 
                      $classes         = array();
                          
                          public static function 
                      getInstance() {
                              if (
                      self::$instance === null) {
                                  
                      self::$instance = new Factory;
                              }
                              
                              return 
                      self::$instance;
                          }
                          
                          public function 
                      getServiceObject($name) {
                              
                      $name strtolower($name);
                              if (!
                      array_key_exists($name$this->classes)) {
                                  
                      $this->classes[$name] = new $name;
                              }
                              
                              return 
                      $this->classes[$name];
                          }
                      }

                      // Anwendung:
                      $fac Factory::getInstance();
                      $obj $fac->getServiceObject('my_class_name'); 
                      QED!
                      Viele Grüße,
                      Dr.E.

                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      1. Think about software design before you start to write code!
                      2. Discuss and review it together with experts!
                      3. Choose good tools (-> Adventure PHP Framework (APF))!
                      4. Write clean and reusable software only!
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                      Kommentar


                      • #41
                        Ja, lieber Dr.E,

                        deshalb schrieb ich ja ganz zu Anfang, dass es Blödsinn ist.
                        Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                        Kommentar


                        • #42
                          Zitat von dr.e.-new Beitrag anzeigen
                          Ebenso wenig wie zum Factory-Pattern, denn __get() und __set() geben mir "einfach nur" Strings zurück.
                          Müssen sie das?

                          Kommentar


                          • #43
                            @Manko10: dann sind wir uns ja einig!

                            @David:
                            Müssen sie das?
                            Wir darf ich die Frage verstehen? Grundsätzlich sind getter und setter für das Auslesen eines Objekt-Wertes und das Setzen desselben gedacht. Bewerte ich das Fragezeichen gesondert, muss ich dir recht geben, der Satz müsste

                            Zitat von dr.e.
                            Ebenso wenig wie zum Factory-Pattern, denn __get() und __set() geben mir "einfach nur" Strings zurück oder füllen interne Klassenvariablen.
                            lauten.
                            Viele Grüße,
                            Dr.E.

                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            1. Think about software design before you start to write code!
                            2. Discuss and review it together with experts!
                            3. Choose good tools (-> Adventure PHP Framework (APF))!
                            4. Write clean and reusable software only!
                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                            Kommentar


                            • #44
                              Zitat von Chriz Beitrag anzeigen
                              Was du von Hand machst uebernimmt halt __call, wo ist jetzt genau der Mehrwert?
                              Du kannst dir selbst deine Fragen beantworten:
                              a) Wie dokumentierst du __call-Methoden?
                              b) Wie spezifizierst du __call mit Interfaces? => Wie schützt du dich vor API-Änderungen?
                              c) Was passiert, wenn jmd. fälschlicherweise (z.B. durch Tippfehler) eine Methode aufruft, die es nicht gibt. Ich glaub nicht, dass all deine __call's eine Exception rauswerfen - aber wenn doch, hast du genauso viel Aufwand wie ohne __call.
                              d) Unit-Tests - auf dynamische APIs? Sehr geil...

                              Kommentar


                              • #45
                                Also theoretisch müsste man ein White-List-Array in solchen Inzeptor-Methoden haben ("solche", weil Inzeptor-Methoden ja nicht generell schlecht sind - __construct() ist ja z.B. auch eine). Bloß könnte man dann genausogut eine direkte Implementierung vornehmen.
                                Wie ich schon schrieb, halte ich __get(), __set() und __call() für ziemlich unsinnig und würde eher Property-Deklarationen wie in C# begrüßen. Neben der einfachen Deklaration, wie man es sonst auch gewohnt ist, gibt es noch dieses:
                                Code:
                                private double _myProperty;
                                public double myProperty {
                                    get {
                                        return _myProperty;
                                    } set {
                                        _myProperty = value;
                                    }
                                }
                                So besitzt man Getter und Setter, muss sich aber nicht mit der Verwirrung von Lazy-Initialisation abgeben.
                                Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                                Kommentar

                                Lädt...
                                X