Frage

Ich bin mir ziemlich sicher, dass die Antwort auf diese Frage „Nein“ lautet, aber falls es einen PHP-Guru gibt

Ist es möglich, eine Funktion so zu schreiben, dass ungültige Argumente oder nicht vorhandene Variablen übergeben werden können und PHP ohne die Verwendung von keine Fehler verursacht? '@'

Ähnlich wie empty und isset.Sie können eine gerade erstellte Variable übergeben, ohne dass ein Fehler auftritt.

ex:

empty($someBogusVar); // no error

myHappyFunction($someBogusVar); // Php warning / notice
War es hilfreich?

Lösung

zusammenfassend, die richtige Antwort ist Nein, sollten Sie nicht (siehe Vorbehalt unten).

Es gibt Abhilfen bereits von vielen Menschen in diesem Thread erwähnt, wie Referenzvariablen oder isset () oder empty () in Bedingungen und Hinweise in der PHP-Konfiguration zu unterdrücken. Dass zusätzlich zu dem offensichtlichen Problem zu umgehen, mit @, was Sie nicht wollen.

eine interessante Bemerkung Diskussion mit Gerry zusammenfassend: durch Verweis des Variable Passing ist in der Tat gültig, wenn Sie prüfen der Wert der variablen innerhalb der Funktion und nicht definiert oder null Fälle ordnungsgemäß behandeln. Nur nicht Bezug Gang als eine Möglichkeit des Abschaltens PHP (dies ist, wo mein Original soll nicht Punkte) verwenden.

Andere Tipps

Sie erhalten keine Fehlermeldung, wenn Variable als Verweis übergeben wird (PHP wird neuen Variable erstellen leise):

 function myHappyFunction(&$var)
 {       
 }

Aber ich empfehle gegen Missbrauch dieser Programmierfehler zu verstecken.

Sie können tun dies mit func_get_args etwa so:

error_reporting(E_ALL);
ini_set('display_errors', 1);

function defaultValue() {
    $args = func_get_args();

    foreach($args as $arg) {
        if (!is_array($arg)) {
            $arg = array($arg);
        }
        foreach($arg as $a) {
            if(!empty($a)) {
                return $a;
            }
        }
    }

    return false;
}

$var = 'bob';

echo defaultValue(compact('var'), 'alpha') . "\n"; //returns 'bob'
echo defaultValue(compact('var2'), 'alpha') . "\n"; //returns 'alpha'
echo defaultValue('alpha') . "\n"; //return
echo defaultValue() . "\n";

Diese func geht einen Schritt weiter und würden Sie den ersten nicht leeren Wert einer beliebigen Anzahl von Argumenten geben (man es immer nur zwei Argumente nehmen zwingen könnte, aber so aussehen nützlicher mir so).

EDIT: Originalversion nicht kompakt verwenden, um zu versuchen und eine Reihe von args zu machen und noch gab einen Fehler. Fehlerberichterstattung eine Kerbe und diese neue Version mit kompaktem gestoßen ist etwas weniger ordentlich, aber immer noch tut die gleiche Sache und ermöglicht es Ihnen, einen Standardwert für nicht existent Vars zu liefern.

Es gibt Fälle, in denen gültige Prüfung umständlich und unnessesary wird.
Therfore habe ich diese kleine magische Funktion geschrieben:

/**
 * Shortcut for getting a value from a possibly unset variable.
 * Normal:
 *   if (isset($_GET['foo']) && $_GET['foo'] == 'bar') {
 * Short:
 *   if (value($_GET['foo']) == 'bar') {
 *
 * @param mixed  $variable 
 * @return mixed  Returns null if not set
 */
function value(&$variable) {
    if (isset($variable)) {
        return $variable;
    }
}

Es erfordert keine Änderungen an myHappyFunction ().
Sie werden sich ändern müssen

myHappyFunction($someBogusVar);

myHappyFunction(value($someBogusVar));

Die Angabe Ihrer Absicht ausdrücklich. das es gute Praxis in meinem Buch.

Nein, da dies etwas mit der Funktion zu tun ist nicht wirklich; der Fehler kommt aus dem Versuch, einen nicht existierenden Array-Schlüssel de-Referenz. Sie können die Warnstufe Ihrer PHP-Konfiguration ändern, um diese Fehler surpress, aber du bist besser dran, nur dies nicht tun.

Having said that, Sie könnte so etwas wie

function safeLookup($array, $key)
{
  if (isset($array, $key))
    return $array[$key];

  return 0;
}

Und verwenden Sie es anstelle von Array-Schlüssel-Lookup

defaultValue(safeLookup($foo, "bar"), "baz);

Jetzt muss ich eine Dusche nehmen:)

  

ist es möglich, eine Funktion in einer Weise, wo ungültige Argumente oder nicht vorhandenen Variablen zu schreiben, kann in und PHP weitergegeben wird nicht Fehler ohne die Verwendung von ‚@‘

Ja, Sie können!

porneL ist richtig [edit: Ich habe nicht genug Punkte, um seine Antwort zu verbinden oder sie stimmen, aber es ist auf dieser Seite]

Er ist auch richtig, wenn er warnt: „Aber ich empfehlen gegen diese missbrauchen für Programmierfehler zu verbergen.“ jedoch Fehlerunterdrückung über das Error Control Operator (@) sollte auch für diesen gleichen Grund vermieden werden.

Ich bin neu Überlauf Stack, aber ich hoffe, dass es nicht üblich ist, für eine falsche Antwort der höchsten auf einer Seite Platz, während die richtige Antwort Nein-Stimmen erhält. : (

  

@ Brian: Ich benutze einen trinary Betrieb den Scheck für mich zu tun:

return $value ? $value : $default;

Dies gibt entweder $ Wert OR $ Standard. Je nach dem Wert von $ value. Wenn es 0 ist, falsch, leer oder ähnliches der Wert in $ Standard zurückgegeben.

Ich bin bereit für die Herausforderung mehr gehen zu emulieren Funktionen wie empty () und isset ()

@Sean wurde die bereits von Brian antwortet

return isset($input) ? $input : $default;

Sean, könnten Sie tun:

$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';

EDIT:

  

Ich bin sicher, dass es ein großer sein könnte   Diskussion über ternäre Operatoren vrs   Funktion aufruft. Aber der Punkt von diesem   Frage war, ob wir ein erstellen   Funktion, die einen Fehler nicht werfen, wenn   ein nicht existent Wert wird übergeben   ohne Verwendung des '@'

Und ich habe dir gesagt, überprüfen Sie es mit isset(). Ein erster Teil des ternären bedingten prüft nicht null oder nicht null ist, überprüft er true oder false. Wenn Sie versuchen, true oder false auf einen Nullwert in PHP zu überprüfen, erhalten Sie diese Warnungen. isset() prüft, ob eine Variable oder einen Ausdruck gibt einen Nullwert oder nicht, und es gibt einen boolean, die durch den ersten Teil der ternären ohne Fehler ausgewertet werden können.

Ich bin sicher, dass es eine große Diskussion über ternäre Operatoren sein könnte vrs Anrufe funktionieren. Aber der Sinn dieser Frage war, ob wir eine Funktion erstellen, die nicht einen Fehler aus, wenn ein nicht existent Wert übergeben wird, ohne die Verwendung von ‚@‘

Während die Antwort auf die ursprüngliche Frage „nein“ ist, gibt eine Options ist niemand erwähnt hat.

Wenn Sie das @ -Zeichen verwenden, werden alle PHP macht, ist die error_reporting Ebene überschreiben und auf Null setzen es vorübergehend. Sie können „ini_restore('error_reporting');“ verwenden, um es zurückwerfen, um was auch immer es war, bevor die @ verwendet wurde.

Das war ich in der Situation nützlich, wo ich eine Komfortfunktion schreiben wollte zu überprüfen und sehen, ob eine Variable gesetzt war, und hatte auch einige andere Eigenschaften, andernfalls einen Standardwert zurück. Aber eine unset Variable durch verursachte eine PHP-Mitteilung zu senden, so habe ich das @, das zu unterdrücken, aber dann setzte error_reporting wieder auf den ursprünglichen Wert innerhalb der Funktion.

So etwas wie:

$var = @foo($bar);

function foo($test_var)
{
     ini_restore('error_reporting');

     if(is_set($test_var) && strlen($test_var))
     {
          return $test_var;
     }
     else
     {
          return -1;
     }
}

So, oben in dem Fall, wenn $bar nicht gesetzt ist, werde ich nicht einen Fehler, wenn ich foo() mit einem nicht existierenden Variable nennen. Allerdings habe ich einen Fehler innerhalb der Funktion, wo ich is_set statt isset irrtümlich eingegeben haben.

Dies ist eine nützliche Option sein könnte abdeckt, was die ursprüngliche Frage im Geist fragt, ob nicht in Wirklichkeit.

Wenn Sie einfach einen Standardwert auf den Parameter hinzufügen, können Sie es überspringen, wenn die Funktion aufgerufen wird. Zum Beispiel:

function empty($paramName = ""){
    if(isset($paramName){
        //Code here
    }
    else if(empty($paramName)){
        //Code here
    }
}

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

Ich hoffe, das ist das, was Sie suchen. Wenn Sie die PHP-Dokumentation unter Standardargument Werte lesen, können Sie sehen, dass die Zuordnung ein Standardwert auf ein Argument der Funktion hilft Ihnen, eine Fehlermeldung zu verhindern, wenn Funktionen.

In diesem Beispiel können Sie den Unterschied der Verwendung eines Standardargument sehen und es ist Vorteile:

PHP-Code:

<?php
function test1($argument)
{
    echo $argument;
    echo "\n";
}

function test2($argument="")
{
    echo $argument;
    echo "\n";
}

test1();
test1("Hello");
test1($argument);
$argument = "Hello world";
test1($argument);

test2();
test2("Hello");
test2($argument);
$argument = "Hello world";
test2($argument);
?>

Ausgabe für test1() Zeilen:

  

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

Ausgabe für test2() Zeilen:

  

.
  Hallo.
  
  Hallo Welt.

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

Und noch weiter oben in der Abstraktion Baum, was Sie diese verwenden für?

Sie können entweder diese Werte in jeder Klasse entsprechend initialisieren oder eine bestimmte Klasse erstellen, um alle Standardwerte und Attribute enthalten, wie:

class Configuration {

    private var $configValues = array( 'cool' => 'Defaultcoolval' ,
                                       'uncool' => 'Defuncoolval'  );

    public setCool($val) {
        $this->configValues['cool'] = $val;
    }

    public getCool() {
        return $this->configValues['cool'];
    }

}

Die Idee, dass sein, wenn default Funktion überall nach oben und unten in Ihrem Code verwendet, wird es ein Wartungs Alptraum werden, wenn Sie einen Wert ändern müssen, auf der Suche für alle Orte, wo man einen Anruf default gesetzt hat. Und es wird auch wahrscheinlich führen Sie ein, sich zu wiederholen, DRY verletzen.

Während dies ein einziger Ort ist all diese Werte standardmäßig zu speichern. Sie könnten versucht sein, zu vermeiden Sie die Getter und Setter zu schaffen, sondern sie helfen auch bei der Wartung, im Fall becomse einschlägig gewisse Modifikation der Ausgänge oder Validierung von Eingaben zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top