当前位置: 首页 > 编程笔记 >

PHP 类型提示标量类型,数组和可调用对象

松昱
2023-03-14
本文向大家介绍PHP 类型提示标量类型,数组和可调用对象,包括了PHP 类型提示标量类型,数组和可调用对象的使用技巧和注意事项,需要的朋友参考一下

示例

在PHP 5.1中,使用关键字添加了对类型提示数组参数的支持(以及PHP 7.1之后的返回值)array。任何尺寸和类型的数组以及空数组都是有效值。

在PHP 5.4中添加了对类型提示可调用对象的支持。is_callable()对于参数有效的任何值并提示所返回的值callable,即Closure对象,函数名称字符串和array(class_name|object, method_name)。

如果在函数名称中出现错字而不是is_callable(),则会显示不太明显的错误消息:

致命错误:未捕获的TypeError:传递给的参数1foo()必须是可调用的类型,给定的字符串/数组

function foo(callable $c) {}
foo("count"); // 有效
foo("Phar::running"); // 有效
foo(["Phar", "running"); // 有效
foo([new ReflectionClass("stdClass"), "getName"]); // 有效
foo(function() {}); // 有效

foo("no_such_function"); // 可预期的,给定的字符串

非静态方法也可以以静态格式作为可调用对象传递,从而分别导致PHP 7和5中的弃用警告和E_STRICT级错误。

考虑到方法的可见性。如果带有callable参数的方法上下文无法访问所提供的可调用对象,则它将结束,就好像该方法不存在一样。

class Foo{
  private static function f(){
    echo "Good" . PHP_EOL;
  }

  public static function r(callable $c){
    $c();
  }
}

function r(callable $c){}

Foo::r(["Foo", "f"]);
r(["Foo", "f"]);

输出:

致命错误:未捕获的TypeError:传递给参数1r()必须是可调用的,给定数组

在PHP 7中添加了对类型提示标量类型的支持。这意味着我们获得了对booleans,integers,floats和strings的类型提示支持。

<?php

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1, 2)); // Outputs "int(3)"

默认情况下,PHP将尝试强制转换提供的任何参数以匹配其类型提示。add(1.5, 2)由于将float1.5转换int为PHP ,因此将调用更改为会得到完全相同的输出。

要停止这种行为,必须declare(strict_types=1);在每个需要它的PHP源文件的顶部添加一个。

<?php

declare(strict_types=1);

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1.5, 2));

上面的脚本现在产生一个致命错误:

致命错误:未捕获的TypeError:传递给的参数1add()必须为整数类型,给定float

例外:特殊类型

一些PHP函数可能返回type值resource。由于这不是标量类型,而是特殊类型,因此无法键入提示。

例如,curl_init()将返回resource和fopen()。当然,这两种资源彼此不兼容。因此,PHP 7在显式进行类型提示时将始终抛出以下TypeError resource:

TypeError:传递给参数1的参数sample()必须是资源的实例,资源已给定

 类似资料:
  • 问题内容: 我有很多函数,它们具有对数组的类型提示或用于检查变量的数组性质。 现在,我开始使用可迭代的对象。他们实施或。如果它们通过类型提示或接受,则将它们接受为数组吗? 如果必须修改代码,是否有通用的,或者我必须做类似的事情: 还有哪些其他可迭代的接口? 问题答案: 我认为您的意思是instanceof ,PHP没有接口。它确实有一个接口。并且两者都进行了扩展(而AFAIK只是这样做的)。 但是

  • 问题内容: 因此,在PHPDoc中,可以在成员变量声明上方指定以提示其类型。然后是一个IDE,例如。PHPEd将知道它正在使用哪种类型的对象,并且能够为该变量提供代码见解。 这非常有用,直到我以后需要遍历这些对象时,我需要对一组对象进行相同的操作才能获得正确的提示。 因此,有没有一种方法可以声明一个PHPDoc标记以指定成员变量是s 的数组?例如,数组是不够的,而且似乎无效。 问题答案: 采用:

  • 本文向大家介绍PHP 类型提示类和接口,包括了PHP 类型提示类和接口的使用技巧和注意事项,需要的朋友参考一下 示例 在PHP 5中添加了有关类和接口的类型提示。 类类型提示 上面的脚本输出: 克里斯被爱丁堡大学录取 接口类型提示 上面的示例输出与之前相同: 克里斯被爱丁堡大学录取 自我类型提示 的self关键字可被用作一种类型的提示,以指示该值必须是一个声明所述方法的类的一个实例。

  • 问题内容: 只是好奇是否有一种方法可以在netbeans中为常规变量提供类型提示,以便intellisense可以选择。我知道您可以针对类属性,函数参数,返回类型等执行此操作,但是我不知道如何针对常规变量执行此操作。在您拥有可以返回不同对象类型(例如服务定位符)的方法的情况下,这确实有帮助。 例如: 之后使用$ someService的地方,netbeans将提供在Some_Service类中定义

  • 问题内容: 我想知道用这样的签名调用静态方法的正确方法是什么: 由于某种原因,我很想这样称呼它: 但是除非我将其更改为:否则它不会编译: 我只是想知道为什么它不需要右侧的提示。而是给了我编译错误。它说它期望在右侧的提示后加上分号。第二个方法是调用该方法的正确方法吗?有人可以给我一些启示吗? 问题答案: 如图所示这里,要调用的方法的方法是: 该方法所在的类的名称在哪里。

  • 我有2种类型的类型类,其中一种类型包含另一种类型 我想这样称呼我的类型类: 但这行不通。 错误:(34,23)找不到参数e的隐式值:com.playground.Valides[com.playground.MyModel1,model.version.type]val v=隐式[Valides[MyModel1,model.version.type]]错误:(34,23)没有足够的隐式方法参数: