scrivere il mio primo classe PHP reale e sono imbattuto in un problema, il seguente è il mio metodo __construct:Convalida del __construct, assicurandosi Vars di di tipo corretto
public function __construct($foo,$bar) {
$this->foo = $foo;
$this->bar = $bar;
}
Sia $foo
e $bar
sono tenuti, senza di loro, i metodi falliranno e daranno errori php. Va bene quando non vengono definiti quando l'oggetto viene istanziato:
$var = new Class();
come questo vi darà un errore (ad esempio Classe richiede 2 params, nessuno set). Ma se sono impostate, ma non del corretto tipo di dati in questo modo:
$var = new Class('33','ddd');
I miei metodi verranno comunque provare a correre con le variabili sbagliate, e quindi stampare gli errori.
Qual è la procedura migliore per convalidare questi? Nel costrutto o in ogni metodo?
La mia soluzione che sto usando in questo momento funziona, ma non sono sicuro se è il modo 'corretto':
//$foo needs to be a string with letters only
//$bar needs to be an integer
public function __construct($foo,$bar) {
$this->foo = $foo;
$this->bar = $bar;
if(!is_numeric($bar)){
//print error msg
}
elseif(other validation case)
etc...
}
I concetti di programmazione OO sono abbastanza nuovo per me, così i collegamenti a qualsiasi materiale di riferimento che hai usato sarebbe molto apprezzato.
si dovrebbe non "il messaggio di errore di stampa" in un costruttore, si dovrebbe generare un'eccezione (come in @ risposta di Gordon sotto). Lo scopo del costruttore è di avere un oggetto valido dopo che è stato richiamato. Semplicemente stampando un messaggio di errore invece di un'eccezione, molto probabilmente finirai con un oggetto non valido che rovinerà tutto il tuo programma. – netcoder
No, non dovresti usare le eccezioni. Usa 'assert()' per controllare i tipi di variabile. Gli argomenti non validi sono innanzitutto un problema di sviluppo. Questo è dove volevi cogliere questi problemi. Le eccezioni dovrebbero essere utilizzate quando è necessario prevedere argomenti non validi durante il runtime e se è possibile implementare ragionevolmente la logica catch per riprovare con argomenti alternativi. Per esempio. [Assert vs Exceptions] (http://stackoverflow.com/questions/117171/design-by-contract-tests-by-assert-or-by-exception/117247#117247) ma vedi anche i duplicati .. – mario
@mario: Sono d'accordo che 'assert' può essere usato per controllare i tipi internamente. Ma non in un costruttore. Un argomento errato passato a un costruttore è un'eccezione, un'eccezione è una situazione eccezionale in cui il programma non può continuare ulteriormente. Se un costruttore ha argomenti negativi passati, non dovrebbe continuare ulteriormente. Altrimenti, come ho detto, si finisce con un oggetto non valido e un programma funzionante che considera valido l'oggetto e continua fino a quando non si verificano alcuni errori importanti (immondizia che viene inserita ripetutamente nel DB per esempio). – netcoder