Perché molti sviluppatori PHP odiano l'uso di isset () e / o di una delle funzioni difensive simili di PHP come empty ()?

25

Over su stackoverflow, vedo che questo problema è sempre in crescita:

Anche Pekka (che offre molti consigli solidi su PHP) è scappato contro il temuto mostro E_NOTICE e speravo per una soluzione migliore rispetto all'utilizzo di isset() : isset () e empty () rendono il codice brutto

Personalmente, uso isset() e empty() in molti posti per gestire il flusso delle mie applicazioni. Ad esempio:

public function do_something($optional_parameter = NULL) {
    if (!empty($optional_parameter)) {
        // do optional stuff with the contents of $optional_parameter
    }
    // do mandatory stuff
}  

Anche un semplice frammento di questo tipo:

if (!isset($_REQUEST['form_var'])) {
    // something's missing, do something about it.
}

mi sembra molto logico. Non sembra gonfiare, sembra un codice stabile. Ma molti sviluppatori attivano le loro applicazioni con E_NOTICE abilitato, scoprono un sacco di frustranti "indici di array non inizializzati" e poi fanno una smorfia alla prospettiva di controllare le variabili definite e "sporcare" il loro codice con isset() .

Suppongo che altri linguaggi gestiscano le cose in modo diverso. Parlando dall'esperienza, JavaScript non è educato come PHP. Una variabile non definita in genere fermerà l'esecuzione dello script. Inoltre, (parlando da inesperienza ) sono sicuro che linguaggi come C / C ++ semplicemente rifiuterebbero di compilare.

Quindi, gli sviluppatori PHP sono semplicemente pigri? (non parliamo di te, Pekka, so che stavi rifattorizzando una vecchia applicazione.) O altri linguaggi gestiscono le variabili non definite più con garbo che richiedere al programmatore di controllare prima se sono definite?

(So che ci sono altri E_NOTICE messaggi oltre alle variabili non definite, ma quelli sembrano essere quelli che causano la maggior dispiacere)

Addendum
Dalle risposte fino ad ora, non sono l'unico a pensare che isset() non sia un codice gonfiato. Quindi, mi chiedo ora, ci sono problemi con i programmatori in altre lingue che fanno eco a questo? O è solo un problema di cultura PHP?

    
posta Stephen 19.11.2010 - 16:55
fonte

9 risposte

32

Codice a E_STRICT e nient'altro.

L'uso di assegni vuoti e isset non rende il tuo codice brutto, rende il tuo codice più dettagliato. Nella mia mente qual è la cosa peggiore in assoluto che può accadere dall'usarli? Digito alcuni altri caratteri.

Versetti le conseguenze del mancato utilizzo di questi ultimi, per lo meno avvisi.

    
risposta data 19.11.2010 - 17:03
fonte
17

Penso che le note su elementi sconosciuti siano un errore di progettazione in PHP. Non sono sicuro che sia possibile correggere l'errore ora, ma produce molto codice standard come if(isset($foo['abc']) && $foo['abc'] == '123') - questo codice non dovrebbe avere isset , poiché l'intento è controllare se c'è '123' in certi punti di $foo e se non c'è niente, non è sicuramente '123'. L'unico motivo per cui devi scrivere il doppio del codice è a causa di questo sfortunato errore di progettazione in PHP. E le notifiche sono molto costose in PHP, sfortunatamente, quindi disabilitarle non è un'opzione per il codice in cui le prestazioni sono un problema.

Quindi sì, rende il codice brutto IMHO e mi infastidisce. E non è per mancanza di esperienza - uso PHP dal 1998 e ricordo quando c'era .php3 extension e significava "non è PHP 2". Forse sono pigro :) Ma la pigrizia, almeno un certo tipo, è una virtù per un programmatore.

D'altra parte, l'uso valido di isset e empty - proprio come quelli nel post originale - va bene. Penso che PHP sia troppo zelante per gli avvisi nei luoghi in cui isset/empty non è realmente necessario.

    
risposta data 17.12.2010 - 21:00
fonte
12

Credo che il PHP, come linguaggio libero, che è interpretato e usato sul web, abbia una proporzione molto alta di programmatori non professionisti non addestrati che non sono pienamente consapevoli del perché dovrebbero codificare in modo difensivo e vedono semplicemente gli avvertimenti come un altro errore non necessario.

Sento continuamente questi punti di sviluppatori junior e di codificatori di script autodidatti:

  • Perché inizializzare una variabile se arriverà comunque all'esistenza?
  • Perché controllare se qualcosa esiste prima di usarlo, indefinito equivale comunque a falso?
  • Se prefisso con @ risolve il mio codice, perché complicare le cose?

Se non hanno mai sperimentato un linguaggio strongmente tipizzato, o hanno sperimentato le insidie di variabili non dichiarate / non confermate, allora ne prendono alcune convincenti. Trovo che di solito si arrendono dopo aver provato il piacere di eseguire il debug del codice per circa un'ora, in modo da scoprire che è stato un errore di battitura in un nome di variabile a causare il problema.

