Ankündigung

Einklappen
Keine Ankündigung bisher.

php4: kopiert objekte --- php5: korrektes handling [solved]

Einklappen

Neue Werbung 2019

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

  • php4: kopiert objekte --- php5: korrektes handling [solved]

    UPDATE 2: Ich wusste zu wenig über die tricks und probleme von php4 .... scroll down for resolving of this issue - THX

    UPDATE: es sieht ganz so aus, als ob php4 die datenstruktur objekt in objekt nicht unterstützt ... unter php5 funktioniert es problemlos --- kann mir jemand mit mehr erfahrung in solchen details dies bestätigen? merci im voraus!


    functions/menu.php:
    PHP-Code:
    <?

    class menuentry{

        var $name;
        var $short;
        var $linksSubmenu;
        var $isTitle;
        var $submenu;

        function menuentry($Tshort, $Tname, $TisTitle){
                $this->short = $Tshort;
                $this->name = $Tname;
                $this->linksSubmenu = 0;
                $this->isTitle = $TisTitle;
        }

            function addSubmenu($submenu){
                $this->submenu = $submenu;
                $this->linksSubmenu = 1;
            }

            function linksSubmenu(){
                return $this->linksSubmenu;
            }
    }

    class menu
    {
        var $entries;

        function addEntryT($short, $name){ // Titel
            $this->entries[count($this->entries)] = & new menuentry($short, $name, 1);
        }

        function addEntry($short, $name){ // normal
            $this->entries[count($this->entries)] = & new menuentry($short, $name, 0);
        }

        function getEntry($short){
            $liste = $this->entries;
            for($a = 0; $a < count($liste); $a++) {
                if($liste[$a]->short==$short){
                    return $liste[$a];
                }
            }
        }
    }


    function MenuAusgabe($menu, $baseurl){

    $alles=$menu->entries;

        for($i=0; $i<count($alles); $i++){

            if($alles[$i]->isTitle==1){ // TITEL
                echo "<div>".$alles[$i]->name."</div>\n";
            }
            elseif($alles[$i]->short==$_GET['show']){ // AKTIV
                echo "\t<a class='aktiv' href='".$baseurl."?show=".$alles[$i]->short."'>".
                    $alles[$i]->name."</a> \n";
                if($alles[$i]->linksSubmenu==1){ // SUBMENU EXISTIERT!
                    $submenu=$alles[$i]->submenu;
                    $hermitdendaten=$submenu->entries;
                    for($s=0; $s<count($hermitdendaten); $s++){
                        if($hermitdendaten[$s]->short==$_GET['subcat']){
                            echo "\t\t[url='".$baseurl."?show=".$alles[$i]->short."&subcat=".$hermitdendaten[$s]->short."']".$hermitdendaten[$s]->name."[/url] \n";
                        }else{
                            echo "\t\t[url='".$baseurl."?show=".$alles[$i]->short."&subcat=".$hermitdendaten[$s]->short."']".$hermitdendaten[$s]->name."[/url] \n";
                        }
                    }
                }
            }else{ // NICHT AKTIV
                echo "\t<a href='".$baseurl."?show=".$alles[$i]->short."'>".
                    $alles[$i]->name."</a> \n";
            }

        }

    }


    ?>
    menu in aktion:

    PHP-Code:


    <?

    /* alles für das menu ist unter functions/menu.php deklariert */

    define('FUNCTIONS_DIR', '/home/httpd/vhosts/calcutta-project.ch/httpdocs/functions/');
    require_once(FUNCTIONS_DIR.'menu.php');


    /* Build Menu: */
    $hauptmenu = new menu;

    $hauptmenu->addEntryT("titel1", "Calcutta Project Basel");
    $hauptmenu->addEntry("partner", "Partner");
    $hauptmenu->addEntry("sponsoren", "Sponsors");

    $hauptmenu->addEntryT("titel2", "NGO's");
    $hauptmenu->addEntry("ngosCH", "Switzerland");
        $Eintrag_ngosCH = $hauptmenu->getEntry("ngosCH");
            $ngosCH = new menu;
            $ngosCH->addEntry("umwelt", "Environnement");
            $ngosCH->addEntry("armut", "Poverty");
        $Eintrag_ngosCH->addSubmenu($ngosCH);
    $hauptmenu->addEntry("ngosE", "World");
        $Eintrag_ngosE = $hauptmenu->getEntry("ngosE");
            $ngosE = new menu;
            $ngosE->addEntry("umwelt", "Environnement");
            $ngosE->addEntry("armut", "Poverty");
        $Eintrag_ngosE->addSubmenu($ngosE);

    $hauptmenu->addEntryT("titel3", "India");
    $hauptmenu->addEntry("calcutta", "Calcutta");
    $hauptmenu->addEntry("india", "General");

    /*
    echo "<pre>";
    echo print_r($hauptmenu);
    echo "</pre>";
    */

    /* WRITE MENU */
    echo "<div class='sideBox LHS'>";

    MenuAusgabe($hauptmenu, "/pub/links.en.php");

    echo "</div>";

    ?>
    dieser code funktioniert unter php5 problemlos und generiert das menu mit submenu

    der server, auf dem dieser code definitiv laufen sollte, benutzt php4 ... der code liefert keine fehler, warnungen oder irgendetwas komisches ... das submenu wird aber nicht in das hauptmenu gebunden:

    Code:
        $Eintrag_ngosE = $hauptmenu->getEntry("ngosE");
            $ngosE = new menu;
            $ngosE->addEntry("umwelt", "Environnement");
            $ngosE->addEntry("armut", "Poverty");
        $Eintrag_ngosE->addSubmenu($ngosE);
    tut nicht das, was es soll ... wieso, weiss ich jedoch auch nicht, da alles nicht php5 spezifisch ist

    bin für jede hilfe dankbar

    grüesslis - dp

    [edit by waq]bunt is hübscher[/edit]

  • #2
    mach mal am anfang vom script:

    error_reporting(E_ALL);


    ich glaube nämlich niemand hier hat lust ein script durchzuarbeiten, zu dem du keine meldung äusern kannst...

    Kommentar


    • #3
      Zitat von Snake
      mach mal am anfang vom script:

      error_reporting(E_ALL);


      ich glaube nämlich niemand hier hat lust ein script durchzuarbeiten, zu dem du keine meldung äusern kannst...
      merci für die schnelle antwort

      ich bin auf E_ALL ... aber eben: php4 sagt nichts (ich brauche ja keine php4-fremden funktionen oder variablen ... daher auch meine verwunderung wegen dem nicht-funktionieren)

      meine vermutung ist, dass entweder

      Code:
          function getEntry($short){ 
              $liste = $this->entries; 
              for($a = 0; $a < count($liste); $a++) { 
                  if($liste[$a]->short==$short){ 
                      return $liste[$a]; 
                  } 
              } 
          }
      nie ein return zurückgibt ($array[$nr]->etwas==etwas ist doch php4-zulässig, oder? (!!!)) ... und mir darum das submenu immer leer ist (komisch wäre aber dann die tatsache, dass in php5 dies nicht schief läuft)

      ... oder aber (eher!):

      Code:
      $hauptmenu->addEntry("ngosCH", "Switzerland"); 
          $Eintrag_ngosCH = $hauptmenu->getEntry("ngosCH"); 
              $ngosCH = new menu; 
              $ngosCH->addEntry("umwelt", "Environnement"); 
              $ngosCH->addEntry("armut", "Poverty"); 
          $Eintrag_ngosCH->addSubmenu($ngosCH);
      bzw.
      Code:
              function addSubmenu($submenu){ 
                  $this->submenu = $submenu;
      ist nicht möglich in php4 (ich verlinke hiermit ein objekt in ein anderes ... habe dies aber nie unter php4 gemacht und weiss darum nicht, ob es da evt. probleme gibt) [php5 ist ja neu viel korrekter in OO-programmierung]

      vielleicht noch einmal zur erklärung: print_r() liefert bei php4 nur das hauptmenu (die separaten submenus sind nicht teil des hauptmenus) ... php5 bindet mittels addSubmenu() die submenus in das hauptmenu (und es funktioniert alles wie es soll)

      bin offen für irgendwelche tipps/hilfe

      Kommentar


      • #4
        Da wirst du entweder jede Menge echo's einbauen oder einen Debugger benutzen müssen. Ansonsten dürfte es schwer werden, den Fehler zu finden. Die Funktion getEntry ist außerdem schlecht programmiert worden. Entweder man bekommt einen Wert oder zumindest false von der Funktion, damit man das Ergebnis prüfen kann.

        Gruß
        phpfan

        Kommentar


        • #5
          Zitat von phpfan
          Da wirst du entweder jede Menge echo's einbauen oder einen Debugger benutzen müssen. Ansonsten dürfte es schwer werden, den Fehler zu finden. Die Funktion getEntry ist außerdem schlecht programmiert worden. Entweder man bekommt einen Wert oder zumindest false von der Funktion, damit man das Ergebnis prüfen kann.

          Gruß
          phpfan
          stimmt ... ich werde mal getEntry umbauen und ein paar echos einbauen, um zu sehen, was nicht läuft

          stay tuned ...

          Kommentar


          • #6
            getEntry habe ich mit false versehen ... aber an dem liegt es nicht

            ok ... ich hab nun statt
            PHP-Code:
            <?
            $hauptmenu->addEntry("ngosCH", "Switzerland"); 
                 $Eintrag_ngosCH = $hauptmenu->getEntry("ngosCH"); 
                     $ngosCH = new menu; 
                     $ngosCH->addEntry("umwelt", "Environnement"); 
                     $ngosCH->addEntry("armut", "Poverty"); 
                 $Eintrag_ngosCH->addSubmenu($ngosCH); 
            ?>
            probiert, von hand die gleiche datenstruktur zu erstellen:
            PHP-Code:
            <?
            $hauptmenu->addEntry("ngosCH", "Switzerland");
                $Eintrag_ngosCH = $hauptmenu->getEntry("ngosCH");
                $Eintrag_ngosCH->linksSubmenu = 1;
                $Eintrag_ngosCH->submenu = new menu;
                $ngosCH = $Eintrag_ngosCH->submenu;
                $ngosCH->addEntry("umwelt", "Environnement");
                $ngosCH->addEntry("armut", "Poverty");
            ?>
            ... mit dem resultat, dass es unter php5 funktioniert unt unter php4 nicht!

            ==> kann es sein, dass php4 eine objekt in objekt struktur nicht erlaubt?

            Kommentar


            • #7
              die datenstruktur sieht in print_r_pre() folgendermassen aus: (php5)
              Code:
              menu Object
              (
                  [entries] => Array
                      (
              
              ......................
              
                          [4] => menuentry Object
                              (
                                  [name] => Switzerland
                                  [short] => ngosCH
                                  [linksSubmenu] => 1
                                  [isTitle] => 0
                                  [submenu] => menu Object
                                      (
                                          [entries] => Array
                                              (
                                                  [0] => menuentry Object
                                                      (
                                                          [name] => Environnement
                                                          [short] => umwelt
                                                          [linksSubmenu] => 0
                                                          [isTitle] => 0
                                                          [submenu] => 
                                                      )
              
                                                  [1] => menuentry Object
                                                      (
                                                          [name] => Poverty
                                                          [short] => armut
                                                          [linksSubmenu] => 0
                                                          [isTitle] => 0
                                                          [submenu] => 
                                                      )
              
                                              )
              
                                      )
              
                              )
              
              ......................
              und unter php4 habe ich nur:

              Code:
              menu Object
              (
                  [entries] => Array
                      (
              ......................
                          [4] => menuentry Object
                              (
                                  [name] => Switzerland
                                  [short] => ngosCH
                                  [linksSubmenu] => 0
                                  [isTitle] => 0
                                  [submenu] => 
                              )
              
              ......................

              Kommentar


              • #8
                Eine Methode, die ein Objekt zurückgibt, sollte in PHP4 immer einen Zeiger auf dieses Objekt zurückgeben. Also etwa so:

                Code:
                    function getEntry($short){ 
                        $liste = $this->entries; 
                        for($a = 0; $a < count($liste); $a++) { 
                            if($liste[$a]->short==$short){
                                $result = & $liste[$a]; 
                                return $result; 
                            } 
                        } 
                    }
                Eventuell musst du das noch an weiteren Stellen einbauen. Erst ab PHP5 werden Objekte als Handles verarbeitet, in PHP4 werden sie immer kopiert. Beim Hinzufügen von Submenüs arbeitest du also in einer Kopie deines Hauptmenüs und nicht im Hauptmenü selber.
                [url]www.php-maven.org[/url] PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
                Twitter @ [url]https://twitter.com/#!/mepeisen[/url] und Facebook @ [url]http://t.co/DZnKSUih[/url]

                Kommentar


                • #9
                  Zitat von mepeisen
                  Eine Methode, die ein Objekt zurückgibt, sollte in PHP4 immer einen Zeiger auf dieses Objekt zurückgeben. Also etwa so:

                  Code:
                      function getEntry($short){ 
                          $liste = $this->entries; 
                          for($a = 0; $a < count($liste); $a++) { 
                              if($liste[$a]->short==$short){
                                  $result = & $liste[$a]; 
                                  return $result; 
                              } 
                          } 
                      }
                  Eventuell musst du das noch an weiteren Stellen einbauen. Erst ab PHP5 werden Objekte als Handles verarbeitet, in PHP4 werden sie immer kopiert. Beim Hinzufügen von Submenüs arbeitest du also in einer Kopie deines Hauptmenüs und nicht im Hauptmenü selber.
                  das wusste ich nicht (mein background ist java, python, ...) --- vielen dank! finally! das chaos löst sich auf! ... leider habe ich aber auch mit dem linking kein grossen erfolg (getEntry gibt immer eine kopie des eintrags zurück und nicht den link des hauptmenus)

                  ... ich habe entschieden, den code so umzuschreiben, dass ein getEntryNr() nur die addresse zurückgibt und dann mit dieser weiter gemacht wird. wenn der webserver dann auf php5 geht, werde ich den alten code wieder einsetzen.

                  /me wonders, wie die leute überhaupt echte OO-apps in php4 schreiben

                  THX + grüesslis

                  dp

                  Kommentar


                  • #10
                    me wonders, wie die leute überhaupt echte OO-apps in php4 schreiben
                    Mich auch. Ich bin faul und verwende Klassen, um mir überflüssige Arbeit zu sparen, und nicht deshalb, weil OOP modern ist.

                    Kommentar


                    • #11
                      Zitat von dp
                      /me wonders, wie die leute überhaupt echte OO-apps in php4 schreiben
                      Also so ganz echtes OOP sollte man in PHP sowieso eher vermeiden, aber so halbes geht auch in PHP 4 ganz gut, wenn man Objekte explizit als Referenz übergibt.

                      $nocopy =& $obj;
                      mod = master of disaster

                      Kommentar

                      Lädt...
                      X