You are not logged in.

wcf.regNote.message

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

1

Thursday, January 3rd 2008, 6:56pm

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?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Spy

Trainee

Posts: 127

Occupation: Feriengammler

  • Send private message

2

Thursday, January 3rd 2008, 10:43pm

Kann man das nicht irgendwie mit einen Array lösen ? Was irgendwoher die Daten nimmt und dann erweitert?
Die Welt ist irgendwie total Buggy programmiert X(

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

3

Thursday, January 3rd 2008, 11:51pm

Keine Ahnung ich hab mir das schon paar mal durch den Kopf gehen lassen nur noch nie was brauchbares gefunden. Zu schade aber auch.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

sourceforge

Beginner

Posts: 3

  • Send private message

4

Tuesday, January 8th 2008, 2:27am

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

badmoon2049

Intermediate

Posts: 188

Location: Leipzig

Occupation: Azubi

  • Send private message

5

Tuesday, January 8th 2008, 7:26am

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..

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

6

Tuesday, January 8th 2008, 8:39am

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.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

davil

Beginner

Posts: 36

Location: Wien

Occupation: Entwickler

  • Send private message

7

Monday, March 31st 2008, 2:06pm

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:

Source code

1
2
3
// 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:

Source code

1
2
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:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:

Source code

1
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:

Source code

1
return self::$properties[$name];


Diese Daten könnten dann z.B. so zugewiesen und woanders wieder ausgelesen werden:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
}
~~~ ihr seid alle krank! ~~~ :D

This post has been edited 1 times, last edit by "davil" (Mar 31st 2008, 2:12pm)


Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

8

Monday, March 31st 2008, 7:21pm

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.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

9

Saturday, August 23rd 2008, 11:52am

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 Source code

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.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

imset

Beginner

Posts: 5

  • Send private message

10

Thursday, August 28th 2008, 1:02am

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

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

11

Thursday, August 28th 2008, 8:32am

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?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

imset

Beginner

Posts: 5

  • Send private message

12

Thursday, August 28th 2008, 1:48pm

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

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

13

Friday, August 29th 2008, 12:01pm

Nun ich müsste dazu zusammenhängend die ganze Anwendung posten und das geht leider nicht. Was ich da mache ist kein frei zugängliches Tool und der Kunde dreht mir den Hals rum wenn ich das offen hier poste.

Ist aber auch egal ich glaube ich habe jetzt einen Weg gefunden. Wenn ich sicher bin das alles klappt werd ich mal ein Beispiel zusammen bauen.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

comand

Beginner

Posts: 12

  • Send private message

14

Tuesday, September 2nd 2008, 8:55pm

So ich misch mich auch mal ein :D

Also ich verstehs auch nicht ganz.

Aber ich würde dir echt empfehlen OOP zu programmieren.

Ich vermute mal das es eine zentrale Datei geben wird die immer Includet ist oder?

In dieser kannste du ja das Objekt initalisieren und dann kannst du die Variablen jederzeit ändern und über das Objekt auch immer drauf zugreifen.

Also so in der Art

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Test{
	
public $sVariable 1;
public $sVariable 2;
public $sVariable 3;

public $aArray1;
public $aArray2;


// Beispielweise über eine Funktion falls die Daten noch verarbeitet werden sollen...
public function setArray2($sKey, $sValue) {
	$this->aArray2[$sKey] = $sValue;
}

// Beispielfunktion um das Value eines Array eintrages zu holen..
public function getArrayValue($sKey) {
	return $this->aArray1[$sKey];
}
	

}

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// funktionen sind eig nebensache was ich aufzeigen will ist das:

$oTest = new Test();

//Jetzt hast du das Object zur verfügung

//nun kannst du an jeder beliebenstellen im Code die Vars definieren und abrufen also:

$oTest ->sVariable1 = "Das ist ein Test";
$oTest ->sVariable2 = "Test2";
$oTest ->aArray1['test'] = "Test3";
$oTest ->setArray2('testkey','testvalue');

...

echo $oTest ->sVariable1;
echo $oTest ->aArray1['test'] ;
echo $oTest ->getArrayValue('test') ;


Ich wurde mir ne Classe schreiben mit einem Construktor der beim aufruf der classe dieentsprechenden Vars definiert und dann kannst du über das Object jederzeit drauf zugreifen.

Naja weis nicht ob dir das Hilft :mrgreen: warscheinlich weniger , denke soviel OOP wirste schon können ;) warscheinlich liegt dein problem bei was anderen, ist mir jedoch nicht ganz ersichtlich geworden.

Aber ich machs bei meinen Sachen immer so .
Ich definiere mir meine Classen die beim Aufruf alles erledigen und über die ich dann jederzeit auf meine Datenzugriff habe :P.

Falls das keine Hilfe ist poste dein "Problem" nochmal ausführlicher mit ein paar Beispielen , etc,..
Must ja nicht den Code von deinem Projekt nehmen oder Daten deines Kunden . Kannst es ja "Provisorisch" nachbauen dann bekommt man nen besseren Einblick und wir erkennen das Problem evt. besser.

naja bis dann

comand

wcf.user.socialbookmarks.titel

Kfz Versicherungsvergleich direkt angebote vergleichen