type-ag捕鱼王app官网

type-hinting 在php5 和 php7 中有什么不同

作者:迹忆客 最近更新:2022/12/12 浏览次数:

我们知道,php作为弱类型语言,对变量的类型并没有显示的要求,所有的都是在底层自动进行处理。 但是,在应用层面其实也是提供了type-hinting功能。这点对于php代码的规范也是必须的。

但是,对于 type-hinting,在 php5 中并全面,而是在php7中才完善起来的。

type-hinting

首先,我们先简单介绍一下什么是type-hinting。 了解c语言的码友都知道,c语言对类型的要求非常严格,我们看下面的函数定义

int add(int a,int b)
{
    return a b;
}

当我们要调用add函数的时候所传的参数ab必须是整型(int),而且返回值也必须是整型。如果有任意一个参数或者返回值的类型不一致,在编译的时候就会失败。 这就是 type-hinting

下面我们再看一段php代码

function add($a,$b)
{
    return $a   $b;
}

同样在我们调用add函数的时候,所传参数就不必须是整型,而且返回值也是任意类型都可以。当然,我们期望的是$a$b和返回值都是整型的,但是由于php弱类型的特性,即使不是整型程序也会正常运行。所以经常会导致比较难调试的bug。这类代码在php中是最常见的。

当然,对于php来说,即使没有语法上的type-hinting,我们也可以通过编码自己来实现。例如

function add($a,$b)
{
    if(!is_int($a) || !is_int($b)) {
        die("type error\n");
    }
    return $a   $b;
}

上面的写法虽然也能保证参数都是整型,然而缺不便于维护。因此type-hintingphp中也是有一定的必要性的。

下面我们正式介绍在php5php7type-hinting有什么不同。

php5 中的 type-hinting

其实在php5中已经提供了 type-hinting的功能,只是还不是特别完善。 只是对于objectarray的限定。
array就比较容易理解了

function merge_array(array $a,array $b)
{
    return merge($a,$b);
}
$a = array("one","two");
$b = array("three","foue");
print_r(merge_array($a,$b));

合并两个数组,要求参数必须都是数组,$a$b是两个数组,这没什么问题。如果$a $b不是数组,那就会报错了

function merge_array(array $a,array $b)
{
    return merge($a,$b);
}
$a = 1;
$b = 2;
print_r(merge_array($a,$b));

执行结果报错,部分错误信息

php catchable fatal error:  argument 1 passed to merge_array() must be of the type array, integer given, ...
...

object 要求的就是所属当前类的实例对象。也就是说,参数中所接收的对象必须是当前类的一个实例。


function example(string $a)
{
    var_dump($a);
}

上面的string 并不是字符串,而是一个string类。如果我们直接传一个字符串就会报错

function example(string $a)
{
    var_dump($a);
}
$str = "string";
example($str);

上面代码会报错

php catchable fatal error: argument 1 passed to example() must be an instance of string, string given, ...
 ...

正确的代码应该是这样的

class string
{
}
function example(string $a)
{
    var_dump($a);
}
$obj = new string;
example($obj);

当然了,string可以换成任意的类名。像 int string bool等这些类型都不是原始的数据类型。如果写在函数参数前面那就都是表示的类。我们的类基本上是不会起这些名字的。 当然,除了类名也可以是接口名。

interface textcontract{}
class test implements testcontract
{
}
function example(testcontract $a)
{
    var_dump($a);
}
$obj = new test;
example($obj);

我个人认为,php5中的type-hinting主要是为了接口而实现的。接口相当于一个标准,一个接口多个实现,只要符合该标准就可以通过。如果单独对于一个类进行限定,其实没什么太大的意义。

php7 中的 type-hinting

对于php7type-hinting就很完善了,除了包含了php5中的情况之外,对于string,int,boolean等这些类型也进行了限定。在php7中像stringint就不能作为类名了。

class string{}

这是会报错的

php fatal error:  cannot use 'string' as class name as it is reserved ...
...

对函数的参数进行了string 或者int等类型限定之后,那么调用函数时传的参数就必须是相对应的数据类型了。

function concact(string $a,string $b)
{
    return $a.$b;
}
$a = "hello ";
$b = "world";
print concact($a,$b);
function add(int $a,int $b)
{
    return $a   $b;
}
$c = 11;
$d = 12;
print add($c,$d);

综上,就是 php5php7中参数type-hinting的不同之处。

c 中除了对于参数的类型限定之外,还有对于返回值的类型进行的限定。而在上面的例子中我们只是比较了php5php7的参数的不同,对于返回值有没有什么不同呢。其实是有的。

php5中对于返回值是没有进行限定的。 而在php7中对与返回值也是有type-hinting的。

function add(int $a,int $b) : int 
{
    return $a   $b;
}
$a = 1;
$b = 2;
print add($a,$b);

冒号 ':' 后面的就是对返回值的类型进行的限定。这是在php5中不存在的。

到此一个完整的type-hintingphp5php7中的不同之处结束了。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

发布时间:2024/03/25 浏览次数:70 分类:mysql

在本指南中,我们将了解使用 phpmyadmin 从 mysql 数据库中删除所有行的最佳方法。

使用 php mysqli 函数获取最后插入的 id

发布时间:2023/05/09 浏览次数:102 分类:mysql

本篇文章简要介绍了 php mysqli() 函数并演示了如何使用它从 mysql 数据库中获取最后插入的 id。它是一个名为 mysqli 的 mysql 驱动程序扩展版本,

发布时间:2023/04/20 浏览次数:143 分类:mongodb

在为大文件创建可扩展存储方面,mongodb 及其 gridfs(使用 mongodb 查询语言 - mql 编写)是市场上最好的文件存储ag捕鱼王app官网的解决方案之一。 在本教程中,您将学习如何在 php 中使用 mongodb 作为文件存储。

如何在 php 中获取时间差的分钟数

发布时间:2023/03/29 浏览次数:204 分类:php

本文介绍了如何在 php 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。

发布时间:2023/03/29 浏览次数:156 分类:php

本教程演示了如何将用户从页面重定向到 php 中的其他页面

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图