OOP-Problem: Konstruktorersatz für PHP 4

bluex

Erfahrenes Mitglied
Hi

Ich habe ein Problem Mit einer Klasse.

In der Klasse wird ein konsturkor verwendet der zum Beispielt die Template-Klasse läd.

Allerdings habe ich bei der erstellung nich daran gedacht das es ja auch noch Server gibt die noch kein php5 haben. :suspekt:

Wie kann ich es bewerkstelligen auch unter php4 bei jedem aufruf der Klasse so etwas wie einen Konstruktor zu haben der mir die ganzen sachen ind die Variablen schreibt ?

Hier mal der bisherige Code:

PHP:
class modul {		
	var $Location;	
	var $vn;	
	var $tpl_intern = '../../../templates/';									
	var $modul_path;
	var $tpl;
	function __construct($tpl,$modul,$vn,$acp='') {								
		$this->tpl = $tpl;
		if($acp == '1') {		
			$this->tpl->template_dir = './module/'.$modul.'/templates/';	
			$this->modul_path = './module/'.$modul.'/';				
		}		
		else {	
			$this->tpl->template_dir = './acp/module/'.$modul.'/templates/';		
			$this->modul_path = './acp/module/'.$modul.'/';						
		}	
		$this->vn = $vn;
	}	
......


MfG
blueX
 
der Konstruktor in PHP4 ist eine Methode die so heißt wie die Klasse, in deinem Fall reicht also ein einfaches Alias auf __construct. PHP5 ruft diese Methode nicht automatisch auf, sondern nutzt __construct, so denn vorhanden. Wenn __construct nicht vorhanden ist, ruft es auch eben jene Methode auf, sollte aber in deinem Fall nicht greifen.

PHP:
<?php

class Klasse {
    
    // Konstruktor für PHP4
    public function Klasse()
    {
        $this->__construct();
    }
}
?>

zur Veranschaulichung
 
ach ja ^^ gut war mir nicht so sicher ob des in php5 nur eine auswahlmögöichkeit is oder noch aus php4 zeiten stammte. gut =) jetzt scheint es zu gehen . =) danke für die schnelle hilfe
 
Nun habe ich aber auch schon das nächste Problem unter php4.

Unter php5 kann ich in den Methoden der Klasse auch auf die Funktionen zugreifen die in der Datei definiert wurden die auch die Klassen instanziert..... in php4 scheint das allerdings nicht zu gehen. Jetzt wollte ich die functions.php direkt mit require() in der Klasse einbinden..... das scheint aber wohl auch nicht möglich zu sein , jedenfalls bekomm ich immer Fehlermeldungen .... Muss ich jetzt alle Functionen die ich aus der funktions.php in der Klasse brauche nun einzeln als Methoden direkt in die Klasse schreiben das wäre sehr unkofortabel :suspekt:

Hab in meinem php4 leider nichts zu Klassen stehen und mich bei der Erstellung des CMS nur an php5 gehalten.... das man in php4 bei OOP irgendwann an seine Grenzen stösst war mir klar ... aber nich das es einen so schnell ereilt... :-)


MfG
blueX
 
Hi du,

also entweder ich bin doof (ist ja nicht auszuschließen :-) ) oder ich kapiere selbst nach dem dritten Mal lesen nicht was du da genau meinst. Kannst du vielleicht mal ein Codebeispiel posten und sagen was er genau nicht macht oder macht? Bin gerade ein wenig verwirrt ;)

So wie du das beschreibst, klingt es so, als willst du die Methodendefinitionen auslagern in eine extra Datei. Stellt sich natürlich die Frage welchen Sinn das machen würde, insofern glaube ich eher dich falsch verstanden zu haben ;)
 
Ja also ich habe eine functions.php in der halt n paar Funktionen stehen die ich im ganzen System oft brauche. So zum Beispiel auch eine Funktion um die Datenbankergebnisse gleich in die entsprechendenSmartyvariablen zu parsen.

Die funktions.php wird in der modulswitch.php per require() aufgerufen und die Modul-Klasse wird auch in der modulswitch.php instanziert.

Unter php5 kann ich in der Modulklasse jetzt trotzdem auf die Funktionen die in der moduleswitch.php mit require() eingebunden sind und aus der funktions.php kommen zugreifen ganz normal.
PHP:
fetch_data($row, 'opt');

In php4 bekomm ich aber einfach keine Ausgabe der gewünschten Funktion....

Ich habe nun provisorisch die Funktionen die ich aus der funktions.php brauche als Methode in die Klasse geschrieben, was mir aber nicht so passt weil es den Code nur unnötig aufbläht und eine änderung der Funktionen in der funktions.php möglicher weise dann auch in allen Modulen erfolgen müsste :suspekt: ....
 
Hi,

rein vom Verständnis gehe ich jetzt von folgendem Code bei dir aus:

PHP:
<?php

function fetch_data($param1, $param2)
{
    // ... eine Funktion
    echo $param1 . $param2;
}

class Klasse {
    
    function Klasse()
    {
        // rufe die Funktion fetch_data auf
        fetch_data('foo', 'bar');
    }
}

new Klasse();

?>

also ganz simpel ... und geht auch ohne Probleme, sowohl unter PHP 5 und PHP 4, wüsste nicht was daran jetzt zwischen den Versionen geändert wurde. Wie sieht der Code der nicht unter PHP4 funktioniert bei dir konkret aus?
 
Die switch_modul.php schaut so aus : des require für die funktions.php ist in der global.php und somit ja auch hier verfügbar.

PHP:
<?
$usercheck = 1;
require('global.php');
/// configs ////////


if (!isset($modul)) {
	$content = 'kein modul gewählt';
}
else {
	require('./module/'.$_GET['modul'].'/index.php'); // modul laden
	$get_modul = new modul($smarty,$_GET['modul'],$vn,1); // instanz der modul klasse erszeugen
	if(isset($_GET['location'])) $get_modul->Location = $_GET['location']; // location innerhalb des moduls wählen
	$content = $get_modul->output_backend($_GET,$_POST,$_FILES); // backend methode aufrufen um feierlich den inhalt in empfang zu nehmen.... ;)
	unset($get_modul);
}
$smarty->assign('modul_output', $content);  
$smarty->display('modul.tpl');
?>


Die Datei mit der Modulklasse siet volgendermaßen aus(stark verkürzt):

PHP:
<?
######################################################################################
#### ! Dieser Bereich darf nicht geändert werden ! #############################
######################################################################################
class modul {																		##
	var $Location;																	##
	var $vn;																		##
	var $tpl_intern = '../../../templates/';										##
	var $modul_path;																##
	var $tpl;																		##
	function modul($tpl,$modul,$vn,$acp='') {										##
		$this->tpl = $tpl;															##
		if($acp == '1') {															##
			$this->tpl->template_dir = './module/'.$modul.'/templates/';			##
			$this->modul_path = './module/'.$modul.'/';								##
		}																			##
		else {																		##
			$this->tpl->template_dir = './acp/module/'.$modul.'/templates/';		##
			$this->modul_path = './acp/module/'.$modul.'/';							##
		}																			##
		$this->vn = $vn;															##
																					##
	}																				##
######################################################################################
######################################################################################
	
#########################################	
###### ab hier darf geändert werden!##
#########################################	
	
//Die Funktion die das Backend ausgibt
	function output_backend($get='',$post='',$files='') {
		$content = '';
		switch ($this->Location) {

// Gruppen auflisten				
			case 'group_list':
				$result = mysql_query("SELECT  * FROM vs_pers".$this->vn."_mod_ref_1_0_groups ORDER BY id DESC;") OR die(mysql_error());				
				$ref = '';
				while($row = mysql_fetch_array($result))
				{		
					$row['pic'] = $this->modul_path.'thumb.php?image=pics/'.$row['pic'].'&amp;x=100&amp;y=100&amp;aspectratio=1';
					fetch_data($row); // <<<----- DORT DIE FUNKTION AUS DER FUNKTIONS.PHP DIE NICH GENOMMEN WIRD 
					$ref .= $this->tpl->fetch('admin_group_list_bit.tpl');
				}
				$this->tpl->assign('ref', $ref);
				$this->tpl->assign('section_title', 'Referenzgruppen Übersicht');
				$content = $this->tpl->fetch('admin_group_list.tpl');
				break;

			default:
			
				$content = $this->tpl->fetch('admin_index.tpl');
				break;
				
		}
		return $content;
	}

	// Backend-Ausgabe Ende
}
?>

fetch_data($row); ist die Funktion die ich aus der funktions.php anwenden möchte. Aber bei PHP4 tut PHP einfach so als wenn da nichts stehen würde.. nicht mal ne Fehlermeldung erscheint das er die Funktion nicht finden konnte..... PHP5 macht es ohne rum zu jammern.....

Wenn ich die Funktion aber direkt in die Klasse mit rein schreibe dann geht es auch mit PHP4 .... aber des will ich ja nicht... =/


MfG
blueX
 
Hi,

ich vermute das der Fehler woanders liegt, und zwar genauer in der Funktion.

Hast du error_reporting(E_ALL); an? Was passiert wenn du einfach mal var_dump auf den Parameter machst in der fetch_data Funktion? Wie sieht fetch_data genau aus?

Wie gesagt, an dem Aufruf von Funktionen aus Klassen heraus hat sich nichts geändert, das muss woanders hängen.
 
Also der Parameter für die Funktion ist ordnungsgemäss mit den entsprechenden Daten vollgestopft.

error_reporting(E_ALL); ist an.


Die Funktion an sich schaut so aus:

PHP:
// daten in smartyvars umwandeln
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]");
	}
}

Ich bin da echt ratlos wo da der Fehler sein kann. Also meiner Meinung nach wird die Funktion einfach nicht gefunden... aber warum und wiso bekomm ich keine Fehlermeldung..... :(

MfG
blueX
 
Zurück