Domanda

Sono abbastanza sicuro che la risposta a questa domanda è no, ma in caso c'è qualche guru di PHP

è possibile scrivere una funzione in un modo in cui gli argomenti non validi o inesistenti le variabili possono essere passati in php e non di errore, senza l'uso di '@'

Molto simile a vuoto e isset fare.È possibile passare una variabile che hai appena fatto e non di errore.

ex:

empty($someBogusVar); // no error

myHappyFunction($someBogusVar); // Php warning / notice
È stato utile?

Soluzione

Riassumendo, la risposta corretta è no, non si deve (vedi avvertenza di seguito).

Ci sono soluzioni alternative già detto da molte persone, in questo thread, come l'utilizzo di variabili di riferimento o isset() o vuoto() in condizioni e repressione di bandi e avvisi di configurazione di PHP.Che, oltre alla ovvia soluzione, usando @, che non vuoi.

Riassumendo un commento interessante discussione con Gerry:Passando la variabile di riferimento è infatti valido se si controllare il valore della variabile all'interno della funzione e gestire indefinito o null casi in modo corretto.Basta non usare riferimento passando come un modo di chiusura PHP-up (questo è dove la mia originale non dovrebbe punti).

Altri suggerimenti

Non si ottiene alcun errore quando la variabile passata per riferimento (PHP creare nuova variabile in silenzio):

 function myHappyFunction(&$var)
 {       
 }

Ma mi raccomando contro l'abuso di questo per nascondere gli errori di programmazione.

È possibile eseguire questa operazione utilizzando func_get_args in questo modo:

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";

Questo func va un passo oltre e vi darà il primo non vuoto valore di un qualsiasi numero di argomenti (non sempre si può forzare a prendere solo fino a due argomenti, ma questo aspetto più utile per me come questo).

EDIT:versione originale non usare, compatto per provare a creare un array di argomenti e ANCORA ha dato un errore.Segnalazione errori urtato una tacca e questa nuova versione con la compact è un po ' meno ordinato, ma ancora fa la stessa cosa e consente di specificare un valore predefinito per inesistenti vars.

Ci sono validi i casi in cui il controllo diventa ingombrante e unnessesary.
Per questo ho scritto questa piccola magia funzione:

