如何强制参数为整数/字符串

时间:2011-03-25 08:31:08

标签: php arguments type-hinting

我希望我的函数可以期望字符串/整数或者合适,例如:

  

警告:preg_match()期望参数2为字符串

但是对于这个功能

public function setImage($target, $source_path, integer $width, integer $height){...

我明白了:

  

传递给My_Helper_Image的参数4 :: setImage()必须是整数的实例,给定整数

可是:

function(array $expectsArray)

按照我的预期工作,我将如何实现与整数和字符串相同的效果?

大更新

PHP 7现在supports Scalar Type Hinting

function increment(int $number) {
     return $number++;
}

4 个答案:

答案 0 :(得分:25)

Scalar TypeHints are available as of PHP 7

  

标量类型声明有两种形式:强制(默认)和严格。现在可以强制执行以下参数类型(强制或严格):字符串(字符串),整数(int),浮点数(浮点数)和布尔值(bool)。它们扩充了PHP 5中引入的其他类型:类名,接口,数组和可调用。

在PHP7之前,标量没有类型提示。 PHP 5.3.99 did have scalar typehints但是,如果他们留下来以及他们将如何工作,那时就没有最终确定。

尽管如此,在PHP7之前还可以选择强制执行标量参数。

有几个is_*功能可以让你这样做,例如

要提出警告,请使用

E_USER_WARNING$errorType

实施例

function setInteger($integer)
{
    if (FALSE === is_int($integer)) {
        trigger_error('setInteger expected Argument 1 to be Integer', E_USER_WARNING);
    }
    // do something with $integer
}

替代

如果您想拼命使用标量类型提示,请查看

显示了一种通过自定义错误处理程序强制执行标量类型提示的技术。

答案 1 :(得分:5)

你可以使用" Type Juggling"喜欢(int)$ height。

例如:

function setImage($target, $source_path, integer $width, $height) {
    $height = (int)$height;
    ...
}

答案 2 :(得分:2)

PHP(尚未)实现强类型,因此您不能强制参数为整数。它只适用于类(你暗示$ width应该是类整数的实例的错误)和数组。

类的提示是在PHP 5中提供的,类型提示为从5.1开始的数组,显然标量类型提示可能(或可能不)将来可用。

当然,正如其他人所指出的那样,你可以检查你的函数/方法中的类型,但这与强类型有根本的不同。当然,任何一种方式都会产生预期的效果。

答案 3 :(得分:0)

如果您不使用PHP 7.x,或者可以使用args中的Non-standard PHP library (NSPL)模块。它不像幻想和PHP 7.x类型提示,但进行验证:

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