2010-05-05 15 views
11

que tienen un método de clase que se ocupa de fechas:Tipo y una sugerencia de atributos opcionales en PHP

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

Dado que la disponibilidad de productos puede tener límite inferior, límite superior, ambos o ninguno, me gustaría hacer setAvailability () también acepta valores NULL. Sin embargo, la constante NULL viola el tipo de insinuación:

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

desencadena:

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

Y, por lo que yo sé, no puedo tener una instancia de DateTime sin valor. (? ¿Puedo)

Por una razón que no puedo entender, esto parece funcionar:

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

Pero parece un truco que funciona por pura casualidad.

¿Cómo manejarías las fechas sin configurar en las clases de PHP?

Respuesta

19

Esto se afirma muy claramente en 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

Agregado enlace a la página relevante del manual –

+1

+1 parece un comportamiento en el que confiar. Sería agradable saber si existe algún tipo de objeto DateTime "nulo". –

+2

@zerocrates: Gracias. No solo es un comportamiento documentado, sino que también se explica en el capítulo que se espera que sea. Me siento como un novato <:-) –

2

Para mí el ejemplo se ve como en el interior del artículo objetos habrá un cheque si el parámetro era nulo o un objeto DateTime (if/else). Eliminaría esa responsabilidad de los objetos Item en un DateTime personalizado, por ejemplo, extendiendo DateTime. Este MyDateTime sería responsable de saber si la fecha es 'desde el principio de los tiempos' o no. No hay necesidad de Item para hacer esto.

+0

La idea es buena, pero a estas alturas prefiero omitir esa capa de complejidad adicional. (El código real realmente no hace un uso intensivo de las fechas). –

Cuestiones relacionadas