3 Stimmen

wie man eine Funktion mit einem nicht-optionalen Argument, das als drittes definiert ist, verwendet

Ich verwende die Klasse einer anderen Person und diese Person hat eine Funktion mit fünf Argumenten definiert.

in Sentry.php:

function checkLogin($user = '',$pass = '',$group = 10,$goodRedirect = '',$badRedirect = '')

Wenn alle fünf Felder ausgefüllt sind, führt dies zu einer Anmeldeprozedur.

Auf der Seite, auf der er erklärt, wie man das benutzt, gibt es ein Snippet, das laut php.net keinen Sinn macht.

in einer Seite, die den Wächter lädt:

require_once('../system/Sentry.php');
$theSentry = new Sentry();
if(!$theSentry->checkLogin(2)){ header("Location: login.php"); die(); }

die sich standardmäßig so verhalten sollte, dass sie prüft, ob das Argument $group <= 10 ist (Standardeinstellung). In diesem Fall sollte es zwei sein. Wenn der überprüfte Benutzer eine Gruppenvariable von <=2 hat, sollte dies der Person ermöglichen, die Seite zu sehen.

Das funktioniert jedoch nicht, und zwar aus einem sehr offensichtlichen Grund: Im php-Handbuch steht:

Beachten Sie, dass bei der Verwendung von Standard Argumente, alle Standardwerte auf der auf der rechten Seite der Nicht-Standard Argumenten stehen sollten; andernfalls werden die Dinge nicht wie erwartet funktionieren.

Der Code sollte also laut phpbuilder.com keine optionalen ( $variable = default_something ) mit einem Funktionsaufruf auszufüllen, und es sollte definitiv nicht als drittes von fünf Argumenten definiert werden.

Wie kann ich die Funktion auf diese Weise nutzen?

checkLogin(2)

9voto

Mythica Punkte 1112

Standardargumente sind die Art und Weise, wie PHP mit dem Mangel an überladenen Funktionen umgeht. In Java können Sie dies schreiben:

public void login(String username)
public void login(String username, String password)

In PHP müssen Sie das Problem folgendermaßen lösen:

function login($username, $password = '')

Auf diese Weise ist $username obligatorisch und $password ist optional. Das mag zwar bequem sein, ist es aber nicht immer. In Ihrem Beispiel gibt es eine Reihe von Argumenten und sie sind alle optional. Eine saubere Lösung für dieses Problem wäre, eine Funktion zu erstellen, die die Arbeit erledigt, und "Komfort"-Methoden hinzuzufügen, um die Schnittstelle sauberer zu gestalten.

Fügen Sie also hinzu:

function checkLoginGroup($group = 10) {
  $this->checkLogin('', '', $group);
}

Es ruft einfach die Funktion auf, die bereits existiert, aber es ermöglicht eine sauberere Schnittstelle, einfach aufrufen:

$theSentry->checkLoginGroup(2);

Noch besser ist es, die bereitgestellte Methode privat (oder geschützt, je nach Bedarf) zu machen und öffentliche "Convenience"-Methoden zu erstellen, damit Sie die Implementierungsdetails verbergen können.

Wenn Sie jedoch die ursprüngliche Klasse nicht ändern können oder wollen, können Sie möglicherweise eine Unterklasse erstellen.

1voto

Pascal MARTIN Punkte 384469

Die Reihenfolge der Argumente zu ändern ist eine Möglichkeit... Aber was ist mit der Zeit, wenn Sie ein weiteres Argument benötigen, um " optionaler " oder " weniger fakultativ " ? Werden Sie diese Reihenfolge wieder ändern?
Und damit wird jeder Aufruf der Funktion ?

Um nur das dritte Argument zu übergeben, sehe ich angesichts der Deklaration Ihrer Funktion nur die Möglichkeit, die drei ersten Argumente zu übergeben... Übergabe des Standardwerts (was Sie natürlich wissen müssen - sehen Sie sich dazu einfach die Erklärung an) für die ersten beiden :

checkLogin('', '', 20);

Meiner Meinung nach ist es besser, dieses statt jenes zu verwenden:

checkLogin(null, null, 20);

Das hat den Vorteil, dass es explizit ist: Jemand, der sich die Deklaration der Funktion ansieht, wird sofort bemerken, dass Sie die Standardwerte für die ersten beiden Parameter verwenden.

Verwendung von NULL müsste die Person, die Ihren Code liest, im Code der Funktion nachsehen, ob NULL wird auf besondere Weise behandelt (es könnte ja doch sein!) ; es wäre nicht so einfach für jemanden zu verstehen, dass dies deine Art ist, Standardwerte zu übergeben... Da sie nicht die Standardwerte sind ^^

Andere Lösungen würden ein Refactoring der Funktion bedeuten,

So oder so würden Sie die Fähigkeit Ihrer IDE verlieren, Ihnen die Parameter anzuzeigen, auf die die Funktion wartet; und das ist schlecht :-(
Und Sie würden auch den PhD verlieren...

1voto

deceze Punkte 489288

Zusätzlich zu Mythicas ausgezeichnete Antwort Ich möchte nur auf eine andere Art des Umgangs mit vielen optionalen Argumenten hinweisen: Arrays.

function checkLogin($args) {
    $defaults = array('user' => null, 'pass' => null, 'group' => null, ...);
    $args = array_merge($defaults, $args);
    ...
}

checkLogin(array('user' => 'x', 'group' => 9));

Dies umgeht im Wesentlichen PHPs optional/erforderlich Argument Syntax vollständig und stattdessen benutzerdefinierte behandelt diese Dinge intern. Dies hat den Vorteil, dass das von Ihnen beschriebene Problem vermieden wird und der Funktionsaufruf extrem lesbar ist. Das Problem ist, dass die Funktion dadurch komplexer wird und Sie nicht den Vorteil nutzen können, dass PHP das Vorhandensein von Argumenten für Sie überprüft.

0voto

da5id Punkte 8980

Am einfachsten ist es, die Reihenfolge der Argumente so zu ändern, dass $group an erster Stelle steht.

-1voto

Rufinus Punkte 26730
checkLogin(NULL,NULL,2);

aber ehrlich gesagt ein schlechter Kodierungsstil.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X