众所周知,在强类型语言中,类型约束是语法上的要求,即:定义一个变量的时候,必须指定其类型,并且以后该变量也只能储存该类型的数据。
而PHP是弱类型语言,其特点就是无需为变量指定类型,而且在其后也可以储存任何类型,当然这也是PHP能快速开发的关键之一。但是在php的高版本(PHP5器)语法中,在某些指定场合,针对某些特定类型,也是可以进行语法约束的。
PHP5可以使用类型约束。函数的参数可以指定必须为对象(在函数原型里面指定类的名字),接口,数组(PHP5.1起)或者callable(PHP5.4起)。不过如果使用NULL作为参数的默认值,那么在调用函数的时候依然可以使用NULL作为实参。
如果一个类或接口指定了类型约束,则其所有的子类或实现也都如此。
在PHP7之前,类型约束不能用于标量类型如int或string,Traits也不允许。
看看下面列子:
<?php
/**
* 测试类型约束类
*/
class Test
{
private function say()
{
echo '我是测试类型约束的类';
}
public function dump($data)
{
var_dump($data);
}
/**
* 测试对象约束
* @param Test $test
*/
public function testObject(Test $test)
{
$test->say();
}
/**
* 测试数组约束
* @param array $arr
*/
public function testArray(array $arr)
{
var_dump($arr);
}
/**
* 测试接口约束
* @param animal $obj
*/
public function testInterface(animal $obj)
{
echo $obj->run();
}
/**
* 测试回调方法约束
* @param callable $fun
* @param $data
*/
public function testCallable(callable $fun, $data)
{
call_user_func($fun,$data);
}
}
/**
* Class Test2
* 生成一个子类
*/
class Test2 extends Test
{
}
/**
* Interface animal
* 定义一个接口
*/
interface animal
{
public function run();
}
/**
* Class cat
* 实现animal接口
*/
class cat implements animal
{
public function run()
{
echo '喵喵喵';
}
}
$test = new Test();
//测试对象约束
$test->testObject($test);
//测试数组约束
$test->testArray([1,2,3]);
//测试接口约束
$test->testInterface(new cat());
//测试回调约束
$test->testCallable('self::dump', [1,2,3]);
//$test->testCallable(array('self','dump'), [4,5,6]);
//$test->testCallable(array($test,'dump'), [7,8,9]);
//回调约束,用类方法或者函数都可以
$test->testCallable('var_dump', [11,22,33]);
//对象约束子类也可以
$t2 = new Test2();
$test->testObject($t2);运行结果如下:
223

被折叠的 条评论
为什么被折叠?



