PHP面向对象类型约束用法分析

本文实例讲述了PHP面向对象类型约束。分享给大家供大家参考,具体如下:

什么是类型约束

就是要求某个变量只能使用(接受,存储)某种指定的数据类型;php属于”弱类型语言“,通常不支持类型约束;相应的,强类型语言,类型约束却是其“基本特征”。

php中,只支持局部的部分类型约束

php中,只支持在函数(或方法)的形参上,设定类型的约束目标,形式如下:

function 方法名( [要求使用的类型] $p1, [要求使用的类型] $p2, ......){
  //....
}

说明:

  1. 定义一个函数(方法)时,一个形参,可以使用类型约束,也可以不使用;
  2. 如果使用了类型约束,则对应的该实参数据,就必须是要求的那种类型;
  3. 能够使用的类型约束,只有以下几种情况可用:

① 数组:array

② 对象:使用类的名称,传递过来的实参,必须是该类的实例

③ 接口:使用接口的名称,传递过来的实参,必须是实现了该接口的类的实例

<?php
//演示类型约束
interface USB{} //接口
class A{}  //类
class B implements USB{}  //实现了USB接口的类
function f1($p1, array $p2, A $p3, USB $P4){
  echo "<br />没有约束的p1:" . $p1;
  echo "<br />要求是数组的p2:" ;
    print_r($p2);
  echo "<br />要求是类A的对象:";
    var_dump($p3);
  echo "<br />要求是实现实现了USB接口的对象:";
    var_dump($P4);
}
$obj1 = new A();
$obj2 = new B();
$arr = array();
//演示各种形式的函数调用
//f1(1.2, 1, $obj1, $obj2);//报错,第二个参数不是数组类型,Argument 2 passed to f1() must be an array, integer give
//f1(1, $arr, $obj1, $obj1);//报错,第四个参数,Argument 4 passed to f1() must implement interface USB, instance of A given
f1(1.2, $arr, $obj1, $obj2);//没问题
?>

运行结果:

