指定形参类型是PHP 5就支持的一项特性。形参支持array - 数组、 object - 对象两种类型。

class User{
public $name;
public $password;
function __construct($name,$password){
$this->name=$name;
$this->password=$password;
}
} //参数可以指定对象类型 function f1(User $user){
echo $user->name,”,”,$user->password;
} //参数可以指定数组类型 function f2(array $arr){} //参数不可以指定基本类型,下面一句会出错 function f3(string $s){}

那对于我们最常见的需求,如强制参数类型是字符串或整型,怎么办呢?

在不考虑转换到Facebook的HHVM运行环境下的前提下,就用不了Hack语言。在没有Hack语言的情况下,就得自行定义一些基本类型类来完成相应的功能。

以下代码纯属思考,未经项目实证,对于相应性能或灵活性的影响需要在项目中实战评估。

class CString {
private $_val = ''; public function __construct($str = '') {
if (!is_string($str)) {
throw new Exception('Illegal data type');
}
$this->_val = $str;
} public function __toString() {
return $this->_val;
}
} class CInteger {
private $_val = 0; public function __construct($str = 0) {
if (!is_int($str)) {
throw new Exception('Illegal data type');
}
$this->_val = $str;
} public function __toString() {
return (string) $this->_val;
}
}

实际调用函数

function findUserByName(CString $name) {
$sql = '....' . $name;
//code
}
function findUserById(CInteger $id) {
$sql = '.... AND uid=' . $id;
//code
}

再往前走,对于集合型的数据呢? Yii框架中定义过一些相关的集合类,基本可以解决此类问题。

如CTypedList:

class CTypedList extends CList
{
private $_type; /**
* Constructor.
* @param string $type class type
*/
public function __construct($type)
{
$this->_type=$type;
} /**
* Inserts an item at the specified position.
* This method overrides the parent implementation by
* checking the item to be inserted is of certain type.
* @param integer $index the specified position.
* @param mixed $item new item
* @throws CException If the index specified exceeds the bound,
* the list is read-only or the element is not of the expected type.
*/
public function insertAt($index,$item)
{
if($item instanceof $this->_type)
parent::insertAt($index,$item);
else
throw new CException(Yii::t('yii','CTypedList<{type}> can only hold objects of {type} class.',
array('{type}'=>$this->_type)));
}
}

而对于单纯的数组,能怎么办呢?

通过指定函数/方法形参类型提高PHP代码可靠性的更多相关文章

  1. 巧妙利用函数的惰性载入提高javascript 代码性能

    在 javascript 代码中,因为各浏览器之间的行为的差异,我们经常会在函数中包含了大量的 if 语句,以检查浏览器特性,解决不同浏览器的兼容问题. 例如,我们最常见的为 dom 节点添加事件的函 ...

  2. 利用函数的惰性载入提高 javascript 代码性能

    在 javascript 代码中,因为各浏览器之间的行为的差异,我们经常会在函数中包含了大量的 if 语句,以检查浏览器特性,解决不同浏览器的兼容问题.例如,我们最常见的为 dom 节点添加事件的函数 ...

  3. java方法句柄-----1.方法句柄类型、调用

    目录 方法句柄 1.方法句柄的类型 1.1MethodType类的对象实例的创建 1.1.1 通过指定参数和返回值的类型来创建MethodType.[显式地指定返回值和参数的类型] 1.1.2 通过静 ...

  4. C++11用于计算函数对象返回类型的统一方法

    [C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...

  5. 关于strcpy函数形参类型的解析和指针作为输入型输出型参数的不同

    在C语言中,字符串一直都是热点,关于strcpy函数大家都很熟悉,但是真正了解的很少,一旦用到总会报一大堆莫名其妙错误,今天我就来给大家详细剖析一下strcpy函数. 虽然不能看到strcpy的内部实 ...

  6. js推断指定函数、变量是否存在的方法

    //推断是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof (eval(funcName)) == "functio ...

  7. Python基本语法_函数属性 & 参数类型 & 偏函数的应用

    目录 目录 前言 软件环境 Python Module的程序入口 函数的属性 Python函数的创建 函数的参数 必备参数 缺省参数 命名参数 不定长参数 匿名参数 偏函数的应用 前言 Python除 ...

  8. jQuery中常用的函数方法

    jQuery中常用的函数方法总结 Ajax处理 load(url,[data],[callback]) url (String) : 待装入 HTML 网页网址. data (Map) : (可选) ...

  9. OSD的主要实现方法和类型(转)

    源:OSD的主要实现方法和类型 目前有两种主要的OSD实现方法:外部OSD发生器与视频处理器间的叠加合成;视频处理器内部 支持OSD,直接在视频缓存内部叠加OSD信息. 外部OSD发生器与视频处理器间 ...

随机推荐

  1. 知方可补不足~SQL2008中的发布与订阅模式~续

    回到目录 上一回介绍了如何在sql2008中建立一个数据库的发布者,今天来说一下如何建立一个订阅者,其实订阅者也是一个数据库,而这个数据库是和发布者的数据结构相同的库,它们之间通过SQL代理进行数据上 ...

  2. 用css来写一些简单的图形

    在写网页的过程中,有时我们需要用到一些简单的图片但是手头又没有合适的,我们其实可以自己来写,下面我就简单的介绍几个例子: 1.上三角 Triangle Up #triangle-up { width: ...

  3. 关于Lua优质文章链接

    Lua 语言 15 分钟快速入门(博客-伯乐在线) http://blog.jobbole.com/70480/

  4. Atitit cnchar simp best list  汉字简化方案 最简化汉字256个

    Atitit cnchar simp best list  汉字简化方案 最简化汉字256个 1.1. 最简化发音1 1.2. 根据笔画密度,删除了密度高的字..1 1.3. 使用同发音的英文字母等代 ...

  5. 一条Select语句丛生到死的处理过程

    以一条普通的“select * from table order by …”语句为例.图2-21中显示为该语句在数据库中各个组件之间的处理过程,各个步骤分别代表: (1)select语句通过网络传送给 ...

  6. iOS-----Xcode-Debug尝试

    在Xcode中,Debug时,不能像eclipse ,或VS那些集成开发那样,能直接查看变量的值.那怎么在调试的时候查看XCode的变量呢? 有一些方法的. 1.新建一个Single View App ...

  7. android 股票数据通过日K获取周K的数据 算法 源码

    目前的数据是从新浪接口获取的, http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sh600000&end ...

  8. SAP Business One系统功能介绍

    SAP Business One(简称SAP B One)是一套价格合理.易于实施的综合业务管理解决方案.该解决方案专为中小型企业量身打造,可确保实现公司发展.提高可盈利性和控制力度以及实现业务流程的 ...

  9. [转] SSH原理与运用(2):远程操作与端口转发

    英文:阮一峰 链接:http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html 接着前一次的文章,继续介绍SSH的用法. (Imag ...

  10. java session 详解

    原网址:http://blog.sina.com.cn/s/blog_670b6d880101deff.html 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于tra ...