资讯专栏INFORMATION COLUMN

浅谈PHP的类型约束

forsigner / 2358人阅读

摘要:但是在的高版本语法中起,在某些特定场合,针对某些特定类型,也是可以进行语法约束的。注意在以前,类型约束不能用于标量类型如或。这意味着严格声明标量是基于文件可配的。这个指令不仅影响参数的类型声明,也影响到函数的返回值声明。

前言

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

而我们的PHP是弱类型语言,其特点就是无需为变量指定类型,而且在其后也可以存储任何类型,当然这也是使用PHP能快速开发的关键点之一。但是在php的高版本语法中(PHP5起),在某些特定场合,针对某些特定类型,也是可以进行语法约束的。

介绍

自PHP5起,我们就可以在函数(方法)形参中使用类型约束了。

函数的参数可以指定的范围如下:

必须为对象(在函数原型里面指定类的名字);

接口;

数组(PHP 5.1 起);

callable(PHP 5.4 起)。

如果使用 NULL 作为参数的默认值,那么在调用函数的时候依然可以使用 NULL 作为实参。

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

注意:在PHP7以前,类型约束不能用于标量类型如 int 或 string。Traits 也不允许。

使用

下面是官方给的例子:

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";
}
?>

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

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);
?>

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

var;
}

// 正确
$myclass = new MyClass;
MyFunction($myclass);
?>

类型约束允许 NULL 值:

PHP7

标量类型声明 (PHP 7)

标量类型声明 有两种模式: 强制 (默认) 和 严格模式。
现在可以使用下列类型参数(无论用强制模式还是严格模式):

字符串(string),

整数 (int),

浮点数 (float),

布尔值 (bool)。

它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。


以上范例的运行结果会输出:int(9)

要使用严格模式,一个 declare 声明指令必须放在文件的顶部。这意味着严格声明标量是基于文件可配的。 这个指令不仅影响参数的类型声明,也影响到函数的返回值声明。

总结

以上就是PHP类型约束的大概简介和使用方法了,在使用PHP进行开发过程中,用到它的地方可能不是太多,我们最常看见或用到类型约束的地方是在“依赖注入”的设计模式中,有兴趣的可以看下我这篇介绍依赖注入的文章:聊一聊PHP的依赖注入(DI) 和 控制反转(IoC)

参考官方文档:http://php.net/manual/zh/language.oop5.typehinting.php

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21972.html

相关文章

  • 【转】浅谈PHP5中垃圾回收算法(Garbage Collection)演化

    摘要:所有这些类型,在内部统一用一个叫做的结构表示,在源代码中这个结构名称为。的具体定义在源代码的文件中,下面是相关代码的摘录。 【转】浅谈PHP5中垃圾回收算法(Garbage Collection)的演化 前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage C...

    AdolphLWQ 评论0 收藏0
  • php内核阅读(2)--浅谈 gc回收机制

    摘要:垃圾回收所谓垃圾就是指通过循环引用自己引用自己,目前只在类型中有出现的形式而导致永远不为。当出现垃圾之后,的引擎有对应的垃圾回收机制。触发这个机制的时机是每次出现减少时候。 自嘲)。。。。。2333,我觉得这是因为在php语言层面就帮我们解决了内存回收的问题,但这让我在和java大牛们吹牛逼的时候,听到什么内存泄露。。。。(纳尼,我tmd怎么从来没遇见过)一脸懵逼。 本人小菜,如果下面...

    wemallshop 评论0 收藏0
  • 谈谈 PHP类型约束

    摘要:但是在以来,在面向对象中,为方法带来了类型约束,然而这些都非常的鸡肋,从文档上可以看到。支持对象接口支持数组支持匿名函数类型约束不能用于标量类型如或。它的运作方式,是在中设置一个标志位,让函数调用和返回类型检查符合类型约束。 起点 众所周知,PHP 是弱类型语言,与其他强类型语言项目,在这方面会有很多的坑,但是已经发展到 PHP 7 之后,PHP 也对类型约束有了所指,并且在许多流行框...

    libxd 评论0 收藏0
  • Learning PHP —— 设计模式 | Chap1:浅谈设计模式中OOP

    摘要:而哈士奇区别于普通狗,又有新的特征逗比,爱捣乱为了保证类之间的松绑定,通常会继承抽象类,而且是浅继承只有一层子类。如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。 为什么使用OOP OOP是一个模块化的过程,目的是为了把复杂问题简单化,一个模块解决一个复杂问题的某一个方面,即一个类应当只有一个职责 OOP区别于顺序式编程与过程式编程,在于: 1.顺序编程...

    SunZhaopeng 评论0 收藏0
  • 浅谈创业公司或新项目如何做技术选型

    摘要:创业公司或新项目如何做技术选型一个创业公司或者新项目如何做技术选型个人认为一定要记住这个根本新项目最先要解决的就是原型核心业务落地验证商业模式。开源的最新的稳定的根据业务选定技术栈之后,尽量拥抱开源的东西。 创业公司或新项目如何做技术选型 一个创业公司或者新项目如何做技术选型?个人认为一定要记住这个根本:新项目最先要解决的就是原型核心业务落地验证商业模式。具体实践中,应当遵循以下原则和...

    mrli2016 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<