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?
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
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.
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
Intern, also in deinem private/protected Methoden kannst du das machen. Aber nicht nach ‚extern‘ also public zu IPS.
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