OOP-Problem: Konstruktorersatz für PHP 4

Hi du,

also nachdem ich erstmal einen Host von mir finden musste der noch PHP4 drauf hat, hab ich es dann doch geschafft einen aufzutreiben. PHP 4.4.4 lief da drauf. Ich machte einige Tests, und ich muss dir leider gestehen das ich den Fehler in keinster Weise nachvollziehen konnte, ich poste einfach mal den Quelltext der 4 Dateien, die sozusagen meine "Testumgebung" waren.

index.php4:
PHP:
<?php

error_reporting(E_ALL);

require('require.php4');

class Klasse {
    
    function Klasse()
    {
        fetch_data(array('foo' => 'foo'), 'bar');
    }
}

$klasse = new Klasse();

?>

require.php4:
PHP:
<?php

require('./smarty.php4');
require('./php4functions.php4');

?>

PHP:
<?php

class Smarty {
    
    function assign($param1, $param2)
    {
        echo $param1 . $param2;
    }
}

$smarty = new Smarty();

?>

php4functions.php4:
PHP:
<?php

function fetch_data($data, $praefix='') {
    global $smarty;
    $row = $data;
    if($praefix != '') $praefix=  $praefix.'_';
    foreach(array_keys($data) as $name) {
        $smarty->assign("$praefix$name", "$row[$name]");
    }
}

?>

und es funktioniert alles, so wie man es erwarten würde, sowohl unter PHP 5 als auch unter PHP 4. Ich wüsste auch nicht, was an dem was du bislang gesagt hast falsch sein sollte. Wenn du nen var_dump auf die Parameter machst und der was anzeigt, dann muss er die Funktion wohl auch finden. Als letzte Instanz kann ich dir wohl nur anbieten, dass du mir mal den Code irgendwie zukommen lässt (also den gesamten), vielleicht finde ich da was, wenn ich es im gesamten Zusammenhang sehe.

Was jetzt noch als Fehlerquelle möglich ist, ist Smarty ... vielleicht verhaspelt sich Smarty irgendwie mit seinem Cache, seinem Kompilat oder gar mit PHP4? Oder ist deine PHP4-Version dran schuld? Schon mal eine andere PHP4-Version probiert? Gehen denn andere Funktionen? Mach doch mal eine Testfunktion die nur ihre eigenen Parameter ausgibt die auch da definiert wird, wo fetch_data definiert wird und ruf sie von deiner Klasse aus auf ... geht das? Geht mein oben genannter Code bei dir?

Zu guter Letzt stellt sich natürlich die Frage, ob es wirklich nötig ist noch PHP4-kompatibel zu sein. Mittlerweile ist die Adaptionsrate recht hoch und steigt weiter. Und rein von der Codequalität her bringt das einiges, man kann dann (für PHP-Verhältnisse) OOP richtig anwenden und muss keine Altlasten mehr mit rumschleppen.

So ... vielleicht fällt mir ja morgen mehr ein ;-)
 
hmmm du hast mich da auf was gebracht..... ich werd das morgen mal austesten... ich glaube es könnte an der Smartyvariable liegen....

In der Funktion die aufgerufen wierd, heist die nämlich $smarty, aber indem Modul also der Klasse heist sie $tpl. Mir ist Zwar ein Rätsel warum keine Fehlermeldung erscheint aber vieleicht ist das ja des Rätsels Lösung . Dein Dode hab ich gerad getestet... und läuft wie erwartet.... phpversion ist 4.4.1

Das die Templatevariablen nen unterschiedlichen Namen haben ist nur eine Zwischenlösung gewesen weil ich es langsam leit bin immer smarty (hat immerhin 3 Buchstaben mehr ^^) zu schreiben. php5 scheint damit ja kein prob zu haben .... bindet die funktion evtl anders ein als php4? hmmm....

Das werd ich gleich morgen früh zu Beginn testen und Bericht erstatten .... hoffe das ist der Fehler... :)

MfG
blueX
 
Naja, an dem Namen der Variable kann es meines Erachtens nicht liegen, da zum Einen die Variable $tpl ohnehin nur im Klassenkontext gilt und zum Anderen ja die Variable $smarty definiert ist im "normalen" Code. So dürfte mein Beispiel ja dann auch nicht funktionieren, da es da ja auch innerhalb der Klasse keine Variable $smarty gibt. Ich hab irgendwie die Vermutung das es daran liegt, dass PHP5 mittlerweile Variablen an sich anders übergibt, aber der Code müsste trotzdem klappen unter PHP 4. Sicher bin ich da momentan allerdings nicht (hab auch grad noch nicht den Kopf frei). Aber ob er $smarty kennt oder nicht, kannst du ja innerhalb der Funktion mit var_dump auf eben jene Variable sehen.

Du könntest natürlich $GLOBALS verwenden. Die andere, vielleicht sauberere OOP-Variante wäre das du dir entweder direkt eine Art "View"-Klasse machen, die diese Funktion implementiert. Quasi eine Erweiterung von Smarty ... dann ist diese Funktion auch direkt dort, wo man sie erwarten würde, eben in der Klasse die für die Darstellung zuständig ist.

Vielleicht hast du ja noch was rausgefunden, mal sehen
 
Hast recht liegt auch nich an der variablen. Aber ich gebs jetzt auf. Des sollte letzte Woche schon einsatzbereit sein... ^^
Der Server bekommt jetzt auch PHP5 und mySQL5. Hab da noch andere Sachen gefunden die in php4 Probleme bereiten werden..... Die user werden unter php4 nichmal die Module installieren können ..... werde ich also bei schreiben, dass des cms erst ab php5 nutzbar ist. :)

Aber ich danke Dir für deine Hilfe und Mühe. =)

Ich werd mir aber trotzdem nochmal php4 local installieren um zu gucken wo da des Prob sein soll ^^ Did will ich jetzt wissen ^^

MfG
blueX
 
Hi,

kein Problem, ist ja auch für mich interessant :-)

Wenn du das Problem dann doch mal finden solltest, wäre ich über eine Meldung sehr erfreut. Vielleicht fällt mir noch was ein, wenn der Kopf dafür wieder frei ist.

Aber wie ich schon schrieb: Lieber ein sauberer PHP5-only Code (es ist mittlerweile wirklich kein Problem mehr PHP5 bei den Hostern zu finden) als ein halbgarer PHP4/5-Mischcode ;)
 
Ja naja ich versuch immer es allen recht zu machen ^^ aber das geht hier wohl nich so ganz ^^ Werd es jetzt nur noch den php5 Nutzern recht machen ^^

Ja wenn ich das Prob finde sag ich bescheid.... muss jetzt die Tage erstmal die verlorene Zeit wieder aufarbeiten ^^
 
Zurück