L'altro fattore strong è l'utilizzo di PHP nel settore web, che tende ad essere molto più interessato al throughput che alla sicurezza e alla qualità del codice.

    
risposta data 19.11.2010 - 22:45
fonte
5

Sì, sono pigri. Molti di loro comunque ...

Sfortunatamente la mentalità di molti codificatori PHP è "Non c'è codice di sicurezza in modo difensivo se è possibile ottenere più velocemente lo stesso risultato basandosi sul linguaggio per gestire gli errori causati da variabili mancanti ecc. ecc." Lo so, ho lavorato con molti di loro.

Tendono ad essere anche quelli che si dirigono misteriosamente per un pranzo mattutino quando la loro mancanza di gestione e segnalazione degli errori corretti elimina i server dal vivo per diverse ore ...

    
risposta data 19.11.2010 - 18:28
fonte
4

Cerco di evitare l'uso di isset () e empty () evitando l'uso di matrici come oggetti di trasferimento dati. Creare una classe che può essere configurata per accettare un set limitato di proprietà con valori predefiniti sane e convalidare l'input per tali proprietà. Può anche implementare l'interfaccia ArrayAccess in modo da poterla usare come un array. Ciò consente inoltre di utilizzare il suggerimento del tipo nelle firme dei metodi per rilevare gli errori quando qualcuno tenta di passare il tipo di entità errato al metodo.

    
risposta data 22.11.2010 - 06:02
fonte
2

One of the questioned questions is mine, so let me reiterate.

Molti sviluppatori confondono la presenza di un sacco di isset() come segno di qualità. Dà un'apparenza di affidabilità e alcune persone la pensano persino come funzionalità di sicurezza.

Ma devi tener conto che PHP non è un linguaggio compilato. È un linguaggio di scripting con un sistema di tipi dinamico. Gli errori E_NOTICE sono solo errori per nome. E se un sacco di isset viene utilizzato con la sola intenzione di sopprimere le notifiche, in realtà sei solo codifica contro la lingua .

So, are PHP devs just lazy?

Questo è davvero il caso se vedi un'abbondanza di avvisi e avvertimenti lanciati. La maggior parte dei neofiti non si preoccupa delle notifiche e di solito è il risultato di un error_reporting(0) disabilitato completamente.

Tuttavia, ti stai sbagliando che altri sviluppatori non hanno riconosciuto E_NOTICE solo perché non erano stati soppressi @ o isset. Almeno questa era la mia intenzione dietro domanda di avviso di conservazione . Non sono qualcosa di cui sbarazzarsi, ma di tanto in tanto importanti informazioni di debug.

Come tutte le generalizzazioni, l'uso sconsiderato di isset non porta a un codice ottimale. È importante distinguere dove sono necessari isset e empty e dove sono sale sintattico .

Or is this solely a PHP culture issue?

No, la variabile non definita "errori" non è un problema PHP da solo. Bash, TCL e Perl o JavaScript consentono l'uso di variabili non definite. Tuttavia, questa caratteristica del linguaggio immanente non è vista come un difetto. Esistono costrutti di linguaggio simili per verificare i valori non definiti. Tuttavia non sono costantemente utilizzati come in PHP, a causa di valori non definiti come "errore".

    
risposta data 26.11.2010 - 06:10
fonte
1

Interessante. Non uso quasi mai isset (). Il mio codice PHP è raramente in uno stato in cui non so se una variabile è stata impostata in primo luogo. Ogni variabile GET o POST utilizzata è accessibile tramite una funzione che fornirà un valore predefinito se non esiste. I valori predefiniti nelle chiamate di funzione sono in genere impostati esplicitamente su 0 o stringhe vuote.

    
risposta data 19.11.2010 - 23:05
fonte
0

Io uso isset e svuota abbondantemente. Ma per lo più sono posti che tu menzioni, come l'elaborazione $ _REQUEST, nel caso qualcuno abbia sbagliato a modificare i parametri. Nei casi in cui ho il controllo su tutte le variabili che volano intorno, trovo che di solito non ne ho bisogno.

    
risposta data 19.11.2010 - 17:42
fonte
0

Non mi piace usare isset, ma se ci sono masse di codice fatte da un altro, allora può essere una grazia salvifica. Ho scritto il codice wee qui sotto per aiutare con questo problema, invece di usare isset () isseter ($ a, $ b) restituirà $ b se $ a non è definito o vuoto, o la funzione restituisce un valore nullo. Qualsiasi miglioramento, benvenuto:

//returns var or NULL (if undefined)
//$reserve optional second value is returned as $default if undefined
function isseter(&$default,&$reserve=NULL)
{
$default = isset($default) ? $default : NULL;
$reserve = isset($reserve) ? $reserve : NULL;
if ((!$default) && ($reserve)) $default=$reserve;
return $default;
}
    
risposta data 10.08.2016 - 07:42
fonte

Leggi altre domande sui tag