Fragen zu Funktionen

Sorry das ist gerade das Forum mit Fragen flute, aber das Modul welches ich gerade bastel geht mehr wieder an die Grenzen meiner Fähigkeiten mit PHP (wie man merkt :slight_smile: ).

Frage 1: Zugriff auf Variable in Funktion 1 aus Funktion 2?
Ich habe eine Funktion public function DataPrep() in der ich Grundlegende Dinge berechne … z.B. ob Sommer oder Winter ist (anhand des Monats) … dieser Wert wird dort in $SeasonIsSummer = 0 gespeichert.

Jetzt will ich auf diese Variable aus einer zweiten Funktion zugreifen - wie kann ich das tun?

Frage 2: Wie kann ich eine Funktion aus einer anderen Aufrufen?
Ich will gerne bei bestimmten Events eine Notification senden … z.B. bei Sturm. Da die Sturmvariable regelmäßig geprüft wird, kann ich die Notification nicht darin ablegen und würde sie gerne in eine separate Funktion packen.

Hintergrund - ich will über die Feiertage unsere gesammelten Skripte für die Kontrolle von Dinge im Haus in ein Modul packen. Es sind gut und gerne 20+ Scripte. Ich denke sowas könnte dem einen oder anderen die Steuerung vereinfachen.

Mal so auf die schnelle… von unterwegs.

Zu 1: Nutze doch return, um die Werte zurück zu geben.

Zu 2: ich gehe davon aus, dass es in der selben Klasse ist: $this->FunktionDieAufgerufenWerdenSoll();

Falls die noch Parameter hat, dann müssen die noch mitgegeben werden.

Uli

Gesendet von iPhone mit Tapatalk

Danke Uli … ich habe jetzt nochmal ein wenig nach „return“ gesucht, aber so richtig werde ich noch nicht schlau.

Ein anderer Weg scheint zu sein:

  1. Direkt unter Class: private $SeasonIsSummer;
  2. In schreibender Funktion: $this->SeasonIsSummer = 0;
  3. In lesender Funktion: $summer = $this->SeasonIsSummer;
    $this->SendDebug(‚Test‘,$summer,0);

Es kommt kein Compilerfehler, aber auch nicht mein Wert?


public function DataPrep() 
{
        $SeasonIsSummer = 0;
        // Es wird irgendetwas berechnet
        $SeasonIsSummer = 1;
        return $SeasonIsSummer;
}

So fragst du dann die Variable ab…


$SeasonIsSummer = $this->DataPrep();
var_dump($SeasonIsSummer);

$SeasonIsSummer liefert dir dann den Wert.

Uli

Danke - jetzt geht alles. Da wäre ich wohl nicht so wirklich drauf gekommen,

Prima [emoji1303][emoji6]

Gesendet von iPhone mit Tapatalk

Es klappt, aber es kam ein neues Problem/Frage

Wenn ich $SeasonIsSummer = $this->DataPrep(); ausführe, dann wir die Berechnung erneut in der „globalen Klasse“ ausgeführt (und mit Return vermutlich beendet)?

Die Frage ist jetzt, wie geht mein Aufruf hier aus … $SeasonIsSummer steht ja so nicht nicht fest und wird ja erst innerhalb von if / else „berechnet“?


if ($AutoSeason == 1)	{
	if ($MonthTodayForSeason > $SummerEnd AND $MonthTodayForSeason >$SummerStart) {
	SetValue($this->GetIDForIdent("AutoSeasonIsSummer"), (bool)0);
	$this->SendDebug('Auto Season is summer',$SeasonIsSummer,0);
	$SeasonIsSummer = 0;
	return $SeasonIsSummer;
	}
	elseif ($MonthTodayForSeason < $SummerEnd AND $MonthTodayForSeason >= $SummerStart) {
	SetValue($this->GetIDForIdent("AutoSeasonIsSummer"), (bool)1);
	$this->SendDebug('Auto Season is summer',$SeasonIsSummer,0);
	$SeasonIsSummer = 1;
	return $SeasonIsSummer;
	}
}
			

Wäre hier „die Idee“ ganz am Ende der Hauptfunktion ein „Mapping“ zu machen, also


$ResultSeasonIsSummer = $SeasonIsSummer;
Return $ResultSeasonIsSummer;

und dann,


$ResultSeasonIsSummer = $this->DataPrep();

zu nutzen … dann müssten ja alle Werte kalkuliert sein?

Oder direkt am Anfang false oder als 0 definieren.

Wenn es nicht zur Schleife kommt, dann wird der erste Wert zurückgegeben.

Uli

Gesendet von iPhone mit Tapatalk

Das mit dem false verstehe ich leider nicht?

Das mit der Schleife passiert auch wenn ich die Werte ans Ende packe. Anscheinend löse

$ResultSolarRadiationLuxCurrent = $this->DataPrep();

einen kompletten Aufruf der Funktion auf … ist zwar auch eine nette Erkenntnis :o, erzeugt in meinem Fall eine Menge overhead. Kann ich die einmal kalkulierten Werte nicht irgendwie zwischenspeichern und nur abrufen ohne die komplette Funktion zu triggern?

Wenn das nicht geht, dann müsste ich jede Berechnung in eine Funktion legen - das Ginge auch, aber es würden diverse Berechnungen mehrfach erfolgen - also wenn Markiese und einzelne Raffstores Windwerte abfragen.

Alternativ die Werte in einen Buffer oder als Attribute ablegen und von dort abrufen.

Uli

Gesendet von iPhone mit Tapatalk

Nochmals Danke … mit dem Buffer geht es


$this->SetBuffer("DataBuffer", "Hallo Welt");


$Bufferdata = $this->GetBuffer("DataBuffer");
var_dump($Bufferdata); 

Danke für den Hinweis. Ich habe heute mal wieder viel gelernt. :smiley: