PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] Umgang mit Namenskonflikt


Kabelsalat
2006-10-03, 21:18:43
Guten Abend,

Ausnahmsweise muss ich mich heute auch einmal intensiver mit PHP auseinandersetzen. Anmerken sollte man, dass ich in Punkto PHP nur grundlegende Kenntnisse besitze - ansonsten bewege ich mich eher im Umfeld Asp.net, .Net, Java und WinAPI (dort würde ich mich dann auch eher als fortgeschritten bezeichnen)...

Nun zu meinem Problem: Ich schreibe gerade eine Funktion, die von PHP-Anwendung 1 aufgerufen wird. Diese Funktion muss allerdings auch auf PHP-Anwendung 2 zugreifen... dummerweise sind manche Funktions- und Variablennamen in beiden Anwendungen definiert, ein include auf einen Bestandteil der Anwendung 2 sorgt somit für Fehlermeldungen der Art "Cannot redeclare [...]". Wie kann ich nun auf Teile der Anwendung 2 ohne include zugreifen (also in seperatem Ausführungskontext)? Wie würdet ihr das Problem lösen?

Danke für die Hilfe

Kabelsalat

Kabelsalat
2006-10-03, 21:30:50
Das Beispiel fehlt:

(foo.php)

function NameConflict()
{
//...
}


(bar.php)

function NameConflict()
{
//...
}


Aufruf:

// Aufruf der Funktion NameConflict in foo.php
include (foo.php);
NameConflict();

// Nun soll eine Funktion mit dem selben Namen in bar.php aufgerufen werden
include(bar.php); // <- logischerweise kracht es hier
NameConflict();


Schön wäre es :rolleyes:

$bar = include(bar.php);
bar.NameConflict();

darph
2006-10-03, 22:20:22
Ich weiß nicht, wie ausgewachsen deine Applikation schon ist - aber eventuell kannste das ja noch in Klassen packen.

(foo.php)class Foo {
public static function NameConflict()
{
//...
}
}


(bar.php)class Bar {
public static function NameConflict()
{
//...
}
}



// Aufruf der Funktion NameConflict in foo.php
include (foo.php);
Foo::NameConflict();

// Nun soll eine Funktion mit dem selben Namen in bar.php aufgerufen werden
include(bar.php);
Bar::NameConflict();

Kabelsalat
2006-10-03, 22:26:12
Die Anwendungen sind leider fix...

darph
2006-10-03, 22:58:06
Dann...

anstatt include den Inhalt der Bar.php auslesen und als string in eine Variable packen. Dort dann NameConflict suchen und ersetzen durch BarNameConflict und das dann durch eval() jagen.

Gewiß häßlich, könnte aber funktionieren.

Marscel
2006-10-03, 23:13:13
Wenn das die Lösung ist, würde ICH mir allerdings nochmal das Konzept des Scripts durch den Kopf gehen lassen...

darph
2006-10-03, 23:14:40
(Foo.php)<?php
function NameConflict() {
echo("ich bin Foo.<br>");
}
?>

(Bar.php)<?php
function NameConflict() {
echo("ich bin Bar.<br>");
}
?>

(BarWrapper.php)<?php
function loadFile($file) {
$handle = fopen($file, "r");
$text = fread ($handle, filesize($file));
fclose ($handle);
return '?>'.$text;
}

$fileContent = loadFile("Bar.php");
$fileContent = str_replace("NameConflict", "BarNameConflict", $fileContent);
eval($fileContent);
?>


(index.php)<?php
include("Foo.php");
NameConflict();

include("BarWrapper.php");
BarNameConflict();
?>

Ausgabe:

ich bin Foo.
ich bin Bar.


Wenn das die Lösung ist, würde ICH mir allerdings nochmal das Konzept des Scripts durch den Kopf gehen lassen...
Naja, aber wenn er das so vorgesetzt bekommt und der Chef sagt "mach was damit!"... was will man machen?

Kabelsalat
2006-10-03, 23:23:01
Danke! Chef gibt es in diesem Fall zum Glück keinen ;) Vielleicht finde ich ja auch noch eine alternative Lösung, aber Darph sei dank, habe ich jetzt zumindest einen möglichen Ansatz...