php类型约束

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值