Ciao, ho creato un file di debug per facilitarmi notevolmente la vita quando programmo in PHP, che fa un po' di cosette che vi elencherò. Vorrei dei consigli su quali funzionalità potrei aggiungere e quali modificare per migliorarlo ancora, sia dal punto di vista dell'efficienza sia dal punto di vista della comodità di scrivere (la comodità prima di tutto ). Sicuramente "voi programmatori" avete un'idea di com'è un debug fatto bene Stavo pensando di aggiungere -ad esempio- qualcosa di simile ai "breakpoint", ma non riesco bene a immaginare quale utilità potrebbe avere e come implementarlo.


Allora, il mio file ha una funzione debug [ debug($command, $arg1, $arg2, ...); ] che riceve i seguenti comandi:
- write / writeln: stampa del testo e/o dei parametri (esattamente come echo);
- watch: mostra il valore di uno o più parametri, indicando quali parametri sta mostrando;
- call: chiama una funzione, indicando quando viene chiamata, gli argomenti passati alla funzione, quando si conclude e il valore ritornato;
- enable_log / disable_log: abilita/disabilita il log del debug: se il log è disattivato, stampa tutto a video, altrimenti salva in un file (o nel database, a piacimento).

Una differenza tra questo e il debug normale con var_dump, print_r ecc. è che basta mettere il valore di una costante a false per spegnere l'intero debug senza modificare niente .

Script di esempio:
Codice PHP:
function ordina($numeri$direzione 'crescente'){

    
debug(watch$numeri); // <-

    
$tot count($numeri);
    for(
$i=0$i<$tot$i++){
        
$min_max $i;
        for(
$j=$i+1$j<$tot$j++)
            if(((
$direzione == 'crescente') && ($numeri[$j] < $numeri[$min_max])) || (($direzione == 'decrescente') && ($numeri[$j] > $numeri[$min_max])))
                
$min_max $j;
        if(
$min_max != $i){
            
$tmp $numeri[$min_max];
            
$numeri[$min_max] = $numeri[$i];
            
$numeri[$i] = $tmp;
        }
        
$min_max $i;
        
debug(watch$i$numeri[$min_max], $numeri); // <-
    
}
    return 
$numeri;
}

debug(writeln'Esempio: Ordinamento di un vettore di numeri'); // <-
debug(writeln);                                                 // <-

for($i=0$i<7$i++)
    
$numeri[] = rand(0,50);
    
$numeri debug(callordina$numerirand(0,1)?'crescente':'decrescente'); // <-

print_r($numeri); 
Questo è un semplice programma che ordina un vettore di numeri in ordine crescente o decrescente. (Ho indicato con le freccette i punti in cui fa debug.)
Questo è l'output (ret indica il punto in cui la funzione ritorna e contiene gli stessi argomenti della call corrispondente):
codice:
Esempio: Ordinamento di un vettore di numeri

call ordina(array(0=>32,1=>34,2=>1,3=>39,4=>23,5=>5,6=>37),"decrescente");
watch $numeri: Array
(
    [0] => 32
    [1] => 34
    [2] => 1
    [3] => 39
    [4] => 23
    [5] => 5
    [6] => 37
)
watch $i: int(0)
watch $numeri[$min_max]: int(39)
watch $numeri: Array
(
    [0] => 39
    [1] => 34
    [2] => 1
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 37
)
watch $i: int(1)
watch $numeri[$min_max]: int(37)
watch $numeri: Array
(
    [0] => 39
    [1] => 37
    [2] => 1
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 34
)
watch $i: int(2)
watch $numeri[$min_max]: int(34)
watch $numeri: Array
(
    [0] => 39
    [1] => 37
    [2] => 34
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 1
)
watch $i: int(3)
watch $numeri[$min_max]: int(32)
watch $numeri: Array
(
    [0] => 39
    [1] => 37
    [2] => 34
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 1
)
watch $i: int(4)
watch $numeri[$min_max]: int(23)
watch $numeri: Array
(
    [0] => 39
    [1] => 37
    [2] => 34
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 1
)
watch $i: int(5)
watch $numeri[$min_max]: int(5)
watch $numeri: Array
(
    [0] => 39
    [1] => 37
    [2] => 34
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 1
)
watch $i: int(6)
watch $numeri[$min_max]: int(1)
watch $numeri: Array
(
    [0] => 39
    [1] => 37
    [2] => 34
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 1
)
ret ordina(array(0=>32,1=>34,2=>1,3=>39,4=>23,5=>5,6=>37),"decrescente");
return value: Array
(
    [0] => 39
    [1] => 37
    [2] => 34
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 1
)
Array
(
    [0] => 39
    [1] => 37
    [2] => 34
    [3] => 32
    [4] => 23
    [5] => 5
    [6] => 1
)
Se imposto DEBUG = false, invece stamperà solo l'ultimo array (quello del print_r).

Poi, per comodità, ho fatto in modo che se creo una funzione ad esempio
Codice PHP:
function call(){
    return 
debug(__FUNCTION__func_get_args());

se la chiamo è come se chiamassi debug(call, ecc.), e quindi il codice di prima può diventare:
Codice PHP:
function ordina($numeri$direzione 'crescente'){

    
watch($numeri); // <-
    
[...] // blabla
        
watch($i$numeri[$min_max], $numeri); // <-
    
}
    return 
$numeri;
}

writeln('Esempio: Ordinamento di un vettore di numeri'); // <-
writeln();                                                 // <-

for($i=0$i<7$i++)
    
$numeri[] = rand(0,50);
    
$numeri call(ordina$numerirand(0,1)?'crescente':'decrescente'); // <-

print_r($numeri); 
che fa esattamente la stessa cosa ma che abbrevia la scrittura.

Suggerimenti?