事实上,采用哪种处理参数类型的策略,取决于任何潜在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;
}

最新文章

  1. EF for MySql 开发配置手册
  2. Java Web中乱码问题
  3. 使用AS编译jni文件无法编译出arm64-v8a,x86_64和mips64平台的.so文件的解决方法
  4. navicat linux 破解
  5. iOS 中 为UIView添加背景图片
  6. hibernate date类型插入数据库时精度只到日期没有时间
  7. 字符设备驱动——memory编译问题及解决办法
  8. log2取整效率测试
  9. 【转】MYSQL入门学习之十二:存储过程的基本操作
  10. Git简单使用
  11. 自己实现的库函数1(strlen,strcpy,strcmp,strcat)
  12. http与https的区别以及https的加密原理
  13. 笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)
  14. spring boot+mybatis+quartz项目的搭建完整版
  15. AI之旅(3):升维与最小二乘法
  16. 安全工具-Arachni
  17. 用友U8年度账结转 常用凭证丢失
  18. Spring实战系列
  19. archiver error. Connect internal only, until freed. 之解决办法
  20. Linux命令总结(转)

热门文章

  1. 熟悉pyspider的装饰器
  2. SQL性能优化-order by语句的优化
  3. IdentityServer4【Topic】之确认(Consent)
  4. MySQL unknown variable &#39;default-character-set=utf8&#39;的解决
  5. MyBaits全局配置文件的各项标签2
  6. MySQL系列:索引基本操作(4)
  7. $mount(“#app”)手动挂载
  8. css的类选择器
  9. PHP关联查询
  10. Civil 3D 二次开发 事务