Frage Ist es möglich, dass eine PHP-Funktionsvariable String oder Array, Pattern oder Anti-Pattern ist?


Kommen von C # Ich bin es gewohnt, meine Methoden mit variabel typisierten Parametern zu überladen. Da kannst du das nicht machen PHPIch erstelle oft Methoden wie das folgende Beispiel, das eine Variable akzeptiert, dann I Überprüfen Sie den Typ und handle entsprechend:

showLength('one');
showLength(array(
    'one',
    'two',
    'three'
));

function showLength($stringOrArray) {
    $arr = array();
    if(is_array($stringOrArray)) {
       $arr = $stringOrArray;
    } else if(is_string($stringOrArray)) {
       $arr[] = $stringOrArray;
    } else {
        //exception
    }
    foreach ($arr as $str) {
        echo strlen($str).'<br/>';
    }
}

Ausgabe:

3
3
3
5
4

Dies gibt mir die gleiche Funktionalität wie in C #, aber es scheint ein bisschen chaotisch, als ob es einen besseren Weg gibt.

Ist dies der akzeptierte Weg, um Methodenüberladen in PHP durchzuführen (5.3) oder gibt es einen besseren Weg?


6
2018-01-20 13:46


Ursprung


Antworten:


Ich weiß, dass viele Frameworks dies für bestimmte Funktionen tun, wo es sinnvoll ist, wie auch einige der Kernfunktionen von PHP. Der Unterschied zwischen "guten" und "schlechten" Verwendungen ist für mich die Dokumentation (Docblock). Die Dokumentation muss angeben, dass der Parameter vom Typ gemischt ist und die verschiedenen zulässigen Variablentypen.

Beispielsweise:

<?php
/**
  * Function used to assign roles to a user
  * @param int   $user_id The user's id
  * @param mixed $role    Either a string name of the role 
  *                       or an array with string values
  *
  * @return bool on success/failure
  */ 
function addRole($user_id, $role) {
  if (!is_array($role)) {
    $role = array($role);
  }

  foreach($role as item) {
    Model::addRole($item);
  }

  return true;
}

11
2018-01-20 13:51



Wie Sie gesagt haben, gibt es nicht wirklich eine Methode, um mehrere Typ-Parameter in PHP wie C # zu akzeptieren, aber dies sollte keine Probleme verursachen, solange Sie überprüfen, welchen Typ die Parameter haben, bevor Sie etwas damit machen.

Viele native PHP-Funktionen akzeptieren gemischte Typ-Parameter, z. str_replace ().


3
2018-01-20 13:56



Ich mag es nicht, ein totes Pferd zu besiegen, aber trotzdem werde ich hier wiegen.

Ich würde es nicht als ein Anti-Muster betrachten; Wie @Merijn hervorhebt, akzeptieren viele native PHP-Funktionen gemischte Typparameter. Darüber hinaus erfordern viele Umstände wie Ihre eigenen, dass für die Kürze die Funktion ein Element oder eine Sammlung eines bestimmten Typs akzeptiert, anstatt es über zwei Funktionen zu teilen.

Casting zu (array) ist eine schnelle und einfache Möglichkeit, diese Funktionalität zu erreichen:

function printStuff($stuff)
{
    foreach((array) $stuff as $key => $value) {
        echo sprintf('%d : %s', $key, $value) . PHP_EOL;
    }
}

printStuff("foo");
// 0 : foo

printStuff(array("foo", "bar", "qux"));
// 0 : foo
// 1 : bar
// 2 : qux

Verwenden $foo = (array) $foo; ist besser1 als $foo = array($foo); als wenn $foo ist bereits ein Array, es wird es nicht erneut umbrechen.


Referenz


1 Erzeugt die gewünschten Ergebnisse mit Skalaren; Objekte erzeugen unterschiedliche Ergebnisse. Objekte, die in ein Array umgewandelt werden, listen die Eigenschaften auf. Verwenden Sie daher Diskretion. 


3
2018-05-20 16:40