php, Funktionen, Klassen und Fehlersuche
bearbeitet von
Hallo Jörg,
so nicht:
~~~php
$i=1;
while ($i < 3) {
function Blablub()
{
}
}
~~~
~~~
<b>Fatal error</b>: Cannot redeclare Blablub() (previously declared in [...]
~~~
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. Das willst Du nicht. Du kaufst einmal ein Auto, und fährst munter einkaufen:
~~~php
$i=1;
while ($i < 3) {
Blablub($i);
$i++;
}
function Blablub($i)
{
// do sth with $i
}
~~~
Eine Funktion ist ein Stück Code mit einem Namen, das Du wiederverwendest. Deswegen wird sie nachher definiert (oder vorher). PHP ist das 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.
Das gilt auch für Klassen. Du kannst eine Klasse nur einmal definieren, danach ist der Name belegt und Du bekommst beim zweiten Versuch sowas wie
~~~
<b>Fatal error</b>: Cannot declare class Hugo, because the name is already in use
~~~
**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 global verfügbar (anders als in JavaScript, wo lokale Funktionen lokal bleiben):
~~~php
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