php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.12.2004, 10:26  
Gast
 
Beiträge: n/a
Standard 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$name1);
    }

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

    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]
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.12.2004, 11:20  
Gast
 
Beiträge: n/a
Standard

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...
  Mit Zitat antworten
Alt 26.12.2004, 11:43  
Gast
 
Beiträge: n/a
Standard

Zitat:
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
  Mit Zitat antworten
Alt 26.12.2004, 11:51  
Gast
 
Beiträge: n/a
Standard

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
  Mit Zitat antworten
Alt 26.12.2004, 12:01  
Gast
 
Beiträge: n/a
Standard

Zitat:
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 ...
  Mit Zitat antworten
Alt 26.12.2004, 12:45  
Gast
 
Beiträge: n/a
Standard

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?
  Mit Zitat antworten
Alt 26.12.2004, 12:47  
Gast
 
Beiträge: n/a
Standard

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] => 
                )

......................
  Mit Zitat antworten
Alt 26.12.2004, 18:40  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 4.651
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

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.
mepeisen ist offline   Mit Zitat antworten
Alt 26.12.2004, 23:17  
Gast
 
Beiträge: n/a
Standard

Zitat:
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
  Mit Zitat antworten
Alt 27.12.2004, 02:20  
Gast
 
Beiträge: n/a
Standard

Zitat:
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.
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
von php4 zu php5 nixdorf Server, Hosting und Workstations 1 15.08.2007 16:57
php4 zu php5 -> aufwand farant PHP-Fortgeschrittene 7 13.04.2006 12:29
php5 braucht 4 mal so lange wie php4? CC84 PHP Tipps 2006 4 12.04.2006 09:55
php5 -> modul, php4 -> cgi flooooo Server, Hosting und Workstations 4 03.03.2006 19:34
Php4 vs php5 PHP-Fortgeschrittene 10 27.10.2005 00:38
php4 –Scripte laufen unter php5 nicht??! Klaus Server, Hosting und Workstations 1 22.10.2005 14:02
PHP4 vs PHP5 PHP-Fortgeschrittene 16 06.10.2005 11:58
php4 und php5 gleichzeitig test022 Server, Hosting und Workstations 13 24.08.2005 10:25
OOP -> PHP4 oder PHP5? WarrenFaith PHP Tipps 2005-2 4 09.08.2005 03:29
php4 und php5 auf einem indianer Server, Hosting und Workstations 2 22.05.2005 18:06
PHP4 / PHP5 || Xdebug + Debug-Client PHP Tipps 2005 2 09.05.2005 18:39
[Erledigt] Unterschiedliche Ergebnisse: PHP4 / PHP5 PHP-Fortgeschrittene 2 03.01.2005 00:45
PHP4 in PHP5 umwandeln PHP-Fortgeschrittene 1 20.12.2004 16:22
Probleme mit Apache2 und PHP5 nach Update von PHP4 Server, Hosting und Workstations 9 28.10.2004 16:01
[Erledigt] Unterschied zw. PHP4 und PHP5 PHP Tipps 2004 5 23.08.2004 08:42

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
kopieren handling, php5 menubox class, php5 $menu, php4 fremde objekte, php 4 objekt kopieren this

Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.