类与对象:类型约束

PHP 5 可以使用类型约束。函数的参数可以指定必须为对象(在函数原型里面指定类的名字),接口,数组(PHP5.1 起)或者 callable(PHP 5.4 起)。不过如果使用 NULL 作为参数的默认值,那么在调用函数的时候依然可以使用 NULL 作为实参。 

如果一个类或接口指定了类型约束,则其所有的子类或实现也都如此。 

类型约束不能用于标量类型如 int 或 string。Traits 也不允许。 

Example #1 类型约束示例

<?php

//如下面的类

class MyClass

{

    /**

     * 测试函数

     * 第一个参数必须为 OtherClass 类的一个对象

     */

    public function test(OtherClass $otherclass) {

        echo $otherclass->var;

    }

    /**

     * 另一个测试函数

     * 第一个参数必须为数组 

     */

    public function test_array(array $input_array) {

        print_r($input_array);

    }

}

    /**

     * 第一个参数必须为递归类型

     */

    public function test_interface(Traversable $iterator) {

        echo get_class($iterator);

    }

    /**

     * 第一个参数必须为回调类型

     */

    public function test_callable(callable $callback, $data) {

        call_user_func($callback, $data);

    }

}

// OtherClass 类定义

class OtherClass {

    public $var = 'Hello World';

}

?>  

函数调用的参数与定义的参数类型不一致时,会抛出一个可捕获的致命错误。 

<?php

// 两个类的对象

$myclass = new MyClass;

$otherclass = new OtherClass;

// 致命错误:第一个参数必须是 OtherClass 类的一个对象

$myclass->test('hello');

// 致命错误:第一个参数必须为 OtherClass 类的一个实例

$foo = new stdClass;

$myclass->test($foo);

// 致命错误:第一个参数不能为 null

$myclass->test(null);

// 正确:输出 Hello World 

$myclass->test($otherclass);

// 致命错误:第一个参数必须为数组

$myclass->test_array('a string');

// 正确:输出数组

$myclass->test_array(array('a', 'b', 'c'));

// 正确:输出 ArrayObject

$myclass->test_interface(new ArrayObject(array()));

// 正确:输出 int(1)

$myclass->test_callable('var_dump', 1);

?>  

类型约束不只是用在类的成员函数里,也能使用在函数里: 

<?php

// 如下面的类

class MyClass {

    public $var = 'Hello World';

}

/**

 * 测试函数

 * 第一个参数必须是 MyClass 类的一个对象

 */

function MyFunction (MyClass $foo) {

    echo $foo->var;

}

// 正确

$myclass = new MyClass;

MyFunction($myclass);

?>  

类型约束允许 NULL 值: 

<?php

/* 接受 NULL 值 */

function test(stdClass $obj = NULL) {

}

test(NULL);

test(new stdClass);

?> 

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月29日

热门专题

安徽开放大学|安徽开放大学报名,安徽开放大学报考,安徽开放大学,什么是安徽开放大学,安徽开放大学学历,安徽开放大学学费,安徽开放大学报名条件,安徽开放大学报名时间,安徽开放大学学历,安徽开放大学专业
安徽开放大学
开放大学|开放大学报名,开放大学报考,开放大学,什么是开放大学,开放大学学历,开放大学学费,开放大学报名条件,开放大学报名时间,开放大学学历,开放大学专业
开放大学
安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
外贸网站建设|外贸网站建设,英文网站制作,英文网站设计,美国主机空间,外贸建站平台,多语言网站制作
外贸网站建设
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
易捷尔高职单招|易捷尔高职单招,易捷尔高职单招培训,单招分数线,单招录取分数线,高职单招学校分数线
易捷尔高职单招
易捷尔单招|易捷尔单招,易捷尔单招培训,易捷尔单招报名,易捷尔单招考试,易捷尔单招培训学校,易捷尔单招分数
易捷尔单招
一年制中专|中专学历,中专是什么学历,中专是什么,中专有什么专业,中专升大专,一年制中专
一年制中专

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部