2012-01-22 205 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

請添加更多關於您的答案的描述。 –