2009-10-21 10 views
6

¿Es normal para obtener el error "valor por defecto para los parámetros con un toque tipo de clase sólo puede ser NULL" de un método en una interfaz definida comoFuerte fallo de tipos de datos

public function nullify(bool $force=FALSE); 

?

Necesito que sea bool, no un objeto, y FALSO por defecto.

+2

Debería funcionar con php7 –

Respuesta

10

No hay ninguna sugerencia de tipo para los parámetros booleanos en php (todavía). Solo puede especificar un nombre de clase o array. Por lo tanto, function foo(bool $b) significa: "el parámetro $ b debe ser una instancia de la clase 'bool' o null".

http://docs.php.net/language.oop5.typehinting:

funciones son ahora capaces de forzar los parámetros a ser objetos (especificando el nombre de la clase en el prototipo de función) o matrices (a partir de PHP 5.1).
3

El tipo de sugerencia de PHP 5 está limitado a una clase específica (o una de sus subclases), o una matriz. No puede especificar ningún otro tipo de escalar.

5

Como ya se indicó, el tipo de sugerencia solo funciona para matrices y objetos. Su función puede escribirse así:

public function nullify($force=FALSE){ 
    $force=(bool)$force; 
    //further stuff 
} 
+1

O levantar un user_error o lanzar una excepción si es falso === is_bool ($ force) para acercarse al "error fatal capturable" php plantea parámetros inadecuados. – VolkerK

1

No puede forzar que un parámetro sea booleano.

Como se encuentra en language.oop5.typehinting:

PHP 5 introduce tipo de alusión. Las funciones ahora pueden obligar a los parámetros a ser objetos [...], interfaces, matrices (desde PHP 5.1) o invocables (desde PHP 5.4).

[...]

Tipo insinúa no se pueden utilizar con los tipos escalares como int o cadena. [...]

Y como se encuentra en language.types.intro, PHP tipos escalares son:

 
- boolean 
- integer 
- float (floating-point number, aka double) 
- string 
0

Usted podría intentar:

public function nullify($force){ 
    if(is_object($force)) $force = false; 
    ... 
} 

considerarlo como una solución temporal hasta que actualice PHP.