php类型约束

来源:互联网 发布:中国的参政党知乎 编辑:程序博客网 时间:2024/06/06 16:36

众所周知,在强类型语言中,类型约束是语法上的要求,即:定义一个变量的时候,必须指定其类型,并且以后该变量也只能储存该类型的数据。

而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);
运行结果如下:



0 0
原创粉丝点击