2012-01-22 19 views
13

Estoy tratando de hacer una función con tipos de argumentos declarados para verificar rápidamente si están en el formato correcto, pero cuando una cadena devuelve siempre ese error Error fatal capturable: argumento 2 pasado a mifuncion() debe ser una instancia de la cadena, cadena dada, llamado en vía_al_archivo en la línea 69 y se define en vía_al_archivo en la línea 49php: declarar argumentos tipo de una función

function myfunction(array $ARRAY, string $STRING, int $INTEGER) { 
    return "Args format correct"; 
} 
myfunction(array("1",'2','3','4'), "test" , 1234); 

dónde está el error?

+0

No se puede hacer alusión de los valores escalares. – alexn

+1

Ahora puede, simplemente use PHP 7.0 http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – sobi3ch

Respuesta

29

Según the PHP5 documentation:

Type Hints can only be of the object and array (since PHP 5.1) type. Traditional type hinting with int and string isn't supported.

Desde string y int no son clases, no se puede "sugerencia del tipo" en su función.

A partir de PHP 7.0 declarando argumento escriba como string, int, float, bool es compatible.

+5

esta respuesta está desactualizada, vea http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – Blauhirn

0

No se puede definir el tipo como string y int. PHP "no sabe" lo que son.

+3

Conoce los tipos, [simplemente no le importa] (http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing). – Gumbo

+1

@Gumbo ...y es por eso que puse las comillas dobles ... –

1

string, int y otros tipos integrados no son clases, en el argumento que especifique clase, del argumento. El único tipo incorporado admitido que se colocará allí es array.

6

Puede hacer algo como esto que siempre ha trabajado para mí

de cadena

function setData($Name=""){ } 

esto obliga al nombre a ser una cadena, no comprueba si es una cadena

para valores numéricos

function setData($age=0){ } 

esto obliga a la edad de ser un número, si se pasa una cadena, el valor será 0

de valores de la matriz, hay dos variaciones

function setData(array $data){ } 

si no se pasa una matriz, que arrojaría un error

function setData($data=array()){ } 

Esto haría pasar una matriz vacía sin valor para $data

+4

Especificar los valores predeterminados para los argumentos es una técnica importante, pero no debe equipararse con el tipo de alusión. Por ejemplo, no es del todo cierto que especificar 'func ($ x = 0)' fuerce el valor de '$ x' para que sea un número. Por el contrario, si su función siempre procesa el valor de '$ x' como un número en todo, entonces por coincidencia funciona. En realidad, si pasa una cadena que puede ser procesada como un número, entonces se procesará de esa manera. 'func ('5')' usaría alegremente 5 como el valor entero. Una cadena que no es procesable se interpreta como cero, por lo que su valor predeterminado 0 funciona por coincidencia. – zerobandwidth

0

Si no está utilizando PHP 7.x o necesita algunas validaciones complejas de argumentos (como "una matriz o \ T raversable "porque puede recorrer matrices pero son tipos primitivos y no implementan la interfaz \ Traversable) puede usar el módulo args desde Non-standard PHP library (NSPL).

use const \nspl\args\numeric; 
use function \nspl\args\expects; 

function sqr($x) 
{ 
    expects(numeric, $x); 
    return $x * $x; 
} 

sqr('hello world'); 

Salidas:

InvalidArgumentException: Argument 1 passed to sqr() must be numeric, string given in /path/to/example.php on line 17 

Call Stack: 
    0.0002  230304 1. {main}() /path/to/example.php:0 
    0.0023  556800 2. sqr() /path/to/example.php:17 
0

Según PHP Manual, en PHP 5.x no se puede utilizar como array pista, pero en PHP 7.xpuede! Eche un vistazo:

  • Class/interface name El parámetro debe ser una instancia de la clase o nombre de interfaz dados. PHP 5.0.0
  • self El parámetro debe ser una instancia de la misma clase que en la que está definido el método. Esto solo se puede usar en los métodos de clase e instancia. PHP 5.0.0
  • array El parámetro debe ser una matriz. PHP 5.1.0
  • callable El parámetro debe ser válido. PHP 5.4.0
  • bool El parámetro debe ser un valor booleano. PHP 7.0.0
  • float El parámetro debe ser un número de coma flotante. PHP 7.0.0
  • int El parámetro debe ser un número entero. PHP 7.0.0
  • string El parámetro debe ser una cadena. PHP 7.0.0
  • iterable El parámetro debe ser una matriz o una instancia de Traversable. PHP 7.1.0
0

cuando necesito usar Sugerencias Tipo, hago esto:

<?php 
declare(strict_types=1); 
+1

Agregue más descripción con respecto a su respuesta. –

Cuestiones relacionadas