Come implementare lo zucchero di sintassi in OO

4

Il problema

Mi trovo regolarmente a scrivere lo stesso codice più e più volte.

Ad esempio, se voglio un valore da una struttura di array nidificata, finisco per scrivere qualcosa del tipo:

$config = function_to_get_nested_array();
$node = $config;
foreach(array('vendor','product','config','leave') as $index => $key){
    if(! isset($node[$key])){
      //throw exception
    }
    $node = $node[$key];
}

Preferirei avere qualcosa di simile

$config = function_to_get_nested_array();
$node = get_node($config, 'vendor/product/config/leave');

Ma come posso implementarlo?

Soluzioni possibili

  1. Potrei implementare una funzione come ho fatto sopra. MA i miei pacchetti fanno molto affidamento sull'autoloading e sono puramente OO. In questo momento devo solo clonare un sottomodulo nella directory giusta e tutto funziona bene.

  2. Potrei implementarlo dove ne ho bisogno. MA significa che devo implementarlo innumerevoli volte in progetti indipendenti.

  3. Potrei usare un tratto , se non fossi bloccato con PHP 5.3 . Non un'opzione per me.

  4. Potrei implementare un fornitore di servizi statici.

Per vari motivi le classi e i metodi statici sono di solito una scelta sbagliata, ma sono tentato per farlo in questo caso.

use vendor\product\helpers\ArrayTree as Tree
...
$config = function_to_get_nested_array();
$node = Tree::getNode($config, 'vendor/product/config/leave');

Sembra molto allettante, perché supporta l'autoloading e gli spazi dei nomi.

La domanda

Esiste una soluzione migliore per implementare questo tipo di funzioni di supporto?

    
posta Oliver A. 23.01.2013 - 13:12
fonte

1 risposta

2

Questo è un buon scenario per usare un metodo statico.

I metodi statici possono essere problematici poiché sono essenzialmente funzioni globali , ovvero la chiamata è cablata a quella specifica classe. Durante il test delle unità è difficile sostituire un metodo statico con un mocked.

Tuttavia, nel tuo caso, getNode è una pura funzione di utilità senza stato . Vai avanti e attua quella soluzione allettante.

class ArrayTree {
    public static function getNode($array, $path) {
        ...
    }
}
    
risposta data 31.01.2013 - 20:19
fonte

Leggi altre domande sui tag