[OOP] Beliebige Type Casts

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

  • [OOP] Beliebige Type Casts

    Hallo Problemlöser und Neugierige,

    Ich arbeite momentan an meiner Klasse Table, die ne vorarbeit und Basisklasse für spätere Sachen darstellt.
    Um euch einen kleinen Überblick zu verschaffen, hab ich hier mal das Klassendiagramm:



    mit diesem Teil kann man momentan folgendes machen:
    PHP-Code:
    $head = new Row(2);
    $head->getCell(0)->set("Spalte1");
    $head->getCell(1)->set("Spalte2");
    $table = new Table(2,$head);
    $table->getRow(0)->getCell(0)->set("Inhalt1");
    $table->getRow(0)->getCell(1)->set("Inhalt12");
    $table->getRow(1)->getCell(0)->set("Inhalt21");
    $table->getRow(1)->getCell(1)->set("Inhalt22");
    echo 
    $table
    was dann folgendes ergebnis liefert:
    Spalte1|Spalte2|
    -
    Inhalt1|Inhalt12|
    Inhalt21|Inhalt22|

    soweit so gut, aber ihr hab euch bestimmt schon gefragt
    "warum macht der kerl da ein interface RowData rein??!!"

    aus einem ganz einfachen grund:
    so wies jetz aufgebaut ist könnte ich mir ja ganz einfach per
    getRow ne Row schnappen und die um eine zelle mit addCell
    erweitern.
    Das darf aber nich möglich sein, nur addColumn darf die Rows in
    der Table um eine Zelle erweitern.
    Darum wollte ich ja auch mit getRow ein Objekt des Typs RowData
    zurückgeben damit man später nur noch ein Zelle auslesen oder
    verändern kann.

    In c# oder java wär das ja kein problem weil ich da einfach RowData
    casten würde.
    Ich hab schon gegoogelt und im forum steht zu "cast" fragen nichts
    konkretes drinne =(
    Gibt es da irgendwas, was ich übersehn hab oder funktioniert das in
    PHP nur mit einem workaround??

  • #2
    PHP-Code:
     class bla
    {
      public function 
    getRow(RowData $var)
      {
         
    // tuwas mit $var
      
    }

    Nur so kannst du in PHP Datentypen erzwingen..
    Alles andere ist "Handarbeit".
    Zuletzt geändert von combie; 10.10.2007, 21:56.
    Wir werden alle sterben

    Kommentar


    • #3
      kommt mir bekannt vor xD
      klappt nur leider nich weil anscheinend wieder impliziert auf row konvertiert =(

      PHP-Code:
      public function addRow(RowData $r=null){
              if(
      $r==null){
                  
      $this->addRow(new Row($this->getColumns()->getCount()));
              } elseif(
      $r instanceof RowData){
                  if(
      $r->getCount()==$this->getColumns()->getCount()){
                      
      $this->_rows[]=$r;
                  } else {
                      throw new 
      Exception("Row doesn't fit in table");
                  }
              } else {
                  throw new 
      Exception("Invalid type of parameter");
              }
              
          } 

      Kommentar


      • #4
        RowData $r=null
        Nein, Es gibt keine Null Objekte in PHP!
        Wir werden alle sterben

        Kommentar


        • #5
          OffTopic:
          hab ich auch nie behauptet
          jedoch kann $r den wert null annehmen...
          zudem kann ich nur sagen: works as designed
          wenn ich addRow() aufrufe wird ganz normal ne Row eingefügt

          edit: das null objekt als entwurfsmuster gibt es in php
          Zuletzt geändert von BugBite; 10.10.2007, 22:28.

          Kommentar


          • #6
            Original geschrieben von combie
            RowData $r=null
            Nein, Es gibt keine Null Objekte in PHP!
            Null ist kein Objekt, aber du kannst einem getypten Parameter null als Standardwert geben, so dass dieser Wert optional wird.

            Kommentar


            • #7
              edit: das null objekt als entwurfsmuster gibt es in php
              Rückwärsgang: Ja du darfst dein "NULL Objekt" so verwenden..

              PHP ist in dem Punkt leider etwas krank(finde ich)..
              Das Handbuch sagt:
              Type Hints can only be of the object and array (since PHP 5.1) type.
              Aus: http://www.php.net/manual/en/languag...ypehinting.php

              PHP-Code:
              class bli {}

              class 
              test
              {
                public function 
              blabli $var=NULL)
                {
                  echo 
              'hello bla ';
                }
                public function 
              blubli $var)
                {
                  echo 
              'hello blu ';
                }
              }
              $t = new test;
              $b = new bli;
              $t->bla(NULL); // funktioniert
              $t->blu(NULL); // wirft Fehler 
              Und dieser Code zeigt, dass NULL kein passendes Objekt ist.
              Aber machmal eben doch
              Warum einmal NULL verwendet werden darf und das andere Mal nicht, sehe ich nicht ein!
              (aber wieder was dazu gelernt)
              Zuletzt geändert von combie; 11.10.2007, 11:39.
              Wir werden alle sterben

              Kommentar


              • #8
                was mich aber bei PHP ein wenig ergert, dass es wirklich in vergleich zu den anderen sprachen nicht jeder casting funktioniert.
                ich finde das nicht gut, dass ich ein object nicht auf seine basisclasse kasten kann, was natürlich bei C#.Java, C++ problemlos funktioniert.
                PHP-Code:
                class t1 {
                  function 
                f1(){echo 't1';}
                }
                class 
                t2 extends t1{
                  function 
                f1(){echo 't2';}
                }

                 
                $t=new t2;

                //das wird bei php5.1 nicht funktionieren
                //ich kann hier nur auf Array, String oder Object casten, aber nicht auf die 
                //basisclasse
                 
                $a= (t1)$t
                warum das so ist, habe ich wirklich keine Erklärung.
                Slava
                bituniverse.com

                Kommentar


                • #9
                  Die Möglichkeit eigene Typecast zu definieren (neben __toString auch noch __toInt / __tot1) wurde für PHP 6 leider abgelehnt ...
                  Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                  Kommentar


                  • #10
                    PHP-Code:
                    class t1 {
                      function 
                    f1(){echo 't1';}
                    }
                    class 
                    t2 extends t1{
                      function 
                    f1(){echo 't2';}
                    }

                     
                    $t=new t2;

                    function 
                    test(t1 $var)
                    {
                      
                    $var->f1();
                    }
                    test($t); 
                    Mit dem Typehinting kann man auf Basisklassen und Interfaces testen, das soll reichen. Dass man "von aussen" nicht auf überschriebene Methoden der Basisklasse zugreifen kann, finde ich OK!
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      is ja schön das du das ok findest, jedoch find ich es ziemlich dämlich
                      in einer programmiersprache interfaces und vererbung anzubieten,
                      ohne dann die polymorphie vollständig zu unterstützen.
                      Und casting is da einfach ne essentielle komponente.

                      @ Slava
                      /signed

                      naja damit wäre ja dann meine frage diesbezüglich wohl beantwortet.
                      ich bedanke mich und werde einfach mein modell ein wenig abändern,
                      also anstatt einer get row eine fetchRow methode anbieten, die eine kopie der geforderten Row ausgibt, und weiterhin eine set(r,c) und get(r,c) methode zum lesen und setzen der werte meiner tabelle
                      verwenden

                      Kommentar


                      • #12
                        edit: doppelpost verfluchtes wackel wlan
                        Zuletzt geändert von BugBite; 11.10.2007, 17:44.

                        Kommentar


                        • #13
                          ohne dann die polymorphie vollständig zu unterstützen.
                          Das tun eigendlich nur ganz wenige Sprachen! z.B. C++ geht dort recht weit.
                          Selbst so moderne Sprachen wie Java machen das nicht.
                          Wir werden alle sterben

                          Kommentar


                          • #14
                            Hi combie
                            Java macht das garantiert.
                            Ob das C# macht, muss ich gleich testen, aber ich bin mir sicher, dass C# das auch wie java unterstützt.
                            nach dem testen sage ich wegen c# bescheid.
                            Slava
                            bituniverse.com

                            Kommentar


                            • #15
                              Ja, wie ich auch erwartet habe funktioniert casting auch in C#
                              PHP-Code:
                              public class test{
                                static 
                              void Main(string[] args){
                                
                              Class2 c=new Class2();
                              //hier kommt es zu ausgabe "Class1" da es gekastet wurde
                                
                              Console.Write(((Class1)c).t1());
                                
                              Console.Read();
                                }
                              }
                                  
                              public class 
                              Class1
                              {
                                public 
                              Class1(){}

                                public 
                              string t1(){    return "Class1";}
                              }

                              //vererben    
                              public class Class2 Class1
                              {
                                public 
                              Class2(){}
                                public 
                              string t1(){    return "Class2";}

                              Slava
                              bituniverse.com

                              Kommentar

                              Lädt...
                              X