Ankündigung

Einklappen
Keine Ankündigung bisher.

Verkettete Methodenaufrufe

Einklappen

Neue Werbung 2019

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

  • Verkettete Methodenaufrufe

    Code:
    class a
    	{
    	 public function get_huhu()
    	  {return "huhu
    \n";}
    	}
    
    class b
    	{
    	 private $my_a=null;
    	 public function __construct()
    	  {$this->my_a=new a();}
    	 public function get_a()
    	  {return $this->my_a;}
    	}
    
    $test=new b();
    
    // Ist dieser Aufruf mit allen PHP-Versionen > 5 kompatibel?
    // Mir ist so, als hätte ich gelesen, dass dies nicht immer funktioniert.
    // Bei mir, php5.0.3, gibt es dabei keine Probleme.
    echo 'variante 1: ', $test->get_a()->get_huhu();
    
    // Oder sollte man generell lieber soetwas verwenden?
    $tmp=$test->get_a();
    echo 'variante 2: ', $tmp->get_huhu();

  • #2
    Re: Verkettete Methodenaufrufe

    Zitat von YaB
    Code:
    // Ist dieser Aufruf mit allen PHP-Versionen > 5 kompatibel?
    Diese Versionen sind bei mir noch etwas rar... :wink:


    Wenn Du die Vorgängerversionen meinen solltest: Nein!

    Wobei Deine Klassen selber aber auch alles andere als abwärtskompatibel sind.

    Kommentar


    • #3
      es sollte schon immer funktionieren.

      es kommt eigentlich immer darauf an, wie wohl du dich dabei fühlst, so
      PHP-Code:
      <?php
      echo $a -> b() -> c() -> d();
      ?>
      zu programmieren.

      es spricht nichts dagegen, das so zu machen, aber der editieraufwand beim debuggen ist extrem.
      nimm nur mal an, irgendeine methode (b(), c() oder d()) enthält einen bug und du bekommst einen fatal error beim ausführen des genannten codes...
      um nachzugucken, was buggy ist, müsstest du aus
      PHP-Code:
      <?php
      echo $a -> b() -> c() -> d();
      ?>
      folgendes machen:

      PHP-Code:
      <?php
      $b 
      $a -> b();
      var_dump($b);
      $c $b -> c();
      var_dump($c);
      $d $c -> d();
      var_dump($d);
      echo 
      $d;
      ?>
      ... ein extremer editieraufwand, den du nicht ganz so gehabt hättest, wenn du gleich variablen deklariert hättest.

      den selben editieraufwand hast du auch, wenn sich das ganze
      später ändert und du irgendwo bedingungen oder
      fehlerbehandlungen einfügen musst.
      allerdings finde ich die erste methode deutlich schöner, und in
      maßen angewendet ist das ganze auch lesbarer.
      das deklarieren von variablen, die nur ein einziges mal benutzt
      werden, ist auch kacke und macht code hässlich.

      man muss sich halt darauf verlassen, dass die benutzten
      methoden alle zuverlässig arbeiten.

      Kommentar


      • #4
        Zitat von axo
        nimm nur mal an, irgendeine methode (b(), c() oder d()) enthält einen bug und du bekommst einen fatal error beim ausführen des genannten codes...
        Nimm nur mal an es kommt gar nicht erst so weit...

        Kommentar


        • #5
          Zitat von karl-150
          Nimm nur mal an es kommt gar nicht erst so weit...
          das hab ich schon lang aufgegeben. murphy's law sagt, es kommt mindestens ein mal so weit.

          Kommentar


          • #6
            Zitat von axo
            es sollte schon immer funktionieren.

            es kommt eigentlich immer darauf an, wie wohl du dich dabei fühlst, so
            PHP-Code:
            <?php
            echo $a -> b() -> c() -> d();
            ?>
            zu programmieren.
            eigentlich ganz gut, mir gefällt diese syntax, so wie dir

            Zitat von axo
            es spricht nichts dagegen, das so zu machen, aber der editieraufwand beim debuggen ist extrem.
            nimm nur mal an, irgendeine methode (b(), c() oder d()) enthält einen bug und du bekommst einen fatal error beim ausführen des genannten codes...
            joh, hab ich auch schon leidig feststellen müssen (Fatal error: Call to a member function assign() on a non-object ) und man fragt sich, warum ist das kein objekt?
            darum lasse ich mir zur zeit alle fehler "ausprinten", aber ich denke man kommt bei größeren projekten nicht um eine vernünftige exception-handling bzw. error-klasse herum.

            ++++++++++++++++++++++++++++++++++++++++++++++
            karl-150 hat Folgendes geschrieben:
            Nimm nur mal an es kommt gar nicht erst so weit...

            axo hat daraufhin folgendes geschrieben:
            das hab ich schon lang aufgegeben. murphy's law sagt, es kommt mindestens ein mal so weit.
            ++++++++++++++++++++++++++++++++++++++++++++++

            ich denke, karl-150 meint damit, dass kein fatal error geschmissen wird und man sich daraufhin einen wolf sucht, weil das script gant anders "arbeitet" als erwartet

            Kommentar


            • #7
              Zitat von YaB
              ich denke, karl-150 meint damit, dass kein fatal error geschmissen wird und man sich daraufhin einen wolf sucht, weil das script gant anders "arbeitet" als erwartet
              hmm... kann wirklich gut sein, dass ich karl auch nicht verstanden habe, aber dich verstehe ich jetzt genausowenig ... wenn ein skript ganz anders 'arbeitet' als erwartet erfüllt es einfach nicht seine spezifikation, ganz egal ob man die methodenaufrufe direkt verkettet oder über variablen ???

              Kommentar


              • #8
                Zitat von axo
                ... wenn ein skript ganz anders 'arbeitet' als erwartet erfüllt es einfach nicht seine spezifikation, ganz egal ob man die methodenaufrufe direkt verkettet oder über variablen ???
                hm, hast ja recht - der aufruf ist dabei völlig egal.
                ich hatte mich nur gerade über das ungewollte typecasting von php rumgeärgert - sollte die kiste jetzt ausschalten.

                ich zitiere dich mal: "Problem Appears Between Keyboard And Chair"

                Kommentar


                • #9
                  (Auch) aus diesem Grund wurden Exceptions eingeführt.

                  PHP-Code:
                  <?php
                  class foo
                  {
                      public function 
                  a() {
                          throw new 
                  LogicException('A strange game. The only winning move is not to play.');
                      }
                  }

                  try {
                      
                  $f = new foo;
                      
                  $f->a()->b();
                  }
                  catch (
                  Exception $e) {
                     echo 
                  'Caught exception: ',  $e->getMessage(), "\n"
                         
                  $e->getTraceAsString(), "\n";
                  }
                  ?>

                  Kommentar

                  Lädt...
                  X