Esiste un modo per documentare le proprietà richieste nei tratti (PHP)?

2

Sono abbastanza nuovo nell'usare i tratti in PHP e mi chiedo se esiste un modo per garantire che una classe che include un tratto abbia proprietà particolari.

So che puoi usare qualcosa di simile al seguente per assicurarti che l'uso della classe abbia metodi particolari.

protected abstract function some_function();

C'è un modo per fare lo stesso genere di cose per le variabili membro, dal momento che un tratto ha accesso alle variabili membro nella classe using?

Posso solo documentare il requisito, ma sarebbe bello lanciare un'eccezione nel caso in cui una classe che cerca di utilizzare un tratto manchi di una proprietà richiesta.

Il più vicino che riesco a trovare è creare una funzione nel tratto che tenta di afferrare la variabile e restituirla ... e lanciare un'eccezione se non viene trovata. Quindi i metodi nel tratto possono utilizzarlo per accedere alla proprietà delle classi genitore invece di accedervi direttamente.

Pensieri, suggerimenti e raccomandazioni sono i benvenuti ... poiché mi sto solo abituando ai tratti.

Il caso d'uso è che ho determinate cose che girano solo sulla faccia pubblica del sito e altre cose che funzionano solo sulla faccia privata del sito, ma condividono entrambe un insieme comune di funzionalità di base (varie impostazioni di configurazione , gestione degli errori, ecc.)

Potrei evitare di usare i tratti rendendo estremamente lunghi i file di classe per ognuna delle classi ereditate, ma sto cercando di mantenere la stessa funzionalità insieme in file più piccoli, se possibile.

Suppongo che una possibilità sia richiedere una variabile di accesso nella classe chiamante per restituire la proprietà ricercata.

abstract function get_my_value();

Qualcos'altro che potrebbe funzionare in modo pulito?

Grazie in anticipo!

    
posta Privateer 29.01.2015 - 03:34
fonte

1 risposta

1

Il modo migliore che ho trovato per farlo è il seguente:

class This_Is_My_Class {
    use My_Trait;

    protected $prefix = '';

    function __construct() {
        $this->prefix = 'not_empty';
    }

    protected function get_prefix() {
       if ( empty($this->prefix) ) {
           throw new Exception("Prefix must be non empty.");
       }
       return $this->prefix;
    }

    ... rest of class here
}

trait My_Trait {

    abstract protected function get_prefix();

    protected function do_whatever() {
        $prefix = $this->get_prefix();
        ... do stuff
    }
}

Ora, quando si usa il tratto, si ottiene un'eccezione quando si tenta di fare qualcosa con esso quando la classe che lo usa manca della funzione get_prefix (a causa della dichiarazione astratta) o tenta di usare il prefisso (a causa dell'eccezione nella classe genitore).

Ovviamente, se esiste una soluzione più pulita per far sì che una classe che utilizza un tratto abbia una proprietà particolare, mi piacerebbe sentirla.

    
risposta data 29.01.2015 - 05:57
fonte

Leggi altre domande sui tag