Differenza fondamentale tra una classe statica e funzioni con nomi assegnati

0

Ho usato classi "statiche" come metodo per raggruppare le funzioni con finalità correlate sotto un nome comune che fornisce la leggibilità e la manutenibilità al codice a scapito delle prestazioni e un utilizzo errato del modello di oggetti causato dall'ignoranza.

Posso assolutamente farlo con una classe normale, ma quando l'oggetto non ha uno stato non ha senso istanziarlo ogni volta che ho bisogno di accedere a una funzione, è anche sbagliato.

Con php 5.6 o qualcosa introdussero funzioni di namespace, ma anche se così non fosse, potevo ancora fingere uno spazio dei nomi con prefissi di nomi, quindi (preparare, ignoranza in arrivo) suppongo che il cambiamento aggiunga solo al sistema di gestione delle funzioni interno di php o qualunque cosa sia.

Stavo pensando - quale sarebbe un modo corretto per dichiarare funzioni di tale natura?

Per un esempio prendo questo helper html che ho creato molto tempo fa . Puoi vedere che ha un sacco di funzioni come

class HTML {
    public static function script($src, array $attributes = array(), $defer = true){
        $attributes['type'] = 'text/javascript';
        $attributes['src'] = strstr($src, '://') ? $src : SITE_URL . $src;
        if($defer){
            $attributes['defer'] = 'defer';
        }

        return '<script'.self::parseAttributes($attributes).'></script>';
    }

    public static function stylesheet($src, array $attributes = array()){
        $attributes['type'] = 'text/css';
        $attributes['href'] = strstr($src, '://') ? $src : SITE_URL . $src;
        $attributes['rel'] = 'stylesheet';

        return '<link'.self::parseAttributes($attributes).'/>';
    }
}

ma l'oggetto stesso non ha stato, quindi non sarebbe meglio avere solo queste funzioni come qualcosa di

function htmlhelper_script($src, array $attributes = array(), $defer = true){
    $attributes['type'] = 'text/javascript';
    $attributes['src'] = strstr($src, '://') ? $src : SITE_URL . $src;
    if($defer){
        $attributes['defer'] = 'defer';
    }

    return '<script'.self::parseAttributes($attributes).'></script>';
}

function htmlhelper_stylesheet($src, array $attributes = array()){
    $attributes['type'] = 'text/css';
    $attributes['href'] = strstr($src, '://') ? $src : SITE_URL . $src;
    $attributes['rel'] = 'stylesheet';

    return '<link'.self::parseAttributes($attributes).'/>';
}

Quali sono le differenze tra i due approcci, quale sarà considerato migliore e perché?

    
posta php_nub_qq 17.05.2016 - 16:03
fonte

1 risposta

2

Nessuno dei due approcci è funzionalmente migliore: entrambi eseguono il lavoro (tranne la parola chiave self dovrebbe andare nell'esempio basato sullo spazio dei nomi).

Quindi la differenza sta essenzialmente nella chiarezza e nella manutenibilità. Se la tua intenzione è che nessuna di queste funzioni abbia uno stato condiviso qualunque, penso che l'approccio più chiaro sia quello che lo proibisce esplicitamente: spazi dei nomi e funzioni.

Inoltre: namespace sono stati aggiunti in PHP 5.3 (non 5.6) quindi è carino sicuro di poter contare su di loro ormai. Namespacing è più potente del prefisso in quanto ha funzioni di importazione e aliasing quindi andrei con namespaces piuttosto che prefisso.

    
risposta data 17.05.2016 - 18:59
fonte

Leggi altre domande sui tag