2010-05-05 14 views
11

Ho un metodo di classe che si occupa di date:tipo hinting e opzionali attributi in PHP

public function setAvailability(DateTime $start, DateTime $end){ 
} 

Dal momento che la disponibilità degli articoli può avere limite inferiore, limite superiore, entrambi o nessuno, mi piacerebbe fare setAvailability () accetta anche valori NULL. Tuttavia, la costante NULL viola il tipo di hinting:

$foo->setAvailability(NULL, $end); 

innesca:

Catchable fatal error: Argument 1 passed to Foo::setAvailability() must be an instance of DateTime, null given

E, per quanto ne so, non posso avere un'istanza di DateTime senza alcun valore. (? Posso)

Per un motivo non riesco a capire, questo sembra funzionare:

public function setAvailability(DateTime $start=NULL, DateTime $end=NULL){ 
} 
... 
$foo->setAvailability(NULL, $end); 

Ma sembra un hack che funziona per puro caso.

Come gestiresti le date non impostate nelle classi PHP?

risposta

19

Ciò viene affermato abbastanza chiaramente in the PHP manual on typehinting:

Functions are now able to force parameters to be objects (by specifying the name of the class in the function prototype) or arrays (since PHP 5.1). However, if NULL is used as the default parameter value, it will be allowed as an argument for any later call.

+0

Il collegamento aggiunto alla pagina di manuale pertinente –

+1

+1 sembra un comportamento su cui fare affidamento. Sarebbe comunque bello scoprire se esiste una specie di oggetto DateTime "null". –

+2

@zerocrate: grazie. Non solo è un comportamento documentato, ma è anche spiegato nel capitolo che ti aspetteresti che sia. Mi sento un novellino <:-) –

2

Per me il vostro esempio sembra all'interno della voce Oggetti ci sarà un controllo se il parametro è nullo o un oggetto DateTime (if/else). Rimuoverei questa responsabilità dagli oggetti Item in un DateTime personalizzato, ad esempio estendendo DateTime. Questo MyDateTime sarebbe responsabile per sapere se la data è 'dall'inizio dei tempi' o meno. Non c'è bisogno che Item lo faccia.

+0

L'idea è buona ma preferisco omettere un livello di complessità extra di questo tipo. (Il codice effettivo non fa un uso eccessivo delle date). –