Optionale Parameter einer Funktion

Hallo Leute,

manchmal ergeben sich auch Aufgabenstellungen…

Ich möchte eine Funktion mit optinalen Parameter haben, so geht esoffenbar nicht:

public function Set_Status(Bool $value, Int $FadeTime = $this->ReadPropertyInteger("FadeTime"))

Ich habe mir jetzt folgende Brücke gebaut:

public function Set_Status(Bool $value, Int $FadeTime = -1)

gefolgt von einer „Korrektur“:

If ($FadeTime == -1) {
				$FadeTime = $this->ReadPropertyInteger("FadeTime");
			}

999 liegt für diese Funktion im nicht zulässigen Bereich, von daher hoffe das das nie zu Problemen führt.
Komisch erscheint mir dieses Konstrukt aber - gibt es da eine bessere Möglichkeit?

Joachim

IPS unterstützt keine optionalen Parameter für Instanz-Funktionen.

Besser ist es so:
public function Set_Status(bool $value)

public function Set_StatusEx(bool $value, int $FadeTime)

Das hier funktioniert auch mit IPS 4.x nicht, da es nicht mit dem enthaltenden PHP kompatibel ist:
Int $FadeTime = -1
Das ist erst mit PHP7 möglich.

Alternativ, für nicht Instanz-Funktionen (private & protected):
Int $FadeTime = null

Und dann auf is_null prüfen.

Michael

Das ist an sich nicht richtig wenn unter PHP eine Variable deklarieriest mit int kann diese in einer Funktion nur NULL haben Werte sind da nicht zulässig.

Du könntest aber analog zu Deinem Vorgehen das so angehen

public function Set_Status(Bool $value, Int $FadeTime = NULL)
{
If (empty($FadeTime))
       {
	$FadeTime = $this->ReadPropertyInteger("FadeTime");
	}
}

Richtig für PHP < 7, aber falsch für PHP7. Dort funktioniert es!
Weil dann int keine, von IPS bereitgestellte, Klasse mehr ist.
Klassen können als default nur null haben.

Ab PHP 7 ist int aber wirklich ein integer und keine ‚pseudo‘ Klasse und dann funktioniert das Beispiel mit -1.

Ja, aber mit der Einschränkung, dass dies IPS nicht unterstützt.
Darum gibt es ja auch Befehle wie
IPS_RunScript
IPS_RunScriptEx
IPS_RunScriptWait
IPS_RunScriptWaitEx
usw…
Die *Ex haben mehr Parameter :slight_smile:

Michael

Kann man das trotzdem einfach bei NULL lassen und damit arbeiten, das sollte doch auch mit PHP 7 gehen oder muss ich dann zukünftig unterscheiden was für eine IPS Version benutzt wird? Das macht das Ganze ja nur wieder unnötig kompliziert. Es wäre gut eine Lösung zu haben die ich jetzt bereits nutzte und auch in Zukunft weiter nutzten kann.

Was nicht unterstützt? Das es unterschiedliche Methoden gibt ist ja ok, die einen mit und die anderen ohne Parameter, ich wüste aber jetzt nicht warum das mit NULL deshalb nicht funktionieren sollte, bei mir geht das zur Zeit zumindest, wie das dann unter PHP 7 aussieht weis ich noch nicht.

…vielen Dank!

Ich habe mich mal an die IPS-„Gegebenheiten“ angepasst und nun zwei Funktion geschaffen…:wink:

Joachim

Du meinst das hier in IPS nutzen…


public function Test(int $value1, int $value2 = null)

Und im Script dann:


SDM630_Test(12345, 11);

Weil dann das rauskommt:

 Uncaught ArgumentCountError: Too few arguments to function SDM630_Test(), 2 passed in C:\IP-Symcon\scripts\42118.ips.php on line 3 and exactly 3 expected in C:\IP-Symcon\scripts\__generated.inc.php:6959

Was meinst du warum es in IPS nicht EINE Funktion mit optionalen Parametern gibt :smiley:

Intern, also in deinem private/protected Methoden kannst du das machen. Aber nicht nach ‚extern‘ also public zu IPS.

Michael

Genau so mache ich das in Modulen mit dem einzigen Unterschied das es nicht public sondern protected ist und die Funktionen die von außen als public sichtbar sind jeweils die gleiche protected function aufrufen. Nur eben einmal mit und einmal ohne das Parameter übergeben werden.

Das wird es sein warum mir das noch nie aufgefallen ist, weil die eigentliche Funktion bei mir protected ist und nur die Übergabe function public.

Wie Nall Chan schon korrekt sagte unterstützten wir bei exportierten (public) Funktionen (also alle die dann mit eurem Prefix verfügbar sein) keine optionalen Parameter. Intern in euren Klassen könnt ihr alles machen, was PHP kann :wink:

paresy