Argomenti multipli per l'ultimo parametro

-2

Ho una funzione che ha tre parametri, chiamati key , value e attribute .

Il parametro attribute può essere vuoto o avere due argomenti. Il codice di funzione sottostante è abbreviato (privo di convalida degli argomenti)

public function Set_ContentUsage($Key, $Value, $Attribute=NULL)
{
    $this -> ContentUsage = array();
    $Attribute = array_slice(func_get_args(), 2);

    /* validation of arguments */

    $this -> ContentUsage['key'] = $Key;
    $this -> ContentUsage['value'] = $Value;


    if(count($Attribute) == 1)
    {
        $this -> ContentUsage['keyattr'] = ($Key == MarC::MARC_OPTION_ATTRVAL) ? $Attribute[0] : FALSE;
        $this -> ContentUsage['valueattr'] = ($Value == MarC::MARC_OPTION_ATTRVAL) ? $Attribute[0] : FALSE;
    }
    else
    {
        $this -> ContentUsage['keyattr'] = $Attribute[0];
        $this -> ContentUsage['valueattr'] = $Attribute[1];
    }
}

La mia domanda è come migliorare questa funzione per ottenere più argomenti per il parametro $Attribute senza $Attribute = array_slice(func_get_args(), 2); ?

Ho scoperto che se ho eliminato solo

$Attribute = array_slice(func_get_args(), 2);

porta al malfunzionamento del codice di riposo.

    
posta Václav 25.03.2016 - 21:18
fonte

1 risposta

1

La domanda è un po 'oscura, ma presumo che tu ti stia riferendo all'uso di array_slice(func_get_args(), 2); per implementare ciò che sono abituato a chiamare un "parametro di riposo", il che si traduce in una firma di funzione molto fuorviante.

L'alternativa più semplice e più pulita è usare l'operatore ... aggiunto in PHP 5.6 .

public function Set_ContentUsage($Key, $Value, ...$Attribute) {
    $firstAttribute = $Attribute[0];
    ...
}

Questo rende immediatamente ovvio a chiunque legga il tuo codice che l'ultimo parametro sia un array di tutti gli argomenti rimanenti.

Se questa non è un'opzione, dovrai semplicemente cambiare i siti di chiamata di questa funzione per passare un array effettivo per il terzo argomento, o passare a func_get_args() finché non potrai eseguire l'upgrade a 5.6.

    
risposta data 26.03.2016 - 00:16
fonte

Leggi altre domande sui tag