Angenommen, wir möchten eine Funktion zum Speichern von Artikeln vervollständigen, sieht das wahrscheinlich so aus:
<?php function saveArticle($title, $content, $categoryId) { // ... } ?>
Jeder Parameter stellt ein Attribut dar, aber es bringt ein Problem mit sich ist sehr lang geworden. Zu diesem Zeitpunkt wäre es eine gute Idee, Objektprogrammierungstechnologie zu verwenden:
<?php class Article { var $title; var $content; var $categoryId; function save() { // ... } } ?>
Hier werden die ursprünglichen Methodenparameter in Attribute des Objekts umgewandelt, wodurch die Anzahl der Methodenparameter erheblich reduziert wird. Meistens ist diese Methode gut, aber nicht alle Parameter sind geeignet, in Form von Objektattributen zu existieren. Das Prinzip der Differenzierung besteht darin, zu sehen, ob diese Parameter zu den intrinsischen Attributen oder externen Merkmalen des Objekts gehören Wenn sie nicht unterschieden werden, werden sie alle in Objekteigenschaften umgewandelt, wodurch das Objekt selbst bedeutungslos würde.
Zum Beispiel verfügt unser Article-Objekt auch über eine Methode namens find. Bei der Verwendung können Parameter wie Limit, Offset, Reihenfolge usw. beteiligt sein:
<?php class Article { var $title; var $content; var $categoryId; var $limit = 10; var $offset = 0; var $order = 'created DESC'; function save() { // ... } function find($categoryId) { // ... } } ?>
Wie oben gezeigt, Once Wenn wir Parameter wie Limit, Offset und Order in Attribute des Objekts umwandeln, wird das Objekt selbst unscheinbar, denn obwohl Titel, Inhalt und CategoryId als intrinsische Attribute des Objekts gezählt werden können, sind Limit, Offset und Order dies nicht. Bestenfalls können sie nur als äußere Merkmale betrachtet werden. Das Ergebnis, sie nicht zu unterscheiden, ist im Grunde der Beginn eines Albtraums. Daher ist es besser, die externen Merkmale ehrlich in die Parameter der Methode einzufügen (genauer gesagt sollte die Suchmethode eine Methode vom statischen Typ sein, aber der Text ist eine einfache Erklärung, die nicht ins Detail gehen muss):
<?php class Article { var $title; var $content; var $categoryId; function save() { // ... } function find($categoryId, $limit = 10, $offset = 0, $order = 'created DESC') { // ... } } ?> 可惜如此一来又出现了文章开头所说的问题,find方法的参数太多了,缺乏可读性,所以还得重构: <?php class Article { var $title; var $content; var $categoryId; function save() { // ... } function find($categoryId, $options = array()) { $default = array( 'limit' => 10, 'offset' => 0, 'order' => 'created DESC' ); $options = array_merge($default, (array)$options); // ... } } ?>
Sie können beim Aufruf eine Methode ähnlich der folgenden verwenden:
$article->find(123, array('limit' => 20));
Um es einfach auszudrücken: Es verwendet Array-Parameter, um einen ähnlichen Effekt wie Schlüsselwortparameter zu simulieren Sie können also die Schlüsselnamen des Arrays verwenden, um die Funktion der Parameter zu beschreiben und so die Lesbarkeit des Codes zu erhöhen. Refactoring-Methoden wie diese werden häufig in Projekten wie CakePHP verwendet. Wenn Sie sie sorgfältig verstehen, können Sie beim Schreiben von Code instinktiv gut lesbaren Code schreiben.
Zusätzlich: Im Vergleich zu array_merge ist die Verwendung von $options += $default ebenfalls eine gute Wahl. Wenn die Logik von Optionen sehr komplex ist, können Sie außerdem anstelle eines Arrays auch ein Array verwenden, um die logischen Operationen mithilfe eines speziellen Objekts zu kapseln.
Das obige ist der detaillierte Inhalt vonRefactoring von PHP-Multiparametermethoden (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!