没有约束的p1:1.2
要求是数组的p2:Array ( )
要求是类A的对象:
object(A)[1]
要求是实现实现了USB接口的对象:
object(B)[2]

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • PHP中的类型约束介绍

    PHP的类方法和函数中可实现类型约束,但参数只能指定类.数组.接口.callable 四种类型,参数可默认为NULL,PHP并不能约束标量类型或其它类型. 如下示例: 复制代码 代码如下: <?php   class Test {     public function test_array(array $arr)     {         print_r($arr);     }       public function test_class(Test1 $test1 = null)   

  • php面向对象全攻略 (八)重载新的方法

    12.重载新的方法 在学习PHP 这种语言中你会发现,PHP 中的方法是不能重载的,所谓的方法重载就是 定义相同的方法名,通过"参数的个数"不同或"参数的类型"不同,来访问我们的相同方法 名的不同方法.但是因为PHP 是弱类型的语言,所以在方法的参数中本身就可以接收不同类 型的数据,又因为PHP 的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用 不相同方法名的不同方法也是不成立的.所以在PHP 里面没有方法重载.不能重载也就是在 你的项目中不能定义相同方

  • PHP和JAVA中的重载(overload)和覆盖(override) 介绍

    重载:同一个类中,函数名一样,返回值或者参数类型,个数不一样的叫做重载. 覆盖:同名函数,同返回值类型,同参数的叫做覆盖.指的是子类对父类中方法的覆盖. PHP不支持方法和操作符重载.JAVA不支持操作符的重载(但是"+"实际上是一种操作符重载). 复制代码 代码如下: <?php Class Father { public function fmeth1() { echo "fmeth1()...<br>"; } //public functio

  • PHP类型约束用法示例

    本文实例讲述了PHP类型约束用法.分享给大家供大家参考,具体如下: 在强类型语言中,类型约束是语法上的要求,即定义一个变量的时候,必须指定类型,并以后也只能存储该类型数据: php是弱类型,其特点是无需为变量指定类型,而且在其后也可以存储任何类型,不过在php的新语法中,在某些特定场合,针对某些特定类型,也可进行语法约束. 特定场合:函数(方法)的形参变量 特定类型:对象类型(类名).接口类型(接口名).数组类型(array).函数类型(callable) 即可以对函数(方法)的参数设定必须使用

  • php继承中方法重载(覆盖)的应用场合

    本文实例分析了php继承中方法重载(覆盖)的应用场合.分享给大家供大家参考.具体分析如下: 方法重载(override)/覆盖--在什么情况下使用:当父类知道所有的子类都需要用到一个方法,但父类不知道怎么去写这个方法时,就需要用到方法的重载.这时候,可以让子类去重写,来覆盖这个方法. 通俗实例--父类(动物)知道其子类(猫和狗)都会叫,但它们的叫法都不一样,所以父类没法去写这个方法,只能让子类(猫和狗)去定义.代码如下: <?php class Animal{ public $name; pro

  • PHP面向对象编程之深入理解方法重载与方法覆盖(多态)

    什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述--多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4编程技术内幕").简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针(没错这段话来自百度百科).那么多态的作用是什么,它有

  • php中拷贝构造函数、赋值运算符重载

    对象的赋值与复制: 赋值:通过" = "运算符重载User a(10),b;b = a;复制:调用复制构造函数User b;User a(b);或者User a = b;//相当于User a(b);与赋值的区别,赋值是对一个已经存在的对象进行赋值(已经实现定义了被赋值的对象),而复制是从无到有建立一个新的对象,并使它与已有的对象相同.浅复制与深复制: 若对象中有指针成员,在复制时,只会将该指针成员的地址复制给新建立的对象,因此,两个对象中的指针成员都指向了同一块内存区域,在释放时会出

  • PHP实现的函数重载功能示例

    本文实例讲述了PHP实现的函数重载功能.分享给大家供大家参考,具体如下: 由于PHP是弱类型语言,因此函数的输入参数类型无法确定(可以使用类型暗示,但是类型暗示无法用在诸如整型,字符串之类的标量类型上),并且对于一个函数,比如只定义了3个输入参数,PHP却运行调用的时候输入4个或者更多的参数.因此基于这2点,注定了PHP中无法重载函数,(类似Javascript语言),也无法有构造函数的重载. 由于实现函数的重载对提高开发效率很有帮助,如果能象C#或者C++那样,那就非常好了.事实上,PHP的提

  • php面向对象的方法重载两种版本比较

    多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数. PHP4 中仅仅实现了面向对象的部分的.简单的功能,而 PHP5 以后对对象的支持就强大的多了. 对于多态的实现,PHP4 只支持覆盖(override),而不支持重载(overload).但我们可以通过一些技巧来"模拟"重载的实现. PHP5 虽然可以支持覆盖和重载,但重载在具体实现上,和其他语言还有较大的差别. 1,在 PHP4 中"模

  • PHP面向对象类型约束用法分析

    本文实例讲述了PHP面向对象类型约束.分享给大家供大家参考,具体如下: 什么是类型约束 就是要求某个变量只能使用(接受,存储)某种指定的数据类型:php属于"弱类型语言",通常不支持类型约束:相应的,强类型语言,类型约束却是其"基本特征". php中,只支持局部的部分类型约束 php中,只支持在函数(或方法)的形参上,设定类型的约束目标,形式如下: function 方法名( [要求使用的类型] $p1, [要求使用的类型] $p2, ......){ //....

  • Python基本数据结构之字典类型dict用法分析

    本文实例讲述了Python基本数据结构之字典类型dict用法.分享给大家供大家参考,具体如下: 词典类型 dict 字典由键(key)和对应值(value)成对组成.字典也被称作关联数组或哈希表. dict 赋值 dict 整体放在花括号{}中,每个键与值用冒号隔开(:),每对用逗号分割: d = {'one':1, 'two':2, 'three':3} 键必须独一无二,但值则不必:值可取任何数据类型,如字符串,数或元组:若创建时同一个键被赋值两次,后一个值会被记住: 键必须不可变,所以可以用

  • 《javascript设计模式》学习笔记二:Javascript面向对象程序设计继承用法分析

    本文实例讲述了Javascript面向对象程序设计继承用法.分享给大家供大家参考,具体如下: 1.关于继承: 百度百科对继承的解释是:继承是指一个对象直接使用另一对象的属性和方法. (话说百科对于计算机概念的继承的解释也太简略了) 继承的好处,优点学过面向对象的同学都知道,就不赘述了. javascript中的继承有三种(不同的书上对这三中的名称翻译都不一样,我按照我的理解来命名吧): a.构造函数继承(类式继承,组合继承,伪经典继承) b.原型继承 c.原型赋值(遍历)继承(寄生式继承) 2.

  • PHP7标量类型declare用法实例分析

    本文实例讲述了PHP7标量类型declare用法.分享给大家供大家参考,具体如下: php7为了提高执行效率,在函数方法中增加了标量类型(布尔.浮点.整型.字符)的申明特性,节省了对数据类型的检测. php7 仍然支持弱类型检测,即仍然可以使用原来的方式声明形参. 标量声明有两种特性: 强制模式(默认):体现在类型转换上 严格模式 模式声明:declare(strict_types=1); 默认情况值为0,值为1代表为严格校验的模式 可以使用的类型参数: int-float-bool-strin

  • Python面向对象class类属性及子类用法分析

    本文实例讲述了Python面向对象class类属性及子类用法.分享给大家供大家参考,具体如下: class类属性 class Foo(object): x=1.5 foo=Foo() print foo.x#通过实例访问类属性 >>>1.5 print Foo.x #通过类访问类属性 >>>1.5 foo.x=1.7 #只改新实例属性,不会改变类属性 print foo.x >>>1.7 print Foo.x >>>1.5 foo.

  • Ajax返回值类型与用法实例分析

    本文实例讲述了Ajax返回值类型与用法.分享给大家供大家参考,具体如下: Ajax返回值类型主要有XML类型和文本类型,其中文本类型又可以分为HTML.json类型等. 1.返回值之XML类型 如果服务器的响应头中Content-type的内容为text/xml时,此时XMLHttpRequest对象的responseXML属性才能使用. 2.返回值之文本类型 文本类型主要分为Html类型和json类型. (1)Html类型 使用场景:一般返回需要重复复杂的操作.比如,页面使用ajax从服务器请

  • C#类的访问修饰符用法分析

    本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考.具体用法分析如下: 默认情况下,类声明为内部的,即只有当前工程中的代码才能访问它.可以用internal访问修饰符关键字显式指定,但这不是必须的,类在定义时默认为此类型的类.但是C# 方法默认访问级别: private. 方法或者属性的修饰符的访问级别如下图: 访问修饰符 意 义 public 访问不受限制,可以类内和任何类外的代码中访问 protected 可访问域限定于类内或从该类派生的类内 internal 可访问域限定于类所在的

  • PHP模板引擎Smarty中的保留变量用法分析

    本文实例讲述了PHP模板引擎Smarty中的保留变量用法.分享给大家供大家参考,具体如下: 在 Smarty 中,有一些保留变量,它们是不需要 PHP 脚本去分配就可以直接使用,即不用使用 $_tpl->assign('var','value') 去分配. 1.在模板中访问页面请求的变量 {$smarty.get.user} == $_GET['user'] {$smarty.post.user} == $_POST['user'] {$smarty.cookie.username} == $_

  • JS设计模式之状态模式概念与用法分析

    本文实例讲述了JS设计模式之状态模式概念与用法.分享给大家供大家参考,具体如下: 1. 概述 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 2. 解决的问题 主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化. function Context( _state ) { this.state = _state; this.request = function() { this.stat

随机推荐