事实上,采用哪种处理参数类型的策略,取决于任何潜在bug的严重程度。通常PHP会根据语境自动转换大多数基本数据类型。

因此,你需要在检测类型、转换类型和依赖良好清晰的文档(无论决定用哪一种,都应该提供文档)之间仔细权衡。

无论你如何解决这类问题,都要认真思考一件事情:类型处理。PHP是一种弱类型的语言,这使得这件事更加重要。我们不能依靠编译器来防止类型相关的bug,必须考虑当非法数据类型的参数传递给方法时,会产生怎样的后果。

废话不多说,上代码

<?php
/*
* 这是一个简单的商品类
*/
class ShopProduct
{
public $title;
public $producerMainName;
public $producerFirstName;
public $price = 0; /*
* 初始化一些参数
*/
public function __construct($title,$firstName,$mainName,$price)
{
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
} //拼接生产人和生产者名称,然后返回
public function getProducer()
{
return "{$this->producerFirstName}"."{$this->producerMainName}";
}
}

我们用一个商品写入类调用商品类,这是我们的一般写法

<?php
/*
* 商品写入类
*/
class ShopProductWrite
{
public function write($shopProduct)
{
$str = "{$shopProduct->title}"."<br/>".$shopProduct->getProducer()."<br/>"."{$shopProduct->price}";
print $str;
}
}
$product1 = new ShopProduct("My Antonia","Willa","Cather",5.99);
$writer = new ShopProductWrite();
$writer->write($product1);

效果:

My Antonia
WillaCather
5.99

ShopProductWriter类只包括一个方法:write()。 write()方法接受一个ShopProduct对象,并用它的属性和方法构造和打印一个摘要字符串。我们把参数变量命名为$shopProduct,说明该方法希望接受一个ShopProduct对象,但是我们并没有强制要求这一点。也就是说,我们可能接收到非预期的对象或基本类型,但在实际处理$ShopProduct之前不会知道具体是什么。而那时代码则可能已根据预期(接收了真正的ShopProduct对象)执行了相应操作。

  为了解决这个问题(没有强制要求参数类型),PHP5引入了类的类型提示(type hint)。要增加一个方法参数的类型提示,只需简单地将类名放在需要约束的方法参数之前。我们可以这样修改write()方法:

public function write(ShopProduct $shopProduct){
  // …
}

  现在write()方法只接受包含ShopProduct对象的$shopProduct参数。让我们尝试用一个错误的对象来调用write():

class Wrong{}
$writer = new ShopProductWriter();
$writer->writer(new wrong());

效果:

Fatal error: Uncaught TypeError: Argument 1 passed to ShopProductWrite::write() must be an instance of ShopProduct, instance of ShopProductsss given, called in D:\work\ceshi\index.php on line 52 and defined in D:\work\ceshi\index.php:44 Stack trace: #0 D:\work\ceshi\index.php(52): ShopProductWrite->write(Object(ShopProductsss)) #1 {main} thrown in D:\work\ceshi\index.php on line 44

 

  有了参数的类型提示,我们不再需要在使用参数前对其进行类型检查。对于客户端程序员来说,方法的定义更加清晰易懂,一眼就能看明白该方法对于参数的要求,不用再担心一些由对象类型错误而引起的bug,因为提示是严格执行的。

  类型提示不能用于强制规定参数为某种基本数据类型,比如字符串和整型。如果要处理基本数据类型,在方法体中要使用is_int()这样的类型检查参数。但你可以强制规定使用数组作为参数。这被称为数组提示:

function setArray(array $storearray){
$this->array = $storearry;
}

php 限制类的对象类型的更多相关文章

  1. [java核心外篇]__Object类与对象类型的转型

    前言 我们在之前的学习中提过很多次了,java是面向对象的,java的基础可以说是建立在类和对象上面的.然后我们又学到了类的继承,发现了在java类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...

  2. Python 类和对象-下

    类的常用函数 #issubclass() 检测一个类是否是另外一个或者一组类中的子类 class Father: pass class Mother: pass class LaoWang: pass ...

  3. C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点

    C#反射实现   一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...

  4. Python踩坑:类与类对象类型参数传递与使用

    前言 对初学者来说,Python确实简单好用,毕竟动态类型语言,不用定义就可以拿来用,类型之间随意转换简直不要太方便,因此Python用来写写小脚本,爬虫程序什么的,没什么问题. 不过,一旦用来开发稍 ...

  5. 类———用类定义对象———error:C++表达式必须包含类类型

    //原文参考https://blog.csdn.net/lanchunhui/article/details/52503332 你以为你定义了一个类的对象,其实在编译器看来你是声明了一个函数 clas ...

  6. c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数

    一. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include&l ...

  7. SAP CRM 用户界面对象类型和设计对象

    在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...

  8. Java编程里的类和对象

    像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...

  9. C++基础知识(5)---类和对象

    终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...

随机推荐

  1. jmeter5.0生成html报告 快速入门

    JMeter性能测试5.0时代之-多维度的图形化HTML报告 快速入门 1.确认基本配置 在jmeter.properties或者user.properties确认如下配置项: jmeter.save ...

  2. 判断浏览器是否支持H5

    window.onload = function() { if (!window.applicationCache) { alert("请升级您的浏览器版本,你的浏览器不支持HTML5!&q ...

  3. java中级——集合框架【4】-Collections

    Collections 首先我们要知道Collections是一个类,容器的工具类,就如同Arrays是数组的工具类 反转 reverse 使List中的数据发生发转 package cn.jse.c ...

  4. python爬虫之Phantomjs安装和使用

    phantomjs: PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎.它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG. phantom ...

  5. SQL Server2012数据库开启远程连接

    在我们使用SQL Server数据库的时候很重要的一点就是开启数据库的远程连接,这是因为很多时候数据库部署在远程的服务器上会比较方便,而部署在客户端的话,由于客户端不固定,所以需要经常去部署,这样容易 ...

  6. postfix 邮箱设置及常见错误

    postfix 邮箱设置及常见错误 1.如果装了sendmail的话,先卸载了. yum remove sendmail 2.安装 Postfix yum install postfix 3.更改默认 ...

  7. MySQL in型子查询陷阱

    现在有两个表,table1和table2,table1有1千万数据(id 主键索引),table2有三条数据(uid字段 3,5,7): select * from table1 where id i ...

  8. 使用电脑adb给Essential Phone刷机 —(官方篇)

    用ADB给Essential Phone线刷升级 重要:请确保在刷机前已经解锁,关于解锁教程群里有! 准备 原版boot Twrp boot Magisk卡刷包 到官网下载OTA包 准备好Essent ...

  9. HTML中文本过长时自动隐藏末尾部分或中间等任意部分

    一.    一般情况下,HTML字符串过长时都会将超过的部分隐藏点,方法如下: 设置CSS: .ellipsis-type{ max-width: 50px;                      ...

  10. git指令详解总结

    Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...