php5类型约束学习笔记
发布:smiling 来源: PHP粉丝网 添加日期:2014-02-10 12:17:04 浏览: 评论:0
php是一种弱类型的编程语言,在php程序中,变量的数据类型可以随着其值的不同而自动发生改变,php也不会对变量的数据类型进行强制检查或约束.
我们可以参考下面一个简单的代码示例:
- <?php
- class Person {
- }
- $a = 1; //此时,$a为整数类型型(Integer)
- var_dump($a);
- $a = 1.0; //此时,$a为浮点类型(Float)
- var_dump($a);
- $a = 'CodePlayer'; //此时,$a为字符串类型(String)
- var_dump($a);
- $a = array('CodePlayer' => 'http://www.111cn.net'); //此时,$a为数组类型(Array)
- var_dump($a);
- $a = new Person(); //此时,$a为Person对象类型(Object)
- var_dump($a);
- $a = mysql_connect('localhost', 'username', 'password'); //此时,$a为资源类型(Resource)
- var_dump($a);
- ?>
php弱数据类型的特点使得php使用起来显得简单而灵活,不过,这同样也是一把达摩克利斯之剑,也正是由于php弱数据类型的特点,在编写php程序代码时,开发人员更需要时刻注意变量数据类型的变化,尤其是变量作为函数的参数进行传递时,更需要注意这一点,毕竟,大多数的函数参数都只期望是某种特定的数据类型,例如,在下面的例子中,函数sayHi()期望接收的参数类型是Person对象类型,但是,由于php并不是强类型的语言,也不会强制检查变量的类型,因此我们可以向函数中传递任意类型的参数,从而导致程序报错或逻辑出现异常,实例代码如下:
- <?php
- class Person {
- public $name = 'CodePlayer';
- public $age = 3;
- }
- function sayHi($person){
- echo "Hello! My name is $person->name. I'm $person->age years old.";
- }
- $p = '张三';
- sayHi($p); //不是期望的Person对象类型,将出现Notice级别错误信息,程序仍然继续运行
- echo 'Suffix'; //仍然会输出该文本信息
- ?>
从php 5开始,我们就可以使用新增的类型约束机制来对函数参数的部分数据类型进行类型约束。同样以上面的代码为例,我们可以在编写sayHi()函数时要求传递进来的参数必须是Person对象类型,否则引发致命错误(Fatal Error),并终止当前页面脚本的运行。要使用php的类型约束机制非常简单,我们只需要在函数声明的参数变量前添加指定的类型名称即可。当我们调用该函数时,php会强制检查函数的参数是否为指定的类型,如果不是指定的类型则引发致命错误,代码如下:
- <?php
- class Person {
- public $name = 'CodePlayer';
- public $age = 3;
- }
- function sayHi(Person $person){
- echo "Hello! My name is $person->name. I'm $person->age years old.";
- }
- $person = '张三';
- sayHi($person); //不是期望的Person对象类型,引发Fatal Error致命错误,程序终止运行
- echo 'Suffix'; //不会输出该文本信息,程序终止运行
- ?>
值得注意的是,在php 5中,目前只有对象、接口、数组、callable类型的参数变量才能使用类型约束(数组类型是从php 5.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);
- ?>
Tags: php5 类型 约束 学习笔记
- 上一篇:php入门级的PHP验证码程序
- 下一篇:php移位运算、移位操作学习笔记
相关文章
- ·php4和php5区别(2013-11-13)
- ·PHP5中使用Web服务访问J2EE应用程序(2013-12-08)
- ·php5.5中类级别的常量使用说明(2014-02-22)
- ·php5.3.9中post数据不完整问题解决(2014-09-21)
- ·PHP5.6新特性例子举证(2015-12-10)
- ·PHP5.6 CONST新特性几个例子(2016-08-18)
- ·PHP5.2中PDO的简单使用方法(2019-11-06)
- ·php5.2 Json不能正确处理中文、GB编码的解决方法(2020-11-05)
- ·php5.2以下版本无json_decode函数的解决方法(2021-01-10)
- ·php5.3不能连接mssql数据库的解决方法(2021-05-04)
- ·php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总(2021-05-20)
- ·PHP5多态性与动态绑定介绍(2021-05-20)
- ·将PHP从5.3.28升级到5.3.29时Nginx出现502错误(2021-05-25)
- ·php5.4传引用时报错问题分析(2021-07-06)
- ·PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法(2021-08-04)
- ·可兼容php5与php7的cURL文件上传功能实例分析(2021-09-17)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)