Sicurezza dei setter magici in PHP

1

Non so come in altre lingue, ma in PHP mi sembra che siano molto insicuri come impostare il valore di qualsiasi variabile membro - perché un setter non può facilmente convalidare l'input per molte variabili (soprattutto se sono di vario tipo)

La maggior parte degli esempi di setter magia dicono solo

public $prop = array();

public function __set($name, $value)
{
    $this->prop[$name] = $value;
}

Non c'è alcuna convalida. Ed è sbagliato.

Anche se aggiungessi la convalida, non posso ancora convalidare facilmente tutti i tipi, perché il codice della funzione sarebbe molto lungo.

Problema

  • È un modo per rendere sicuri i setter della magia?
  • o è davvero meglio evitarne l'utilizzo (definire il proprio setter per ogni variabile membro)?
posta Václav 01.03.2016 - 18:21
fonte

2 risposte

1

L'ovvio modo per affrontare questo problema è di avere un'istruzione switch nel tuo metodo __set , generando un'eccezione se un valore non valido (cioè non supportato) sta tentando di essere impostato, attraverso il caso default , altrimenti o assegnando direttamente la coppia name => value di eseguire la coppia con un metodo per convalidarlo.

Se stai usando un IDE moderno (posso parlare solo per PhpStorm, ma sono sicuro che anche altri IDE lo supportano), puoi annotare la classe in questione con l'annotazione @property PhpDoc e il tuo IDE suggerire le proprietà della classe.

Tuttavia, se stai modellando una classe per il tuo dominio, mi asterrò dai semplici setter tutti insieme e userei nomi descrittivi dei metodi, come change[Property] per sovrascrivere una variabile incapsulata, add[Item] per aggiungere un altro elemento a una raccolta privata / protetta e così via.

In entrambi i casi, per le tue classi di dominio, il principio TellDon't Ask è spesso un ottimo schema da seguire, seguito dal lancio di eccezioni di dominio sugli errori.

    
risposta data 01.03.2016 - 20:18
fonte
-1

Che cosa intendi con nessuna convalida ? PHP non è tipizzato rigorosamente, dipende principalmente da te, per convalidare gli input. Se scrivi il tuo proprietario setter / metodo / funzione, sarà comunque necessario convalidare. Dal punto di vista della convalida, non vedo differenze tra i metodi magici e qualsiasi funzione regolare. A proposito, in PHP è possibile imporre il tipo di array e gli oggetti negli argomenti del metodo.

Modifica Usi metodi magici, quando è appropriato. Nessuno ti costringe a usarli invece di un metodo normale. Ci saranno situazioni in cui potresti volerle usare.

Per quanto riguarda la tua domanda, il mio punto è sempre lo stesso: che si tratti di un metodo magico o di un metodo regolare della tua classe che accetta argomenti, è tua responsabilità convalidarli. Non ha nulla a che fare con la sicurezza dei metodi magici.

    
risposta data 12.03.2016 - 16:49
fonte

Leggi altre domande sui tag