Rolf B: php, Funktionen, Klassen und Fehlersuche

Beitrag lesen

Hallo Jörg,

da hast Du Funktionen und Klassen vermutlich komplett mistverstanden.

So nicht:

$i=1;
while ($i < 3) {
    function Blablub()
    {
       class PDF_Dings
       {
       }
    }
}

Wenn der nicht käme:

<b>Fatal error</b>:  Cannot redeclare Blablub() (previously declared in [...]

Käme unweigerlich beim zweiten Aufruf von Blablub der hier:

<b>Fatal error</b>:  Cannot declare class PDF_Dings, because the name is already in use 

Wenn Du das nicht zu sehen bekommen hast, ist dein Error-Reporting nicht korrekt eingeschaltet.

Genau darauf bezog sich die Frage, ob Du Dir für jedes Einkaufen ein neues Auto kaufst. Bei Dir ist es noch schlimmer: Du baust jedesmal eine neue Straße (Blablub), um mit den neugekauften Auto (PDF_Dings) darauf einkaufen zu fahren

Das willst Du nicht. Du kaufst einmal ein Auto, du baust einmal eine Straße und fährst munter einkaufen:

$i=1;
while ($i < 3) {
   Blablub($i);
   $i++;
}

function Blablub($i)
{
   // do sth with $i
}

class PDF_Dings extends ...
{
}

Eine Funktion ist ein Stück Code mit einem Namen, das Du wiederverwendest. Eine Klasse ist ein Klumpen aus Variablen und Funktionen, die Du wiederverwendest. Deswegen wird beides separat definiert (am Anfang oder am Ende). PHP ist die Reihenfolge egal; du kannst Funktionen auch am Ende definieren, er findest sie trotzdem, weil er den Code zweimal durchliest. Zuerst um ihn in Bytecode zu compilieren, und dann, um ihn auszuführen.

Wenn PHP die Definition antrifft, wird das nur gespeichert, aber nicht ausgeführt. Die Ausführung erfolgt, wenn Du die Funktion aufrufst.

Das gilt auch für Klassen. Du kannst eine Klasse nur einmal definieren, danach ist der Name belegt.

ALLERDINGS gilt das nur, wenn Klasse oder Funktion auf dem Top-Level definiert werden. Du kannst eine Funktion oder Klasse auch irgendwo zwischen geschweiften Klammern definieren, dann entsteht sie erst, wenn diese Codestelle ausgeführt wird. Sie ist danach aber global verfügbar (anders als in JavaScript, wo lokale Funktionen lokal bleiben):

blablub(99);   // scheitert

MakeBlub();
blablub(1);    // funktioniert

function MakeBlub() 
{
   function blablub($n)
   {
      echo "Der Blub ist auf Stufe $n\n";
   }
}

Für dein Beispiel heißt das: Definiere die Funktion und die Klasse separat. Schachtele sie nicht ineinander. Du hast dann drei Bereiche:

  • Hauptprogramm
  • Funktion Blablub
  • Klasse PDF_Table_Header und ihre Methoden

Der Datenaustausch zwischen diesen Bereichen erfolgt rein über Parameter.

Du solltest die Session auch nicht in Blablub starten. Sowas tut man nur einmal zu Programmbeginn, oder man definiert einen Autostart für die Session.

Rolf

--
sumpsi - posui - obstruxi