【问题标题】:php: Declare arguments type of a Functionphp:声明函数的参数类型
【发布时间】:2012-02-16 06:43:06
【问题描述】:

我正在尝试使用已声明的参数类型创建一个函数,以快速检查它们是否采用正确的格式,但是当它返回一个字符串时出现此错误:

Catchable fatal error: Argument 2 passed to myfunction() must be an instance of string, string given, called in path_to_file on line 69 and defined in path_to_file on line 49

例子

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

错在哪里?

【问题讨论】:

标签: php function arguments


【解决方案1】:

根据PHP Manual,您可以在PHP 5.1 及更高版本上为array 以及在PHP 7 上的stringint 类型执行此操作,以及超过。看看:

  • 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

【讨论】:

  • 从 PHP 5.1.0 起可以使用数组作为提示
  • 当然,你是对的,我自己写错了,呵呵。
【解决方案2】:

根据the PHP5 documentation

类型提示只能是对象和数组(自 PHP 5.1 起)类型。不支持使用 int 和 string 进行传统类型提示。

由于 stringint 不是类,因此您不能在函数中“键入提示”它们。

从 PHP 7.0 开始,支持将参数类型声明为 string、int、float、bool。

【讨论】:

  • 这个答案已经过时了,见php.net/manual/en/…
  • 如果我有一个类 Person 并且我想接受一个 Person 数组作为我的函数的参数怎么办?我该怎么做?
【解决方案3】:

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

<?php 
declare(strict_types=1);

【讨论】:

  • 请添加更多关于您的答案的描述。
【解决方案4】:

这对于自 PHP 7 可用以来看到此帖子的任何人可能有用

使用 PHP 7,现在可以声明类型。您可以参考以下链接了解更多信息。

http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

function(string $name, boolean $is_admin) {
    //do something
}

【讨论】:

  • 是否总是建议包含参数类型?
  • boolean 作为类型声明将检查 instanceof boolean 而不是检查布尔值。正确的类型声明是bool。例如function a(value: boolean); a(true) 将失败。
  • 这个函数的返回类型的语法呢?
  • @AlexLacayo 我认为这是一个很好的做法。 PHP 在变量类型和赋值方面一直非常宽松。但是过于开放总有一天会不可避免地导致挠头的错误。返回类型使用冒号声明,后跟返回类型。例如:函数 foo() : int { return 0; }
  • 根据php.net/manual/en/language.types.declarations.php不应该是bool而不是boolean吗?
【解决方案5】:

如果您不使用 PHP 7.x 或需要一些复杂的参数验证(例如“数组或 \Traversable”,因为您可以遍历数组但它们是原始类型并且不实现 \Traversable 接口),您可以使用args 模块来自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');

输出:

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

【讨论】:

    【解决方案6】:

    你可以做一些对我一直有效的事情

    对于字符串

    function setData($Name=""){ }
    

    这会强制名称为字符串,它不会检查它是否为字符串

    对于数值

    function setData($age=0){ }
    

    这会强制年龄为数字,如果传递的是字符串,则值为0

    对于数组值,有两种变化

    function setData(array $data){ } 
    

    如果没有传递一个数组,它会抛出一个错误

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

    这将传递一个没有为$data 提供值的空数组

    【讨论】:

    • 为参数指定默认值是一项重要的技术,但不应等同于类型提示。例如,指定func( $x=0 ) 会强制$x 的值是一个数字,这并不完全正确。相反,如果您的函数始终将$x 的值作为一个数字处理,那么巧合的是它可以解决。实际上,如果您传入一个恰好可以解析为数字的字符串,那么它将以这种方式处理。 func( '5' ) 很乐意使用 5 作为整数值。不可解析的字符串被解释为 0,因此您的 0 默认值是巧合。
    【解决方案7】:

    stringint 和其他内置类型不是 classes,在参数中您指定参数的 class。唯一支持的内置类型是array

    【讨论】:

      【解决方案8】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2019-07-30
      • 2019-02-26
      • 2021-08-23
      • 1970-01-01
      • 2019-01-30
      相关资源
      最近更新 更多