Wie eine Funktion aufgerufen wird, in sich selbst?
Ich habe eine Funktion, die generiert den Schlüssel von 4 Zeichen, die eindeutig sein muss für jede Zeit. Um dies zu tun, die zuerst die Funktion generiert den Schlüssel, und dann geprüft, ob eine Datenbank-Tabelle, um zu sehen, wenn es in Gebrauch ist von jemand anderem.
Wenn es nicht in Gebrauch ist, gibt es den Schlüssel, sonst ruft es sich wieder, aber dies bewirkt, dass die Funktion eine Endlosschleife, das ist ein no-no. Hier ist die ganze Funktion:
function key_generator($length = 4)
{
//I've subsequently left out the generating code,
//which is not necesarry in this case
$key = 'xxxx';
if ($this->user_model->valid_key($key) == true)
{
return $key;
}
else
{
$this->key_generator(4);
}
}
Was ist der richtige Weg, um die Funktion erneut aufrufen?
Übrigens, ich bin mit CodeIgniter, daher $this
.
- Es heißt Rekursion
- Auch $dieses ist nicht ausschließlich für CodeIgniter.
- Ich glaube, er war einfach zu erklären, wo $es dazu kam und warum er nicht in dem definierten code-snippet.
- $this verwendet wird, für Objekt/Klasse Anwendungsbereich. so lange Ihre Funktion innerhalb einer Klasse und das ist, wo Sie anrufen, dann müssen Sie $this->functionName().. oder self::Funktionsname() wenn es eine statische Funktion. etc etc
Du musst angemeldet sein, um einen Kommentar abzugeben.
Würde ich nicht verwenden rekursive Funktionen für retry-Szenarien (da Sie nicht wiederverwenden, das Ergebnis der Funktion, es ist sinnlos, Rekursion zu verwenden)... Es fügt eine Menge unnötigen Aufwand. Etwas wie das hier tun:
Wenn Sie in der Nähe die maximale Anzahl der keys, wird dies durch eine sehr lange Schleife mal, so möchten Sie vielleicht einige Art von max limit.
Oh, und wenn dies geschieht auf mehreren threads gleichzeitig und Sie überprüft eine Datenbank, sollten Sie implementieren Tabelle schreiben sperren, so dass der gleiche Schlüssel kann nicht eingefügt werden zweimal. Vorzugsweise die Funktion, die prüft, ob eine Taste verfügbar sind, sollte lock, überprüfen, und wenn vorhanden schreiben in der gleichen Transaktion zu vermeiden Kollisionen.
Müssen Sie das Ergebnis des selbst-Anruf, ansonsten ist der gültige Schlüssel nicht bekommen zurückgegeben, sobald Sie es bezieht.
Wenn Sie unbedingt wollen, dass Ihre rekursive Strategie, die Sie haben, um zu definieren, ein Ende Fall. So können Sie zum Beispiel definieren Sie einen Zähler, wie das ist:
Ist es jedoch auch möglich, zu tun deinen code iterativ...
Wenn Sie genug Einzigartigkeit in Ihre Schlüssel-Generierung der routine, die Sie vielleicht in der Lage sein, diese situation zu vermeiden in den ersten Platz. E. g. die routine berücksichtigen den aktuellen Zeitstempel und den lokalen Hostnamen und/oder PID.
Looping in eine solche nicht-deterministische Weise, ist in der Regel der Nachweis einiger zum Teil auch naiv. Das ist nicht gut. 🙂
Jedenfalls, es wäre zumindest eine gute übung, um es zu fangen und melden Sie irgendeine Art von Fehler, im Gegensatz zu hängen Wunsch und schließlich timing:
Warum Sie nicht einfach Scannen Sie den Schlüssel-Wert-Raum für die erste ungenutzten key? Muss der Schlüssel zu erfüllen, die zusätzliche Einschränkungen auf vier Zeichen lang sein und einzigartig?
Sie sich erinnern konnte, die Letzte zurückgegebene Schlüssel, um den Scanvorgang fortzusetzen, von dort auf nachfolgende Aufrufe.
Wenn Sie möchten, dass nachfolgende Aufrufe nicht zurück ähnliche Schlüssel, Sie könnten, mische Ihre Schlüssel zunächst die Datenbank. Dies würde bedeuten, dass Sie brauchen, um eine 456976, 1679616, 7311616, oder 14776336-element-array irgendwo (je nachdem, ob das alphabet verwendet werden, sind single - oder double-Gehäuse-Zeichen, mit oder ohne Ziffern).
Du könntest deinen code in eine Schleife, und ermitteln Sie die Taste iterativ statt
rekursiv.
Beispiel:
Die Schleife sich nicht verhindern, dass eine infinte Schleife, aber im Gegensatz zu einer Funktion aufrufen, diese nicht zu Essen Stapelspeicher, damit Sie nicht das Risiko ein stack-überlauf.
Auch es vereinfacht die Dinge ein wenig. Je nach der Art von Schlüssel Sie können auch anpassen der key-generation-Methode, zum Beispiel mit nummerierten Tasten können Sie erhöhen mit jeder iteration exponentiell.
Bemerkungen: Wenn es möglich ist, verwenden Sie eine Datenbank auto-increment-Funktion anstelle von Rollen Ihrer eigenen Schlüssel-Generierung feature.
Auch stellen Sie sicher, schützen Sie Ihren code gegen gleichzeitigen Zugriff. Was ist, wenn zwei Instanzen dieser Funktion versuchen, einen Schlüssel erzeugen und Sie beide bestimmen das gleiche? Verwenden Sie kritische Abschnitte oder Transaktionen, um sicherzustellen, dass nichts schlimmes passiert.
Mithilfe einer Funktion in sich selbst