Wie übergebe ich einen Array oder eine function an eine public Methode von IP-Symcon

Bei public Methoden muss ja in IP-Symcon der Variablentyp davor geschrieben werden.
Wie gehe wich vor wenn ich einen Array oder eine Funktion an die public methode übergeben will?
Muss ich z.B. den Array als Workarround als JSON String übergeben und dann in der Methode wieder in einen Array zurückwandeln oder gibt es auch einen Weg den Array direkt an die public Methode zu übergeben? Wie geht man da bei Funktionen vor? Muss ich da ebenfalls den Funktionsnamen als string übergeben oder gibt es eine Möglichkeit die Funktion direkt zu übergeben?

Du kannst (noch) den Typ einfach weglassen. Und dann ein Array übergeben.
Ansonsten musst du den Umweg über einen String nehmen.

Die Frage mit dem Funktionsnamen verstehe ich nicht.
Michael

Abend!

Meinst du mit Function als String übergeben das hier?
PHP: call_user_func - Manual

So rufe ich teilweise einfach functions auf die ich als String sonstwo her habe oder übergebe…

Grüße,
Chris

Und was ist jetzt zukunftssicherer, als String übergeben und dann umwandeln oder den Typ weglassen und als Array? Ich habe wenig Lust dann wieder alles umzubauen, nur weil sich mal wieder was in IP-Symcon ändert.

Das (noch) sagt es doch, das es nicht zukunftssicher ist.
Michael

Ja so was in der Art meine ich. Kannst du mir ein Beispiel geben wie man so was mit einer public Methode von IP-Symcon nutzt wie ist das dann von der Syntax? Ich will also Parameter und eine function übergeben

Sieht das dann so aus?


public myfunction(string $name, string $getter)
{
call_user_func($getter);
}

Wie komme ich dann zu einen anderen Methode, finde in der Doku nur eine normale Funktion, ich muss ja wohl noch irgendwie $this mit schreiben nur wie sieht da die Syntax aus?

Ich würde mir dazu mal eine Stellungnahme von IP-Symcon wünschen, dann weis man wenigstens was geplant ist. Also muss ich wohl umständlichen Weg gehen und das als String übergeben und dann wieder umwandeln, wäre ja auch eine Möglichkeit das man einfach array davor schreibt, so wie man das jetzt bei string und so auch macht.

Zu Post 6:
Steht im Beispiel 4 von der verlinkten Doku!
Michael

Ah ok, aber $this kann ich dann nicht nutzten oder geht das doch? Muss also immer mit dem Klassennamen ansprechen?

Noch, weil es Pflicht wird die Typen anzugeben.
Kannst auch Array hinschreiben.
Dann hast du aber die Warnung im Log.
Kein Eingabefelde in der Konsole bei dieser Funktion (wie sollte das auch funktionieren mit einem Array).
Und du hast im Script Editor keinen Hinweis auf den Typ.
Michael

Das kommt darauf an was du ausführen willst.
Eine statische oder eine nicht statische Methode.
Die Grundlagen für OOP in PHP solltest du inzwischen kennen.
Und ja, $this geht natürlich auch.
Michael

Hilf mir bitte doch noch mal auf die Sprünge bzw. kannst Du mir einen hilfreichen Link posten? Ich habe ehrlich gesagt immer noch meine liebe Mühe mit OOP und PHP und vor allem wie ich innerhalb einer Klasse auf was anderes zugreife.
Problem hab ich z.B. wenn ich so was wie SetValue aufrufen will aus einer eigenen Klasse die nicht Teil von IPSModule ist. Wie rufe ich z.B. in dem Fall aus der seperaten Klasse SetValue auf?
Statische Methoden hab ich bisher nie genutzt, wann macht das denn Sinn bzw. wofür sind die da und wie unterscheiden die sich von einer normalen public oder private Methode?

Sorry, aber das ist hier nicht das Buch PHP for dummys :wink:
Das steht alles wunderbar in der PHP Doku.
Dazu muss man nur die Beispiel ausprobieren, wenn man eventuell die Beschreibung nicht versteht. So ging es mit mit ‚späte statische Bindung‘… Ja Gesundheit… Äh was?

Nimm einfach call_user_func([$this, $func]).
Sollte für deinen Anwendungsfall passen.
Ich rate eh von der Funktion ab, sofern du $func nicht vorher prüfst.
Sonst hat du, Sicherheitstechnisch, ein Loch womit User einfach beliebige Funktionen starten können. Oder auch nicht Public Methoden.
Michael

Die ist nur leider manchmal etwas unverständlich geschrieben, bzw. von jemand der es so oder so weis und nicht unbedingt damit es ein anderer versteht ;).

Danke werde ich ausprobieren.

Das ist ein guter Einwand, da muss ich mir mal überlegen wie man das dann auf bestimmte Funktionen beschränkt.