其他很多语言中,类型约束是语法上的要求,即定义一个变量的时候,必须指定类型,并以后也只能存储该类型数据——这种是强类型语言的一个特点。比如:
int n1 = 1; //int类型变量
float f1 ; //float类型变量
bool function getConcat( string s1, string s2){。。。。} //两个形参是string,返回值也是bool型
php是弱类型语言,其特点是无需为变量指定类型,而且在其后也可以存储任何类型。
但:
在php的较新的语法中,在某些特定场合,针对某些特定类型,也可以进行语法约束。
特定场合:函数(或方法)的形参变量
特定类型:对象类型(类名), 接口类型(接口名), 数组类型(array), 函数类型(callable)
可以对函数(或方法)的参数设定必须使用的类型。只能对对象,接口,数组和函数进行约束,如下所示:
function f1(类名 $p1){....}:要求该参数只能使用该类的对象;
function f2(接口名 $p1){....}:要求该参数只能使用实现该接口的对象;
function f3(array $p1){....}:要求该参数只能使用数组;
function f4(callable $p1){....}:要求该参数只能是一个函数或方法,此时称之为回调函数(方法)
看演示代码:
第12行代码出错,只能是A类的对象。
第13行代码出错,只能是数组
第12行代码出错,只能是函数。
前面我们讲过了,把一个函数体直接赋值给一个变量,这个函数就是匿名函数,闭包函数。这个变量就变成了一个对象变量——Closure类的对象。一个对象怎么当成函数用?借助魔术方法__invoke。
所以可以这样理解:定义一个匿名函数,等于为closure类实例化一个对象,并把匿名函数体的代码变成closure类__invoke方法的代码。
小结:虽然只用函数做了演示,类里的方法和函数一样,可做这四种类型约束。
类型约束允许NULL值做默认值。
约束类型签名加?
function test(string $a, ?string $b) { return $a . $b; }
经试验发现 $a 和 $b 的的区别在于 $a的传值不能是null,而$b可以传一个null值,也就是说 “?string” 的意思是 null 或string类型,试验PHP版本为7.2。