PHP-Funktion Argument Fehler Unterdrückung, empty () isset () Emulation

8

Ich bin mir ziemlich sicher, dass die Antwort auf diese Frage nein ist, aber falls es einen PHP-Guru gibt

ist es möglich, eine Funktion so zu schreiben, dass ungültige Argumente oder nicht existierende Variablen übergeben werden können und php ohne die Verwendung von '@'

kein Fehler ist

Ähnlich wie leer und isset. Sie können eine Variable übergeben, die Sie gerade erfunden haben, und es wird kein Fehler auftreten.

%Vor%     
SeanDowney 10.09.2008, 19:09
quelle

14 Antworten

8

Zusammenfassend ist die richtige Antwort nein, Sie sollten nicht (siehe unten).

Es gibt Workarounds, die von vielen Leuten in diesem Thread bereits erwähnt wurden, wie die Verwendung von Referenzvariablen oder isset () oder empty () in Bedingungen und die Unterdrückung von Hinweisen in der PHP-Konfiguration. Das zusätzlich zu der offensichtlichen Problemumgehung mit @, die Sie nicht möchten.

Fassen Sie eine interessante Kommentardiskussion mit Gerry zusammen: Die Übergabe der Variable per Referenz ist in der Tat gültig, wenn Sie nach suchen der Wert der Variablen innerhalb der Funktion und unkorrekte oder Null-Fälle richtig behandeln. Verwenden Sie die Referenzübergabe nicht als Möglichkeit, PHP hochzufahren (hier sollte mein Original nicht zeigen).

    
Vinko Vrsalovic 10.09.2008, 20:09
quelle
7

Sie erhalten keinen Fehler, wenn die Variable als Referenz übergeben wird (PHP erstellt automatisch eine neue Variable):

%Vor%

Aber ich empfehle dies nicht zu missbrauchen, um Programmierfehler zu verbergen.

    
Kornel 23.11.2008 00:32
quelle
3

Sie können dies mit func_get_args wie folgt tun:

%Vor%

Diese Funktion geht noch einen Schritt weiter und würde Ihnen den ersten nicht leeren Wert einer beliebigen Anzahl von Argumenten geben (Sie könnten es immer zwingen, nur bis zu zwei Argumente zu verwenden, aber das sieht für mich besser so aus).

>

EDIT: ursprüngliche Version nicht verwendet, um zu versuchen, ein Array von Argumenten zu machen und STILL gab einen Fehler. Die Fehlerberichte sind eine Stufe höher geworden und diese neue Version mit Kompakt ist etwas weniger aufgeräumt, macht aber immer noch dasselbe und erlaubt Ihnen, einen Standardwert für nicht vorhandene Vars anzugeben.

    
reefnet_alex 10.09.2008 19:46
quelle
1

Nein, weil das mit der Funktion eigentlich nichts zu tun hat; Der Fehler tritt auf, wenn versucht wird, einen nicht vorhandenen Array-Schlüssel zu referenzieren. Sie können die Warnstufe Ihres PHP-Setups ändern, um diese Fehler zu unterdrücken, aber Sie tun dies besser nicht.

Nachdem Sie das gesagt haben, könnten Sie etwas tun wie

%Vor%

Und verwenden Sie es anstelle von Array-Schlüsselsuche

%Vor%

Jetzt muss ich duschen:)

    
Adam Wright 10.09.2008 19:12
quelle
1
  

ist es möglich, eine Funktion so zu schreiben, dass ungültige Argumente oder nicht existierende Variablen übergeben werden können und php ohne die Verwendung von '@'

kein Fehler ist

Ja, das kannst du!

porneL ist korrekt [Bearbeiten: Ich habe nicht genug Punkte, um auf seine Antwort zu verlinken oder abzustimmen, aber es ist auf dieser Seite]

Er ist auch richtig, wenn er warnt "Aber ich empfehle, dies zu missbrauchen, um Programmierfehler zu verbergen." Aus demselben Grund sollte jedoch auch eine Fehlerunterdrückung über den Error Control Operator (@) vermieden werden.

Ich bin neu bei Stack Overflow, aber ich hoffe, dass es nicht üblich ist, dass eine falsche Antwort auf einer Seite am höchsten bewertet wird, während die richtige Antwort keine Votes erhält. : (

    
Gerry 19.05.2009 20:09
quelle
1

Es gibt gültige Fälle, in denen die Überprüfung umständlich und unnötig wird.
Deshalb habe ich diese kleine magische Funktion geschrieben:

%Vor%

Es erfordert keine Änderungen an myHappyFunction ().
Du musst das ändern

%Vor%

bis

%Vor%

Ihre Absicht explizit angeben. Das macht es gute Praxis in meinem Buch.

    
Bob Fanger 08.12.2009 14:46
quelle
0
  

@Brian: Ich benutze eine Trinary-Operation, um die Überprüfung für mich durchzuführen:

%Vor%

gibt entweder $ value oder $ default zurück. Abhängig vom Wert von $ value. Wenn es 0, false, leer oder ähnliches ist, wird der Wert in $ default zurückgegeben.

Ich bin mehr für die Herausforderung emuliert Funktionen wie empty () und isset ()

    
SeanDowney 10.09.2008 19:18
quelle
0

@Sean Das wurde schon von Brian

beantwortet %Vor%     
Vinko Vrsalovic 10.09.2008 19:46
quelle
0

Sean, könnten Sie tun:

%Vor%

BEARBEITEN:

  

Ich bin mir sicher, dass es großartig sein könnte   Diskussion über ternäre Betreiber vrs   Funktionsaufrufe. Aber der Sinn davon   Frage war zu sehen, ob wir ein erstellen können   Funktion, die keinen Fehler verursacht, wenn   Ein nicht vorhandener Wert wird übergeben   ohne das '@'

zu benutzen

Und ich habe es dir gesagt, überprüfe es mit isset() . Der erste Teil einer ternären Bedingung überprüft nicht null oder nicht null, überprüft true oder false . Wenn Sie true oder false auf einen Nullwert in PHP überprüfen, erhalten Sie diese Warnungen. isset() überprüft, ob eine Variable oder ein Ausdruck einen Nullwert zurückgibt oder nicht, und gibt einen booleschen Wert zurück, der ohne Fehler vom ersten Teil des Ternärs ausgewertet werden kann.

    
Brian Warshaw 10.09.2008 19:49
quelle
0

Ich bin mir sicher, dass es eine gute Diskussion über Ternary Operators Vrs Function Calls geben könnte. Aber der Zweck dieser Frage war zu sehen, ob wir eine Funktion erstellen können, die keinen Fehler auslöst, wenn ein nicht existierender Wert ohne Verwendung des '@' / p> übergeben wird     

SeanDowney 10.09.2008 19:33
quelle
0

Während die Antwort auf die ursprüngliche Frage "nein" ist, gibt es eine Option, die niemand erwähnt hat.

Wenn Sie das @ -Zeichen verwenden, überschreibt PHP nur den error_reporting -Pegel und setzt ihn vorübergehend auf Null. Sie können " ini_restore('error_reporting'); " verwenden, um es auf das zurückzusetzen, was es vor der Verwendung von @ war.

Dies war nützlich für mich in der Situation, in der ich eine praktische Funktion schreiben wollte, um zu überprüfen, ob eine Variable gesetzt war, und auch andere Eigenschaften hatte, ansonsten einen Standardwert zurückgeben. Aber das Senden einer nicht gesetzten Variable durch verursachte einen PHP-Hinweis, also habe ich das @ verwendet, um das zu unterdrücken, aber dann error_reporting auf den ursprünglichen Wert innerhalb der Funktion zurückzusetzen.

Etwas wie:

%Vor%

Wenn also im obigen Fall $bar nicht gesetzt ist, erhalte ich keinen Fehler, wenn ich foo() mit einer nicht existierenden Variable anrufe. Ich erhalte jedoch einen Fehler in der Funktion, in der ich fälschlicherweise is_set anstelle von isset eingegeben habe.

Dies könnte eine sinnvolle Option sein, um zu beschreiben, was die ursprüngliche Frage im Geiste gefragt hat, wenn nicht tatsächlich.

    
Arthur McLean 02.02.2009 19:09
quelle
0

Wenn Sie dem Parameter einfach einen Standardwert hinzufügen, können Sie ihn beim Aufruf der Funktion überspringen. Zum Beispiel:

%Vor%     
BraedenP 31.05.2009 07:34
quelle
0

Mit einer einzigen Zeile können Sie es erstellen: myHappyFunction($someBogusVar="");

Ich hoffe, dass Sie das suchen. Wenn Sie die PHP-Dokumentation lesen, sehen Sie unter Standardargumentwerte , dass Sie einem Standard einen Standardwert zuweisen Das Argument der Funktion hilft Ihnen, eine Fehlermeldung zu vermeiden, wenn Sie Funktionen verwenden.

In diesem Beispiel sehen Sie den Unterschied zwischen der Verwendung eines Standardarguments und seinen Vorteilen:

PHP-Code:

%Vor%

Ausgabe für test1() -Zeilen:

  

Warnung : Argument 1 für test1 () fehlt.
  Hallo.
  .
  Hallo Welt.

Ausgabe für test2() -Zeilen:

  

.
  Hallo.

  Hallo Welt.

Dies kann auch in Kombination mit isset() und anderen Funktionen verwendet werden, um das zu erreichen, was Sie wollen.

    
Omar 05.06.2012 00:55
quelle
-1

Und weiter oben im Abstraktionsbaum, wofür verwenden Sie das?

Sie können diese Werte in jeder Klasse entweder entsprechend initialisieren oder eine bestimmte Klasse erstellen, die alle Standardwerte und Attribute enthält, wie:

%Vor%

Die Idee ist, dass, wenn Sie die defaultValue-Funktion in Ihrem Code überall auf und ab verwenden, es ein Wartungs-Albtraum wird, wenn Sie einen Wert ändern müssen, indem Sie nach allen Orten suchen, an denen Sie einen DefaultValue-Aufruf gesetzt haben. Und es wird dich wahrscheinlich auch dazu bringen, dich zu wiederholen und DRY zu verletzen.

Während dies ein einzelner Ort ist, um alle diese Standardwerte zu speichern. Sie könnten versucht sein, diese Setter und Getter nicht zu erzeugen, aber sie helfen auch bei der Wartung, falls es notwendig wird, Änderungen an den Ausgaben vorzunehmen oder Eingaben zu validieren.

    
Vinko Vrsalovic 10.09.2008 19:25
quelle