SteBu: Allgemeine Frage zu Rückgabewerten einer Funktion

Moin

Folgendes ist mir aufgefallen. Ich habe eine Funktion welche einen String entgegennimmt und mir dann nach einen bestimmten Muster alle Floats daraus extrahiert und in ein Array packt. Dieses Array ist der Rückgabewert. Welchen ich dann verarbeiten will. Und folgendes geht(nicht):

for($i=0;$i<sizeof(besagteFunktion($arg));$i++)//Das klappt noch
{
echo besagteFunktion($arg)[$i];//Und das hier klappt nicht
}

Ist das normal? Und wenn ja, welchen Grund hat es, dass ich so nicht auf das Array zugreifen darf.

SteBu

  1. Hello,

    echo besagteFunktion($arg)[$i];//Und das hier klappt nicht

    Ist das normal? Und wenn ja, welchen Grund hat es, dass ich so nicht auf das Array zugreifen darf.

    Das ist "normal".
    Sicher wäre es schön, wenn soetwas auch ginge, aber programmiertechnisch äußerst unsicher.
    Bei PHP sind die Rückgabewerte einer Funktion variant, also nicht festgelegt.
    Das liegt am besonderen Konzept von PHP.

    Du kannst also nur erst den Rückgabewert in einer Ergebnisvariablen speichern. dadurch erhält er einen Bezeichner und ist referenzierbar. Danach kannst Du erfragen, welchen Typ dieser Bezeichner symbolisiert, also ob logisch, numerisch, String, oder Array. Weitere Unterscheidungen zu treffen, lohnt in PHP nicht. Ggf. reicht es sogar, zwischen Skalar und Array zu unterscheiden (oder dann eben noch "Objekt" bei OOP).

    PHP arbeitet also quasi in zwei Layern...
    In der einen Schicht werden die Metadaten über den Bezeichner geführt
    in der zweiten Schicht werden die Daten selber geführt.

    Daher ist es auch wichtig, bei einer solchen Funktion

    $_ergebnis = mach_array($string);

    hinterher nach den Ergebnistyp zu fragen:

    if (false !== ($_ergebnis = mach_array($string))
      {

    }

    oder gleich:

    if (is_array($_ergebnis = mach_array($string))   ## habe ich nícht getestet :-)
      {
        foreach($_ergebnis as $key => $val)
        {
          echo "<b>$key</b> =&gt; $val <br>";
      }

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Moin,

      erstmal danke für deine doch sehr ausführliche Antwort.

      Sicher wäre es schön, wenn soetwas auch ginge, aber programmiertechnisch äußerst unsicher.

      Ob es so schön ist bezweifle ich aber langsam. Denn es wird ja die Funktion 2x aufgerufen, obwohl sich an dem übergebenen Parameter ja nichts geändert hat. Aber nat. für ein Quick&Dirty-Script wäre es schnell eine Lösung.

      Bei PHP sind die Rückgabewerte einer Funktion variant, also nicht festgelegt.

      Das ist klar. Doch ich meine, der Programmierer hat sicher zu stellen, dass dort auch gefälligst nur ein Array ankommt.

      Danke nochmal und nen schönen Tag noch
      SteBu

      1. Hello,

        Ob es so schön ist bezweifle ich aber langsam. Denn es wird ja die Funktion 2x aufgerufen, obwohl sich an dem übergebenen Parameter ja nichts geändert hat. Aber nat. für ein Quick&Dirty-Script wäre es schnell eine Lösung.

        Bei meinen Beispielen wird die Funktion aber nur einmal aufgerufen. das ist in Multithreading/Multiuserumgebungen auch meistens wichtig, denn ein Funktionsergebnis in OOP-Umgebungen ist meistens nur ein Snapshot, da sich in inneren Konstrukten der Funktion zwischen dem ersten und zweiten Aufruf Randbedingungen geändert haben können, von denen der Programmierer gar nichts weiß.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau