返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >type-hinting 在php5 和 php7 中有什么不同
  • 563
分享到

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

2024-02-27 19:02:10 563人浏览 安东尼
摘要

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

我们知道,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中的不同之处结束了。

--结束END--

本文标题: type-hinting 在php5 和 php7 中有什么不同

本文链接: https://lsjlt.com/news/568940.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • type-hinting 在php5 和 php7 中有什么不同
    我们知道,php作为弱类型语言,对变量的类型并没有显示的要求,所有的都是在底层自动进行处理。 但是,在应用层面其实也是提供了type-hinting功能。这点对于php代码的规范也是必须的。 但是,...
    99+
    2024-02-27
  • php7和php5有哪些不同点
    这篇文章给大家分享的是有关php7和php5有哪些不同点的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php标量类型和返回类型声明#主要分为两种模式,强制性模式和严格模式declare(strict_types=...
    99+
    2023-06-15
  • PHP7和PHP5在语法上的不同之处是什么
    这篇文章主要介绍了PHP7和PHP5在语法上的不同之处是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP7和PHP5在语法上的不同之处是什么文章都会有所收获,下面我们一起来看看吧。效率和性能提高最大的不...
    99+
    2023-07-05
  • php5和php7有什么区别
    php 7 是 php 5 的重大更新,带来了速度、性能和功能的显着改进:速度和性能:jit 编译器和优化后的 opcache 可提高执行速度和减少编译开销。新特性:类型声明提高了代码可...
    99+
    2024-04-02
  • PHP7和PHP5在安全上有什么区别
    本篇内容主要讲解“PHP7和PHP5在安全上有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP7和PHP5在安全上有什么区别”吧!函数修改1. preg_replace()不再支持/...
    99+
    2023-06-17
  • 探讨PHP7和PHP5在语法上的不同之处
    PHP是一种广泛使用的服务器端编程语言,被用于开发动态网站和应用程序。近些年,PHP7的发布引起了一些关注。PHP7比之前的版本(如PHP5)有很多改进和优化。在本文中,我们将探讨PHP7和PHP5在语法上的不同之处。效率和性能提高最大的不...
    99+
    2023-05-14
    php php7 PHP5
  • php7和PHP5对比有什么区别
    这篇文章主要介绍php7和PHP5对比有什么区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php7和PHP5对比的新特性和性能优化1. 抽象语法树(AST)AST在PHP编译过程作为一个中间件的角色,替换原来直接...
    99+
    2023-06-14
  • PHP7中的Type Hinting特性:如何明确函数的参数类型以避免错误和不确定性?
    PHP7中的Type Hinting特性:如何明确函数的参数类型以避免错误和不确定性?引言:在开发过程中,我们经常遇到函数传参的问题。有时候,由于函数参数类型不明确,导致出现错误和不确定性。为了解决这个问题,PHP7引入了Type Hint...
    99+
    2023-10-22
    参数类型 关键词:PHP Type Hinting
  • PHP7中的Type Hinting特性:如何明确函数的返回类型以避免错误和不确定性?
    PHP7中的Type Hinting特性:如何明确函数的返回类型以避免错误和不确定性?在编写PHP代码时,我们经常会遇到函数返回不确定类型的情况。这种不确定性可能导致程序在运行时出现错误,增加了代码维护的难度。幸运的是,在PHP7中引入了T...
    99+
    2023-10-22
    PHP 函数返回类型 Type Hinting
  • null值在oracle和mysql中有什么不同
    本篇内容主要讲解“null值在oracle和mysql中有什么不同”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“null值在oracle和mysql中有什么不同...
    99+
    2024-04-02
  • 数组和容器在Python中有什么不同?
    在Python中,数组和容器是两个常见的数据结构,但是它们之间有很大的不同。本文将详细介绍数组和容器在Python中的不同点,并通过演示代码加深理解。 一、数组和容器的定义 数组是一组具有相同类型的元素的集合,这些元素可以通过索引来访问。数...
    99+
    2023-06-13
    关键字 容器 数组
  • C++和Python有什么相同和不同
    c++++ 和 python 的主要区别是:范例:c++ 是编译语言,而 python 是解释语言。性能:c++ 是性能导向语言,而 python 更注重可读性和快速开发。类型系统:c+...
    99+
    2024-05-14
    python c++ 网络编程
  • Html中DIV和Span有什么不同
    本篇内容介绍了“Html中DIV和Span有什么不同”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Html...
    99+
    2024-04-02
  • mongodb中find()和findOne()有什么不同
    mongodb中find()和findOne()的不同点:1、返回值不同,find()返回的是一个数组对象,而findOne()返回的是一个满足输入条件的文档对象;2、find()能够返回所有符合条件的对象,而findOne()则返回符合条...
    99+
    2024-04-02
  • java中this和super有什么不同
    这期内容当中小编将会给大家带来有关java中this和super有什么不同,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的...
    99+
    2023-06-14
  • python中RNN和LSTM有什么不同
    python中RNN和LSTM有什么不同?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyt...
    99+
    2023-06-14
  • python中cookie和session有什么不同
    本篇文章给大家分享的是有关python中cookie和session有什么不同,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、区别(1)cookie数据存储在客户浏览器上,s...
    99+
    2023-06-15
  • java中hashcode和equals有什么不同
    在Java中,hashCode()方法和equals()方法是用于比较对象的两种不同方式。hashCode()方法是Object类中...
    99+
    2023-10-19
    java
  • oracle中rowid和rownum有什么不同
    rowid 和 rownum 在 oracle 中用于标识表中的行:rowid:唯一的物理标识符,标识行在磁盘上的位置,即使行被更新也不会改变。rownum:伪列,表示查询结果集中行的行...
    99+
    2024-05-08
    oracle
  • sleep()与wait()在Java中有什么不同
    sleep()与wait()在Java中有什么不同?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。详解Java中的sleep()和wait()的区别对于sleep()方法,我们首...
    99+
    2023-05-31
    java sleep() wait()
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作