Ankündigung

Einklappen
Keine Ankündigung bisher.

with() in php

Einklappen

Neue Werbung 2019

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

  • with() in php

    hi,

    ich ärgere mich schon manchmal, dass with() in php nicht vorhanden ist. in javascript benutz ich with() sehr gerne. in dem was ich bisher in php gecoded hab, wärs desöfteren schonmal praktisch gewesen. was meint ihr, soll mann das mal vorschlagen?

    hier noch ein bsp:

    normaler php code:

    PHP-Code:

    $class
    =new class;
    $class->tuwas();
    $class->tumehr();
    $class->tonochwas(); 
    mit with()

    PHP-Code:

    $class
    =new class;
    with($class)
    {
         
    tuwas();
         
    tumehr();
         
    tunochwas();

    ich finde das macht den code ne gute spur lesbarer, besonders wenn man tabs benutzt und jeder geschweiften klammer ne eigene linie gibt.
    natürlich ists in php nicht besonders oft anwendbar, aber eigentlich müsste es besonderes wenn mans innerhalb ner klasse benutzt (mit $this) doch ziemlich bequem sein....

    gruß

  • #2
    Wenn es eh Methoden ohne return wert sind mach es doch so:

    PHP-Code:
    <?php 
    class testClass
    {

        public function 
    tuWas()
        {
            
    /*
            function code
            */
            
    return $this;
        }
        public function 
    tuMehr()
        {
            
    /*
            function code
            */
            
    return $this;
        }
        public function 
    tuNochWas()
        {
            
    /*
            function code
            */
            
    return $this;
        }
    }

    $class = new testClass();
    // wahlweise so: 
    $class->tuWas()->tuMehr()->tuNochWas();
    // oder etwas übersichtlicher so:
    $class->tuWas()
          ->
    tuMehr()
          ->
    tuNochWas();

    ?>
    So wird das beim Zendframework angewandt, nennt sich call chaining.

    Kommentar


    • #3
      PHP-Code:
      $class->tuWas()->tuMehr()->tuNochWas(); 
      das funktioniert nur, wenn tuwas() und tumehr() objecte zurückgeben, wie du ja selbst im code zeigst. außerdem wars ja nur ein beispiel. natürlich solls auch möglich sein return werte zu verarbeiten......

      Kommentar


      • #4
        Zitat von robo47
        call chaining
        Humbug! Da is der Einsatz von with() 100x sinnvoller, wobei ich with() bei PHP bisher eigentlich noch nicht vermißt habe. Aber vorschlagen kannst du es allemal.

        Kommentar


        • #5
          wenn ich die klassennamen und die Methoden Namen von ZendFrimework ansehe,
          dann vermisse ich auch 'with'.
          Ehrlich gesagt geht mir Operator '->' auch richtig auf den Geist, aber da lässt sich in php nichts mehr dagegen machen.

          Kommentar


          • #6
            Zitat von Slava
            wenn ich die klassennamen und die Methoden Namen von ZendFrimework ansehe,
            dann vermisse ich auch 'with'.
            Ehrlich gesagt geht mir Operator '->' auch richtig auf den Geist, aber da lässt sich in php nichts mehr dagegen machen.
            im gegensatz zu javascript mit dem . finde ich -> um einiges lesbarer. natürlich ists mehr arbeit....

            http://news.php.net/php.internals/32721

            Kommentar


            • #7
              [OT]
              also ich bin in Berührung mit folgenden Object Orientierten Sprachen gekommen:
              c++,Java, C#, VB, ActionScript, Javascript, PHP, Pithon, Perl, Ruby.
              von diesen sprachen sind PHP, Perl und Ruby mit dem '->' Operator belegt.
              und der Preis für der schrecklichste Syntax hat von mir Ruby bekommen.
              das ist natürlich alles Geschmacksache und ist auch davon abhängig, mit welcher Sprache man anfängt.
              Da ich mit Java und C++ angefangen habe kann ich mich nicht wirklich an Operator '->' freuen und wenn ich Quellcode von Ruby ansehe, dann wird mir einfach schlecht.

              ach so, bei C gibtes der orperator '->' der als Zeiger auf ein Element einer Struktur oder Union dient
              da C++ aus C entstanden ist, könnte man auch bei C++ benutzen (muss man aber nicht, da in C++ Struckturs und Union kaum eine rolle mehr spielen)
              [OT]

              Kommentar


              • #8
                was mich aber mehr als with() belastet, ist die Tatsache, dass PHP5 kein casting unterstützt. Ein object kann nicht auf seine basisclasse gekastet werden, sondern nur auf Array, String und Object.
                Das ist wirklich voll bescheuert OOP ohne Grundlagen von Polimorfie weiter zu entwickeln.

                Kommentar


                • #9
                  Zitat von Slava
                  was mich aber mehr als with() belastet, ist die Tatsache, dass PHP5 kein casting unterstützt. Ein object kann nicht auf seine basisclasse gekastet werden, sondern nur auf Array, String und Object.
                  Das ist wirklich voll bescheuert OOP ohne Grundlagen von Polimorfie weiter zu entwickeln.
                  ich nie mit oop sprache richtig gearbeitet....

                  was meinst du?

                  Kommentar


                  • #10
                    c++, java, c# unterstützen casting.
                    beispiel:
                    PHP-Code:
                    class A{
                    function 
                    f(){ return 'A';}
                    }

                    class 
                    extends A{
                    function 
                    f(){ return 'B'; }
                    }

                    $a=new B;
                    //das geht in oben genannten sprachen, aber in PHP leider nicht
                    echo ((A)$a).f(); 
                    //an dieser stelle muss die funktion 'f' von classe A kommen, also die echo muss ein A ausgeben. 
                    also kann ich in PHP mein Object $a nur auf
                    (array)$a, (string)$a oder (object)$a
                    casten
                    und das ist mir zu wenig.
                    Ich will wie bei anderen Sprachen ein Object auf beliebige Basisclasen mit dem Cast-operator reduzieren können.

                    Kommentar


                    • #11
                      Zitat von Slava
                      c++, java, c# unterstützen casting.
                      beispiel:
                      PHP-Code:
                      class A{
                      function 
                      f(){ return 'A';}
                      }

                      class 
                      extends A{
                      function 
                      f(){ return 'B'; }
                      }

                      $a=new B;
                      //das geht in oben genannten sprachen, aber in PHP leider nicht
                      echo ((A)$a).f(); 
                      //an dieser stelle muss die funktion 'f' von classe A kommen, also die echo muss ein A ausgeben. 
                      also kann ich in PHP mein Object $a nur auf
                      (array)$a, (string)$a oder (object)$a
                      casten
                      und das ist mir zu wenig.
                      Ich will wie bei anderen Sprachen ein Object auf beliebige Basisclasen mit dem Cast-operator reduzieren können.
                      naja, solange es sich nicht um private methoden oder vars handelt, kannst du $a->f() benutzen. anderfalls musst du wirklich (mehrmals) get_parent_class benutzen()...da ich aber nicht in oop drin bin, was für einen nutzen hat das? in php würde ich das eher als design fehler ansehen.

                      eben weil class->A nur standartisierte methoden (und vars) anbieten sollte. erweiterte klassen sollten diese dann nutzen und ihre spezifischen dinge damit tun......

                      das problematischste ist wohl dass wenn b::f() -> a::f() aufruft und du das hier nicht möchtest. aber da fänd ichs durchaus sinvoll einen weitern boolschen parameter anzubieten der das verhindern könnte.....

                      gruß

                      Kommentar


                      • #12
                        PHP ist eine Sprache wie auch die andere, und wenn du meinst, dass es sich bei PHP um ein design fehler handelt, dann muss das auch ein designfehler für Java,C++ und C# sein (ist aber nicht der Fall).
                        get_parent_class kann nur als sting die name von dem parentclass anzeigen, biettet aber in keinem fall die funktionalität von dem parentclasse.

                        eben weil class->A nur standartisierte methoden (und vars) anbieten sollte. erweiterte klassen sollten diese dann nutzen und ihre spezifischen dinge damit tun......
                        sie sollen das nicht, sondern können das.
                        In jeder programmiersprache ist auch überschreibung von methoden in basis-classen mitbegriffen, als auch Möglichkeit mit Cast-operator die Methode von Basisclasse aufrufen.

                        Irgendjemand hat gesagt, dass Java keine mehrfache Vererbung braucht, die Andere meinen, dass Programmierung in PHP auch ohne Casting funktionieren kann. Beides ist richtig, aber die freiheit bei Programmierung ist dadurch geraubt worden.
                        niemand denkt daran, dass die Java Entwickler bei Java-Swing Bibliothek sich wirklich quellen müssten um durch Decorator-Patten und identische überschreiben von Interface immer das gleiche sch... mit (kopieren einfügen) machen müssten um der gleicher Funktionalität von Komponenten zu implementieren.

                        Wenn du die C++ Entwickler fragst 'was ein Decorator bedeutet?' werden sie dich fragen Wo soll die Dekoration gehängt werden?
                        Diese Problem existiert da einfach nicht und die interface werden fast nie benutzt, sondern direkt die abstracte Klassen geschrieben.

                        Kommentar


                        • #13
                          PHP ist einfach als prozedurale Programmiersprache geboren worden und wie bei Menschen kann man eben nichts angeborenes mal so eben umbiegen. Will sagen, OOP bei PHP ist nur aufgesetzt und nicht wirklich im Kern integriert und somit müssen wir uns eben mit weniger Funktionalitäten begnügen. Der Punkt ist nunmal schon für Stringverkettung reserviert, trotzdem ist -> für meinen Geschmack ein Zeichen zuviel.
                          Deinen Anwendungsfall Slava, mit Objekt-Casting, habe ich noch nie gebraucht aber dass irgendwer es irgendwann brauchen könnte ist klar, so ist das ja immer.
                          Vielleicht wird es ja ähnlich wie __toString() implementiert.
                          Schlag das dochmal in der Entwickler-Mailingliste vor ..

                          Zitat von robo47
                          So wird das beim Zendframework angewandt, nennt sich call chaining.
                          Ich arbeite gerade etwas mit Zend und hab es dort entdeckt. Zur Code-Formatierung ganz nett, aber um der Faulheit willen einer Funktion jetzt einen neuen Rückgabewert zuzuteilen finde ich schwachsinnig.

                          Kommentar


                          • #14
                            Schlag das dochmal in der Entwickler-Mailingliste vor ..
                            das ist schon für php6 vorgeschlagen wurde, aber leider von den PHP-Entwickler abgelehnt

                            Kommentar


                            • #15
                              Wurde das begründet?

                              Kommentar

                              Lädt...
                              X