第七章:第19节 PHP面向对象——类型约束

更新于:2021-07-15 16:35:43

其他很多语言中,类型约束是语法上的要求,即定义一个变量的时候,必须指定类型,并以后也只能存储该类型数据——这种是强类型语言的一个特点。比如:

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){....}:要求该参数只能是一个函数或方法,此时称之为回调函数(方法)


php中`Closure`和`Callable`的区别


看演示代码:

1.png

1.png


第12行代码出错,只能是A类的对象。


1.png

1.png


第13行代码出错,只能是数组


1.png

1.png


第12行代码出错,只能是函数。


前面我们讲过了,把一个函数体直接赋值给一个变量,这个函数就是匿名函数,闭包函数。这个变量就变成了一个对象变量——Closure类的对象。一个对象怎么当成函数用?借助魔术方法__invoke。


所以可以这样理解:定义一个匿名函数,等于为closure类实例化一个对象,并把匿名函数体的代码变成closure类__invoke方法的代码。


小结:虽然只用函数做了演示,类里的方法和函数一样,可做这四种类型约束。


类型约束允许NULL值做默认值。

1.png


约束类型签名加?


function test(string $a, ?string $b)
{
    return $a . $b;
}


经试验发现 $a 和 $b 的的区别在于 $a的传值不能是null,而$b可以传一个null值,也就是说 “?string” 的意思是 null 或string类型,试验PHP版本为7.2。


本节学习代码》》》