D.R.: OOP-Probleme

Hallo,

ich habe am Freitag eine „kleine“ PHP-Seite hochgeladen und musste mit Erschrecken feststellen, dass diese dort nicht funktioniert. Fehlermeldung:

Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /usr/export/www[…]Die_Seite.php on line 279

Eine genaue Analyse des Problems ergab, dass es an Konstrukten wie…

$ul->addElement("li")->addText("List item 1");

…lag. Komischer Weise trat dieses Problem auf meinem WAMP-System (auf welchem ich immer getestet habe) nicht auf. Es gab aber ein ähnliches Problem: Wenn eine Funktion ein Array zurückliefert, kann man dieses nicht direkt verwenden.

So bekomme ich bei folgendem Konstrukt

  
function makeArray(){  
 return array("a","b","c");  
}  
echo makeArray()[1];  

auch auf meinem WAMP-System eine Fehlermeldung:

Parse error: syntax error, unexpected '[', expecting ',' or ';' in X:[…].php on line 6

Wenn man das Ergebnis dagegen erstmal in einer Variablen speichert:

  
function makeArray(){  
 return array("a","b","c");  
}  
$x = makeArray();  
echo $x[1];  

…tritt dieses Problem nicht auf. Gleiches gilt für das, was ich oben geschildert habe.

Kann mir jemand dieses Phänomen erklären? Muss ich jetzt jedes erzeugte Objekt erst in eine Variable speichern oder gibt es einfachere Alternativen?

mfg. Daniel

  1. Moin,

    Kann mir jemand dieses Phänomen erklären? Muss ich jetzt jedes erzeugte Objekt erst in eine Variable speichern oder gibt es einfachere Alternativen?

    auf die Schnelle fällt mir dazu nur ein: PHP-Versionen auf deinem Test-System und auf dem Server ist die gleiche?

    Zweite Idee wäre eine Einstellung in der PHP.ini.

    Gruß

    Stareagle

    1. Hallo,

      auf die Schnelle fällt mir dazu nur ein: PHP-Versionen auf deinem Test-System und auf dem Server ist die gleiche?

      Hab's gerade verglichen. Ich habe PHP 5.1.2 und Funpic PHP 4.4.7.

      mfg. Daniel

      1. Moin!

        auf die Schnelle fällt mir dazu nur ein: PHP-Versionen auf deinem Test-System und auf dem Server ist die gleiche?

        Hab's gerade verglichen. Ich habe PHP 5.1.2 und Funpic PHP 4.4.7.

        Wow, die sind ihrer Zeit voraus. Auf php.net ist nämlich erst 4.4.6 veröffentlicht - und das ist eigentlich die Originalquelle.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Hallo,

          Hab's gerade verglichen. Ich habe PHP 5.1.2 und Funpic PHP 4.4.7.

          Wow, die sind ihrer Zeit voraus. Auf php.net ist nämlich erst 4.4.6 veröffentlicht - und das ist eigentlich die Originalquelle.

          Bitte leere deinen Cache und schau' noch mal auf diese Seite ;-)

          mfg. Daniel

          1. Moin!

            Hab's gerade verglichen. Ich habe PHP 5.1.2 und Funpic PHP 4.4.7.

            Wow, die sind ihrer Zeit voraus. Auf php.net ist nämlich erst 4.4.6 veröffentlicht - und das ist eigentlich die Originalquelle.

            Bitte leere deinen Cache und schau' noch mal auf diese Seite ;-)

            Sorry, an der maximalen 4er-Version ändert sich bei mir nichts. 4.4.6 vom 1. März.

            Zumal diese Seite keine besonderen Caching-Header sendet, und somit sehr leicht neu vom Server gezogen werden kann.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hallo,

              Wow, die sind ihrer Zeit voraus. Auf php.net ist nämlich erst 4.4.6 veröffentlicht - und das ist eigentlich die Originalquelle.

              Bitte leere deinen Cache und schau' noch mal auf diese Seite ;-)

              Sorry, an der maximalen 4er-Version ändert sich bei mir nichts. 4.4.6 vom 1. März.

              Hm, willst du auf etwas anderes hinaus (ist die 5-er vielleicht eine beta?) oder du siehst wirklich nicht die <h1> mit dem Inhalt „PHP 5.2.1“, direkt unter der Navigationsleiste?

              mfg. Daniel

              1. Moin!

                Wow, die sind ihrer Zeit voraus. Auf php.net ist nämlich erst 4.4.6 veröffentlicht - und das ist eigentlich die Originalquelle.

                Bitte leere deinen Cache und schau' noch mal auf diese Seite ;-)

                Sorry, an der maximalen 4er-Version ändert sich bei mir nichts. 4.4.6 vom 1. März.

                Hm, willst du auf etwas anderes hinaus (ist die 5-er vielleicht eine beta?) oder du siehst wirklich nicht die <h1> mit dem Inhalt „PHP 5.2.1“, direkt unter der Navigationsleiste?

                Doch, aber das ist die 5er-Serie. Du behauptest aber, bei Funpic wäre Version 4.4.7 installiert. Und die gibts noch nicht bei php.net.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. Hallo,

                  Hm, willst du auf etwas anderes hinaus (ist die 5-er vielleicht eine beta?) oder du siehst wirklich nicht die <h1> mit dem Inhalt „PHP 5.2.1“, direkt unter der Navigationsleiste?

                  Doch, aber das ist die 5er-Serie. Du behauptest aber, bei Funpic wäre Version 4.4.7 installiert. Und die gibts noch nicht bei php.net.

                  Ach so meintest du das. Ja, da steht wirklich PHP 4.47. Scheinbar eine spezial-Version.

                  mfg. Daniel

  2. echo $begrüßung;

    Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /usr/export/www[…]Die_Seite.php on line 279
    $ul->addElement("li")->addText("List item 1");

    Diese Syntax funktioniert ab PHP5. Unter PHP4 gibt es diese Meldung, weil da das Funktionsergebnis nicht direkt weiterverkettet werden kann. Du brauchst da jeweils eine Variable zur Zwischenspeicherung.

    Wenn eine Funktion ein Array zurückliefert, kann man dieses nicht direkt verwenden.
    echo makeArray()[1];

    Dieses Konstrukt geht auch unter PHP5 nicht.

    Kann mir jemand dieses Phänomen erklären? Muss ich jetzt jedes erzeugte Objekt erst in eine Variable speichern oder gibt es einfachere Alternativen?

    Diese Syntax ist einfach nicht vorgesehen. Eine Zwischenspeichervariable ist die einzige mir bekannte Möglichkeit.

    echo "$verabschiedung $name";

    1. Hallo,

      Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /usr/export/www[…]Die_Seite.php on line 279
      $ul->addElement("li")->addText("List item 1");

      Diese Syntax funktioniert ab PHP5. Unter PHP4 gibt es diese Meldung, weil da das Funktionsergebnis nicht direkt weiterverkettet werden kann.

      Ach so. Dann sollte ich wohl am Besten mal die Leute von Funpic fragen, ob sie nicht mal ein Update machen können.

      Wenn eine Funktion ein Array zurückliefert, kann man dieses nicht direkt verwenden.
      echo makeArray()[1];

      Dieses Konstrukt geht auch unter PHP5 nicht.

      Warum eigentlich nicht? Ich finde das irgendwie unlogisch. Aber egal - dieses Problem hatte ich gelöst, indem die betroffene Funktion kein Array, sondern ein weiteres Objekt zurückliefert, welches das Array enthält.

      Kann mir jemand dieses Phänomen erklären? Muss ich jetzt jedes erzeugte Objekt erst in eine Variable speichern oder gibt es einfachere Alternativen?

      Diese Syntax ist einfach nicht vorgesehen.

      Ich verstehe nicht, warum PHP so unflexibel ist. Während man in JS so ziemlich alles irgendwie zusammenbasteln kann, führt das in PHP ziemlich schnell zu einem parse-Error…

      mfg. Daniel

      1. echo $begrüßung;

        Warum eigentlich nicht? Ich finde das irgendwie unlogisch. Aber egal - dieses Problem hatte ich gelöst, indem die betroffene Funktion kein Array, sondern ein weiteres Objekt zurückliefert, welches das Array enthält.

        Es ist kein Problem, ein Array zurückzugeben, nur darfst du nicht im selben Atemzug auf seine Elemente zugreifen. Wenn du nur das eine Element haben willst, dann gib doch gleich nur dieses zurück. Wenn du alle haben willst, musst du das komplette Array erst in einer Variable ablegen, bevor du auf die Elemente zugreifen kannst.

        echo "$verabschiedung $name";

        1. Hallo,

          Warum eigentlich nicht? Ich finde das irgendwie unlogisch. Aber egal - dieses Problem hatte ich gelöst, indem die betroffene Funktion kein Array, sondern ein weiteres Objekt zurückliefert, welches das Array enthält.

          Es ist kein Problem, ein Array zurückzugeben, nur darfst du nicht im selben Atemzug auf seine Elemente zugreifen.

          Ja, aber es ist doch unpraktisch, wenn man z.B. per getElementsByTagName() nur mal schnell auf ein Element zugreifen will.

          Naja, das Problem hatte ich dann eben so gelöst:

            
          class HTMLElementArray{  
           var resArray;  
           function item($Nummer){  
            return resArray[$Nummer];  
           }  
          }  
            
          function getElementsByTagName(){  
           //Elemente suchen und in $result speichern  
           $retObj = new HTMLElementArray;  
           $retObj->resArray = $result;  
           return $resObj;  
          }  
            
          //z.B.  
          $document->getElementsByTagName("div")->item(0)->

          Damit konnte ich dann per item(Nummer) statt [Nummer] in einem Befehl auf die Rückgabe zugreifen.

          Wenn du nur das eine Element haben willst, dann gib doch gleich nur dieses zurück. Wenn du alle haben willst, musst du das komplette Array erst in einer Variable ablegen, bevor du auf die Elemente zugreifen kannst.

          Stimmt auch wieder. Das wäre zumindest einen optionalen Parameter wert.

          Aber wie dem auch sei - dieses Problem habe ich ja mehr oder weniger gelöst. Schwieriger dürfte die andere Sache zu umgehen sein.

          mfg. Daniel

          1. Hello,

            Ja, aber es ist doch unpraktisch, wenn man z.B. per getElementsByTagName() nur mal schnell auf ein Element zugreifen will.

            Es ist grundsätzlich sogar praktisch, dass das nicht funktioniert.
            Ein Array ist eine komplexe Datenstruktur.
            Um auf ein Element der Datenstruktur in der von Dir gewünschten Art zugreifen zu können, muss diese erst einmal erzeugt werden. Das kostet Ticks. Danach würde sie verworfen werden, da ja nur das eine Element gewünscht wurde.
            Nun ist es aber meistens so, dass schon im nächsten Moment noch ein Element der Struktur benötigt wird. Dann muss sie also wieder erzeugt werden, das Element ausgeliefert werden und die Struktur wird wieder beseitigt (vom Stack).
            Und dann das ganze nochmal... Z.B. bei der Bildbearbeitung benötigt man immer mehrere Elemente aus einem solchen Ergebnisarray.

            Außer, dass es erhebliche Rechenzeit kostet, liegt noch eine weitere Gefahr darin versteckt.
            Arrays als Rückgabewerte geben meistens korrespondierende Daten zurück, also solche, für die der Zeitpunkt der Erhebung entscheidend ist, damit sie zusammengehören.
            Da Webprogramme meistens in einer Konkurrenzumgebung ablaufen, könnte die Integrität der Daten gefährdet sein.

            Angenommen, Du hast Dir ein Loginsystem gebaut, und holst nun auf Deine Weise Benutzerdaten ab, dann könnte es passiven, dass durch einen anderen Zugriff in der Zwischenzeit Deiner Zugriffe eine oder mehrere Änderungen am Datenbestand stattgefunden haben. Der Inhalt Deines ersten Feldes würde also gar nicht mehr zum Inhalt im zweiten Feld passen.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Hallo,

              Ja, aber es ist doch unpraktisch, wenn man z.B. per getElementsByTagName() nur mal schnell auf ein Element zugreifen will.

              Es ist grundsätzlich sogar praktisch, dass das nicht funktioniert.

              Warum soll das praktisch sein? Je mehr funktioniert, desto besser, würde ich mal sagen…

              Ein Array ist eine komplexe Datenstruktur.

              Ähm, nein. Die betroffenen Array sind nicht mehr, als eine kleine Sammlung von Elementen.

              Nun ist es aber meistens so, dass schon im nächsten Moment noch ein Element der Struktur benötigt wird. Dann muss sie also wieder erzeugt werden

              Den Fall hatte ich bisher ziemlich selten. Sollte dem aber doch so sein, speichere ich des Array auch erstmal in eine Variable.

              mfg. Daniel