Ankündigung

Einklappen
Keine Ankündigung bisher.

Lösung um "mixed" Types zu verhindern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Lösung um "mixed" Types zu verhindern

    Moinsen,

    ich bin gerade dabei mein System auf PHP7 umzustellen. Es gibt allerdings noch ein paar Fälle wo ich mit unterschiedlichen Typen als Rückgabewert arbeite und mir auch keine Lösung einfällt dieses Problem zu lösen, da ich unterschiedliche Typen brauche.

    Das ist die Methode aus meiner Config Klasse. Das Problem ist hier sowohl der zweite Parameter, als auch der Rückgabewert. Als Rückgabe ist rein theoretisch alles möglich was man in er Config Datei anlegen kann (PHP).

    Jemand eine Idee?

    PHP-Code:
    public function get($strKey$mixDefault null)
    {
        
    $mixCurrent $this->arrConfig;

        
    $strNamespace strtok($strKey'.');

        while (
    $strNamespace !== false)
        {
            if ( ! isset(
    $mixCurrent[$strNamespace]) &&
                 ! isset(
    $mixDefault))
            {
                
    /*
                 * TODO Exception
                 */
            
    }

            if ( ! isset(
    $mixCurrent[$strNamespace]) &&
                isset(
    $mixDefault))
            {
                return (
    $mixDefault);
            }

            
    $mixCurrent $mixCurrent[$strNamespace];
            
    $strNamespace strtok('.');
        }

        return (
    $mixCurrent);


  • #2
    Falls deine Funktion beliebige Typen zurückgeben kann, so wird das auch Mixed bleiben müssen.

    Wie wäre es, wenn du den default entfernst?
    PHP-Code:
    <?php

    function config_get(string $name) {
        
    $config = [
            
    'foo' => 23,
            
    'bar' => 42
        
    ];
        if(!
    array_key_exists($name$config)) {
            return 
    null;
        }
        return 
    $config[$name];
    }

    $foo config_get('foo') ?? 23;
    var_dump($foo);

    $foobar config_get('foobar') ?? 1337;
    var_dump($foobar);

    Kommentar


    • #3
      Diese get-Methode ist ein gutes Beispiel. Ich habe bei mir dafür Methoden wie getBool, getInt, getFloat, getString, getArray und get für alles andere (z.B. Objekte). Jeweils mit passendem Default-Parameter. Generics wären nice.

      Kommentar


      • #4
        Und warum bleibst du nicht dabei unterschiedliche Typen als Rückgabewert liefern zu können?
        Du kannst für Parameter und Rückgabewerte aus Funktionen unter PHP7 einen Typ angeben, ein Zwang besteht jedoch nicht.

        Kommentar


        • #5
          Weil explizit immer besser ist als implizit

          Kommentar


          • #6
            Wie wäre es mit einem ConfigValue Objekt als Rückgabewert?

            Kommentar


            • #7
              Zitat von SirSnyder Beitrag anzeigen
              Wie wäre es mit einem ConfigValue Objekt als Rückgabewert?
              Daran hatte ich auch schon gedacht. Damit verlagert man das Problem aber nur in die ConfigValue. Dort hätte man ja dann das Problem was man nun in der Config hat

              Ich denke ich muss mich vorerst damit abfinden das die Methode unterschiedliche Typen zurückgeben kann. Eine Lösung mit unterschiedlichen Methoden finde ich grundlegend nicht so schlecht. Richtig anfreunden kann ich mich damit allerdings auch nicht, da man immer wissen muss welchen Wert man gerade auslesen möchte.

              Ich denke im Moment eher in Richtung Config Klassen anstatt einer Datei mit einem Array. Man müsste dann für jeden Wert einen Setter/Getter implementieren.

              Kommentar


              • #8
                Naja, man trennt damit erst mal die Logik um an den Wert zu kommen, von der Logik des eigentlichen Handlings. Grundsätzlich ist die Frage, was machst du mit den Configwerten und ist der Typ entscheidend? Dann könnte das Typehandling im ConfigValue untergebracht werden, zb ConfigValue::isNull(), ConfigValue::getType(), ConfigValue::castTo...

                Kommentar


                • #9
                  Naja, man trennt damit erst mal die Logik um an den Wert zu kommen, von der Logik des eigentlichen Handlings.
                  Das aber wesentlich darin besteht, an den Wert zu kommen, oder?

                  Ich finde die Variante unnötig kompliziert, weil jeder auslesende Code damit potenziell auch noch zu einem potenziell späteren Zeitpunkt (sobald der Wert tatsächlich benötigt wird) mit dem Problem belangt wird, den korrekten Datentypen „sicherzustellen“.

                  Ich würde entweder konkrete Getter schreiben (getMySetting, getMyOtherSetting, …), die jeweils einen definierten Datentypen liefern, oder ich würde, falls das nicht praktikabel ist, bei mixed als Rückgabe bleiben, aber für jedes Setting explizit definieren, welchen Datentypen es liefert. Das geht zwar nicht syntaktisch, aber man kann es immerhin in der Doku oder dergleichen hinterlegen und im zurückgebenden Code auch durchsetzen.

                  PS: Setter braucht man eher nicht. Das kann/sollte im Konstruktor erledigt werden.

                  Kommentar

                  Lädt...
                  X