/**
 * 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;
    }
}

Non richiede alcuna modifica myHappyFunction().
Dovrete cambiare

myHappyFunction($someBogusVar);

per

myHappyFunction(value($someBogusVar));

Indicando il vostro intento esplicitamente.il che rende buone pratiche nel mio libro.

No, perché questo non è davvero nulla a che fare con la funzione;l'errore proviene dal tentativo di de-riferimento inesistenti chiave dell'array.È possibile modificare il livello di avviso della vostra configurazione PHP, allo scopo di sopprimere questi errori, ma è meglio non farlo.

Detto questo, non si potrebbe fare qualcosa di simile

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

  return 0;
}

E utilizzare al posto di un array chiave di ricerca

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

Ora ho bisogno di fare una doccia :)

è possibile scrivere una funzione in un modo in cui gli argomenti non validi o inesistenti le variabili possono essere passati in php e non di errore, senza l'uso di '@'

Sì, è possibile!

porneL è corretta [edit:non ho abbastanza punti di collegamento per la sua risposta o voto, ma è su questa pagina]

Egli è corretto, ma quando avverte "Ma mi raccomando contro l'abuso di questo per nascondere gli errori di programmazione." tuttavia la soppressione degli errori tramite il Controllo di Errore dell'Operatore (@) deve essere evitata per questo stesso motivo.

Sono nuovo di Overflow dello Stack, ma spero che non è comune per una risposta errata per essere classificato il più alto di una pagina, mentre la risposta corretta non riceve voti.:(

@Brian:Io uso un trinary funzionamento a fare il check per me:

return $value ? $value : $default;

questo restituisce il valore in dollari O $default.A seconda del valore di $di valore.Se è 0, false o qualcosa di simile, il valore in $default verrà restituito.

Io sono più per la sfida di emulare le funzioni come empty() e isset()

@Sean Che è stato già risposto da Brian

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

Sean, si potrebbe fare:

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

EDIT:

Sono sicuro che ci potrebbe essere una grande discussione su ternario operatori vrs chiamate di funzione.Ma il punto è questo la domanda era per vedere se siamo in grado di creare un funzione che non genera un errore se un inesistente valore è passato in senza l'utilizzo di la '@'

E io ti ho detto, di controllare con isset().Un condizionale ternario prima parte non controlla null o not null, controlla true o false.Se si tenta di controllare true o false su un valore null in PHP, si arriva a questi avvertimenti. isset() controlla se una variabile o un'espressione restituisce un valore null o non, e restituisce un valore booleano, che possono essere valutati con la prima parte del tuo ternario senza errori.

Sono sicuro che ci potrebbe essere una grande discussione su ternario operatori vrs chiamate di funzione.Ma il punto della questione era quello di vedere se siamo in grado di creare una funzione che non genera un errore se un inesistente valore viene passato senza l'utilizzo di la '@'

Mentre la risposta alla domanda è "no", c'è un'opzione che nessuno ha citato.

Quando si utilizza il segno@, tutte PHP fa l'override del error_reporting livello e temporaneamente l'impostazione a zero.È possibile utilizzare "ini_restore('error_reporting');"per riportarlo a quello che era prima della @ è stato utilizzato.

Questo è stato utile per me in una situazione in cui ho voluto scrivere una funzione comfort per verificare se una variabile è stata impostata, e aveva alcune altre proprietà, come pure, in caso contrario, restituisce un valore di default.Ma, l'invio di una variabile attraverso causato un PHP preavviso, così ho usato la @ per sopprimere, ma poi impostare error_reporting al valore originale all'interno della funzione.

Qualcosa di simile a:

$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;
     }
}

Così, nel caso di cui sopra, se $bar non è impostato, non si ottiene un messaggio di errore quando mi chiamano foo() con un inesistente variabile.Tuttavia, mi metterò un errore all'interno della funzione in cui ho erroneamente digitato is_set invece di isset.

Questo potrebbe essere un'opzione utile che concerne la domanda originale era di chiedere nello spirito, se non nella realtà.

Se devi semplicemente aggiungere il valore predefinito per il parametro, si può saltare quando si chiama la funzione.Per esempio:

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

Con una singola linea per la realizzazione di esso: myHappyFunction($someBogusVar="");

Spero che questo è quello che stai cercando.Se leggi la documentazione di php, sotto argomento di default i valori, si può vedere che l'assegnazione di un valore di default ad una funzione dell'argomento aiuta a prevenire un messaggio di errore quando si utilizzano funzioni.

In questo esempio si può vedere la differenza di utilizzo di un argomento di default e i suoi vantaggi:

Codice PHP:

<?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);
?>

Uscita per test1() linee:

Avviso:Missing argument 1 for test1() .
Ciao.
.
Ciao mondo.

Uscita per test2() linee:

.
Ciao.

Ciao mondo.

Questo può anche essere utilizzato in combinazione a isset() e altre funzioni, per realizzare ciò che si desidera.

E andando più in alto di astrazione albero, che cosa si sta utilizzando questo?

È possibile inizializzare i valori in ogni classe oppure di creare una classe che contiene tutti i valori di default e gli attributi, come:

class Configuration {

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

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

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

}

L'idea è che, quando si utilizza defaultValue funzione ovunque su e giù nel tuo codice, diventerà un incubo nella manutenzione ogni volta che devi cambiare un valore, alla ricerca di tutti i luoghi in cui hai messo un defaultValue chiamata.E sarà anche probabilmente porterà a ripetere a te stesso, violando il LAVAGGIO.

Considerando che questo è un singolo posto per memorizzare tutti i valori di default.Si potrebbe essere tentati di evitare la creazione di quelle setter e getter, ma aiutano anche nella manutenzione, nel caso in cui becomse pertinenti per fare la modifica di alcune uscite di convalida o di ingressi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top