2012-01-22 118 views
13

我打算做一个声明参数类型的函数来快速检查它们是否在正确的格式,但是什么时候是一个字符串返回所有错误 可捕获致命错误:参数2通过给myFunction()必须是字符串,给定的字符串的一个实例,称为在上线69和文件路径上线49php:声明函数的参数类型

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

哪里是错误在文件路径定义?

+0

不能暗示对标量值。 – alexn

+1

现在你可以,只需使用PHP 7.0 http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – sobi3ch

回答

29

根据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.

由于stringint不是类,你不能“的类型提示”他们在你的函数。

从PHP 7.0开始,将参数类型声明为字符串,int,float,bool被支持。

+5

这个答案已过时,请参阅http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – Blauhirn

0

您不能将类型定义为stringint。 PHP“不知道”它们是什么。

+3

它确实知道类型,[它只是不关心]( http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing)。 – Gumbo

+1

@Gumbo ...这就是为什么我把双引号... –

1

stringint和其他内置类型不,在参数指定的说法类。唯一支持的内置类型是array

6

你可以做这样的事情这一直为我工作

字符串

function setData($Name=""){ } 

这迫使名称是一个字符串,它不检查如果一个字符串

的数值

function setData($age=0){ } 

这迫使年龄是一个数字,如果一个字符串传递,则该值将是0

为数组值中,有两个变化

function setData(array $data){ } 

如果阵列不通过,这将引发错误

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

这将传递一个没有值的空数组给出$data

+4

指定参数的默认值是一个重要的技术,但不应该与类型提示等同。例如,指定'func($ x = 0)'强制'$ x'的值为一个数字并不完全正确。相反,如果你的函数总是把'$ x'的值作为一个数字来处理,那么巧合的是它可以解决。实际上,如果你传递一个恰好可以作为数字解析的字符串,那么它将以这种方式处理。 'func('5')'会愉快地使用5作为整数值。不可解析的字符串被解释为零,因此您的0默认值巧合工作。 – zerobandwidth

0

如果您不使用PHP 7.x或需要一些复杂的参数验证(如“一个数组或\ T可逆“,因为您可以遍历数组,但它们是原始类型,并且不实现\ Traversable接口),您可以使用Non-standard PHP library (NSPL)args模块。

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

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

sqr('hello world'); 

输出:

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

PHP Manual,在PHP 5.x的不能使用array作为提示,但在PHP 7.x的可以!看一看:

  • Class/interface name该参数必须是给定类或接口名称的实例。 PHP 5.0.0
  • self该参数必须是与定义方法相同的类的实例。这只能用于类和实例方法。 PHP 5.0.0
  • array参数必须是数组。 PHP 5.1.0
  • callable参数必须是有效的可调用的。 PHP 5.4.0
  • bool参数必须是布尔值。 PHP 7.0.0
  • float参数必须是浮点数。 PHP 7.0.0
  • int该参数必须是整数。 PHP 7.0.0
  • string该参数必须是字符串。 PHP 7.0.0
  • iterable参数必须是数组或实例的Traversable。 PHP 7.1.0
0

,当我需要使用类型提示,我这样做:

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

请添加更多关于您的答案的描述。 –