Coder Board Community (http://www.coder-board.de/index.php)
- Coding (http://www.coder-board.de/b4_Coding.html)
-- PHP (http://www.coder-board.de/b6_PHP.html)
--- Wie kann ich mehrere Variablen automatisch in einer Funktion globalisieren? (http://www.coder-board.de/t2670_Wie-kann-ich-mehrere-Variablen-automatisch-in-einer-Funktion-globalisieren.html)


Geschrieben von Prometheus am 03.01.2008 um 18:56:

  Wie kann ich mehrere Variablen automatisch in einer Funktion globalisieren?

Ich habe eine Funktion die mir ein paar kleinigkeiten macht und aufgrund des gesamten Aufbaus des Projekts muss ich in der Funktion restlos alle Variablen die Seitenkomponenten beinhalten könnten immer globalisieren. Das heißt kommt ein Element dazu muss ich immer daran denken auch die Liste der globalisierten Variablen zu erweitern. Kann ich das nicht irgendwie automatisieren? Jedes mal mache ich was und denke erst nicht dran und wunder mich dann das es nicht funktioniert. Außerdem wär es schon toll wenn immer nur das globalisiert wird was ich grade benötige abhängig davon was aufgerufen wurde. Hat jemand schon mal sowas gemacht?



Geschrieben von Spy am 03.01.2008 um 22:43:

 

Kann man das nicht irgendwie mit einen Array lösen ? Was irgendwoher die Daten nimmt und dann erweitert?



Geschrieben von Prometheus am 03.01.2008 um 23:51:

 

Keine Ahnung ich hab mir das schon paar mal durch den Kopf gehen lassen nur noch nie was brauchbares gefunden. Zu schade aber auch.



Geschrieben von sourceforge am 08.01.2008 um 02:27:

 

param übergabe per $_REQUEST oder $_GET. $_SESSION wäre auch möglich. das ganze packst in ein handliches array
innerhalb der klasse kannst dann vergleichen was vorhanden ist und was net und somit das fehlende ergänzen und globalisieren



Geschrieben von badmoon2049 am 08.01.2008 um 07:26:

 

hätt ich auch vorgeschlagen per request auf die Vars zuzugreifen.. aber wie ich ihn verstanden hab will er in einer function variabeln globalisieren oder so..



Geschrieben von Prometheus am 08.01.2008 um 08:39:

 

Ja genau also das wird so nichts werden.

Mal ein Beispiel.

Ich hab eine PHP Datei in der wird zuerst eine Datei functions.inc.php includiert. In dieser sind diverse Funktionen enthalten unter anderem die Funktion myparse(). Jetzt wird in der PHP Datei mehreres aus einzelnen Textdateien geladen wie z.B. header, footer und content. Jedes einzelne Dokument schicke ich durch die Funktion myparse() und am Ende des ganzen ist dann eine Ausgabe. Zwischendrin wird das ganze noch evaluiert für die Ausgabe. Wenn ich nun in der Funktion die drei Variablen $header, $footer und $content globalisiere ist das kein thema dann sind am Ende alle drei Variablen auch noch gefüllt. Mache ich dies jedoch nicht dann ist der Inhalt weg. In meinem Fall habe ich nun allerdings nicht drei Variablen sondern pro Seite ca. 10-20 Variablen. Und damit ich nicht für jede Seite eine Funktion schreiben muss sind das bei 10 Seiten etwa 100 Variablen. Diese muss ich nun komplett alle globalisieren damit das ganze läuft.

Meine Idee war es jetzt irgendwie was zu nutzen was automatisch in einer Funktion schaut "Wenn Variable nicht leer dann globalisiere" oder irgendwas in der Richtung. Ich hab schon versucht alle verwendeten Variablen in ein Array zu packen und dann das Array ansich zu globalisieren. Das wär auch noch nicht die perfekte Lösung aber auch das hat nicht funktioniert.



Geschrieben von davil am 31.03.2008 um 14:06:

 

Ich weiß nicht, ob es für die Antwort etwas zu spät ist, aber vielleicht hilft das ja noch:

Wenn du die Namen der Variablen im Parser kennst, kannst du sie prinzipiell ganz einfach globalisieren:
code:
1:
2:
3:
4:
// variable $header globalisieren
$varname = 'header';
global $$varname;

Der Vorteil dieser Lösung liegt darin, dass du viele Variablen in einer Liste durchgehen und dynamisch globalisieren kannst.

Falls du woanders nachschauen willst, welche Variablen du so globalisiert hast, würde ich empfehlen, die Namen der Variablen einfach an eine globale String-Liste zu hängen:
code:
1:
2:
3:
global $global_list;
$global_list .= ';'.$varname;

Damit erhältst du eine Semikolon-getrennte Liste (';header;footer;irgendwas'), die du jederzeit per explode() auftrennen und dann wieder alle enthaltenen Variablennamen globalisieren kannst - voila ;-)


Ich persönlich würde in diesem fall allerdings auf die mächtigen Möglichkeiten der Objektorientierung in PHP zurückgreifen und eine kleine statische Klasse bauen, der ich per set() und get() beliebige Name/Werte-Paare zuweisen und abfragen kann:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
class data {
	private static $properties = array();
	
	public static function set($name, $value) {
		self::$properties[$name] = $value;
	}
	
	public static function get($name) {
		return (isset(self::$properties[$name])) ? self::$properties[$name] : '';
	}
	
	public static function getAll() {
		return self::$properties;
	}
}

Der Teil:
code:
1:
2:
return (isset(self::$properties[$name])) ? self::$properties[$name] : '';

ist so gemacht, damit NULL-Werte als leerer String zurückkommen. Wenn das nicht notwendig ist, reicht natürlich:
code:
1:
2:
return self::$properties[$name];


Diese Daten könnten dann z.B. so zugewiesen und woanders wieder ausgelesen werden:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function a() {
	// hier wird was gesetzt
	data::set('header', $header);
}

function b() {
	// hier wird was anderes gesetzt
	data::set('footer', $footer);
}

function c() {
	// wir wollen alle variablen haben
	$data = data::getAll();
	foreach ($data as $name => $value) {
		$$name = $value;
	}
	// $header und $footer sind ab jetzt in dieser function verfügbar
}



Geschrieben von Prometheus am 31.03.2008 um 19:21:

 

Die Antwort kommt auf keinen Fall zu spät. Das Projekt wo ich das nutzen wollte bzw. auch schon nutze habe ich aufgrund von akutem Zeitmangel noch gar nicht großartig weiter entwickelt. Es läuft zwar so wie ich mir das dachte (mehr oder weniger) gut aber ich teste das dennoch mal. Jedes mal wenn ich bloß eine Seite erweitern möchte muss ich dran denken restlos alle Funktionen anzupassen und vor allem auch prüfen das ich keine Variablen doppelt verwende und so.

Sobald ich dazu komme werd ich mal ne Runde damit rum testen. Ich sollte in den nächsten Tagen auch meine Adobe Creative Suite 3 Web Premium bekommen und soweit ich gelesen habe soll der DreamWaver ja inzwischen gewaltig weiter sein auch was PHP betrifft. Mal sehen ob ich da endlich in der Lage bin vorgefertigte Codeteile anzulegen.



Geschrieben von Prometheus am 23.08.2008 um 11:52:

 

Nun, also ich habe bei einem Kundenauftrag nun das gleiche Problem. Ich habe 20 Funktionen und in fast jeder Funktion muss ich die Variablen alle samt manuell globalisieren. Ändert sich nun was muss ich bei jeder Funktion überlegen ob die Variable dort globalisiert werden muss.

Die Lösung hier habe ich leider nicht so ganz verstanden. Ich schreibe mal ein Beispiel was ich habe und dann kann mir jemand der das verstanden hat bitte mal schreiben wie das aussehen müsste.

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// Funktion 1
function abc($var1$var2$var3) {
global $glob1$glob2$glob3$glob4;
// irgendwas was hier passiert
}
// Funktion 2
function def($var4$var5$var6) {
global $glob2$glob4$glob5$glob6;
// irgendwas was hier passiert
}

Wie schaffe ich es nun hier mit möglichst nur einem Aufruf einfach in beiden Funktionen alles zu globalisieren? Es spielt ja keine Rolle hauptsache ich verwende jede Variable wirklich nur für einen Zweck. Und da das gegeben ist sollte das machbar sein.



Geschrieben von imset am 28.08.2008 um 01:02:

 

So hallo erst mal ^^

Also ich glaub ich versteh dein Problem, das kannst du ganz einfach über 2 Wege lösen:

a) Fals dein Script noch nicht zu gigantisch ist:

Benutze doch einfach die Superglobale $GLOBALS. Das ist ein Array von dem aus du jede Variable deines Scripts z.B. in Funktionen global aufrufen kannst. Hier ne Beschreibung .http://us2.php.net/manual/de/reserved.variables.globals.php


b) Fals dein Script zu groß ist als das es sich lohnen würde alles zu ändern:
Beschäftige dich mal mit der OOP(objekt orientierten programierung) von PHP, da solltest du solche Probleme erst garnicht bekommen.
.http://www.php.net/manual/de/language.oop5.php



Geschrieben von Prometheus am 28.08.2008 um 08:32:

 

Also das mit der Superglobalen ist echt ne geniale Sache. Hatte gar nicht gewusst, dass es sowas gibt. Mein Skript ist zwar doch schon ganz schon angewachsen aber ich nutze den Dreamwaver CS3 und kann alle Dateien laden und übergreifen mit Suchen und Ersetzen arbeiten. Sollte also insgesamt recht schnell gehen.

Das mit dem OOP hab ich schon länger vor aber bin noch nicht recht dazu gekommen. Grundlagen hab ich davon ja aber wenn man PHP in Version 3.x gelernt hat fehlen einem leider so mansche Dinge die jetzt in V5 möglich sind.

EDIT:
Nun, ich habe grade schon das erste Problem festgestellt beim Anwenden von $Golbals. Ich habe eine Funktion welche einen mini Templateparser darstellt. Das heißt ich übergebe das gewünschte Template und die Funktion ließt dieses nun ein und evaluiert es und ich bekomme das Ergebnis als return welches ich dann wiederum per echo ausgebe. Ich habe nun als Beispiel eine Variable $OuterTableWidth welche in einer Datei "settings.inc.php" festgelegt wird. Wie wende ich denn $Globals an, wenn in der Funktion mit der Variable gar nicht gearbeitet wird allerdings im entsprechenden Template? Muss ich dann in jedem Template alles umschreiben und $GLOBALS[OuterTableWidth] angeben oder wie ist es dann absolut korrekt?



Geschrieben von imset am 28.08.2008 um 13:48:

 

Versteh deine Problematik leider grad nicht so ganz, vieleicht kann ich dir aber weiterhelfen wenn du mal den Code dazu postest Augenzwinkern


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH