PHP应该首先检查所有函数的参数类型吗?

我已经构建了一系列字符串函数,它们可以执行各种操作,我注意到我实际上没有任何内部函数检查,以确保变量是一个字符串,然后才能完成它.

因此,在开发过程中的几次,我偶然传递了一些字符串以外的其他内容,从而导致错误.

现在,我想知道这是否是我应该一直这样做的事情.首先检查以确保已发送正确类型的数据/检查可能首先出现问题的事情,以某种方式记录它们,然后如果一切正常,则使用它做一些事情.

这是我应该坚持的吗?

你可以看到这是一个有点争议的话题.这是我的看法:

类型提示

尽可能使用类型提示.对于原始类型,PHP中不能使用类型提示,所以是的,您应该检查以确保您已收到有效参数.如果还没有,您的函数可以抛出异常或返回一些默认值,如null或false.

防守编程

编写可测试代码的想法是失败不是沉默或神秘的.没有理由避免显式参数验证:冗长,代码更清晰,更实用.

除了验证参数之外,您还可以实现错误处理程序来捕获边缘情况.但是你应该验证大多数参数,特别是如果它们对持久数据(如数据库)有影响.

墨菲定律完全有效,因此你必须尽可能多地应对可预测的错误.无效参数是一个容易预测的错误 – 无法验证它是代码中的定时炸弹.例如,调用is_string很容易并且扩散炸弹.

拳击

另一个考虑因素是“装箱”你的变量.这导致了非常冗长的代码,但它确实具有允许基元类型提示的优点.

我从来没有见过任何人通过他们的整个代码库实际做到这一点,但它就在那里.有一些SPL类可用于主要类型,所以你最终会这样:

@H_403_29@function stringThing (\SplString $myString) { ... } stringThing(new \SplString('This is my string'));

SplTypes强制执行基本类型,并在滥用时抛出异常.从文档:

@H_403_29@$string = new SplString("Testing"); try { $string = array(); // <----------this will throw an exception } catch (UnexpectedValueException $uve) { echo $uve->getMessage() . PHP_EOL; }

SplTypes是PECL扩展,并不总是标准PHP安装的一部分,因此请在使用之前检查扩展.该扩展也被认为是实验性的,尽管它已经存在了一段时间.

你也可以简单地创建自己的盒子:

@H_403_29@class myStringBox { private $string = ''; public function __construct($string=null) { if ($string) $this->set($string); } public function set($val) { if (!is_string($string)) throw new \InvalidArgumentException(); $this->string= $val; } public function __toString() { return $this->string; } public function trim() { return trim($this->string); } // extend with functions? }

…但是这有一个主要的功能差异,你不能直接设置一个新的字符串值,如下所示:

@H_403_29@$stringBox = new myStringBox('hello world! '); echo $stringBox; // "hello world![space]" echo $stringBox->trim(); // "hello world!" $stringBox = 'A new string'; echo $stringBox->trim(); // Error: Call to a member function trim() on a non-object

相反,您必须使用setter方法

@H_403_29@$stringBox = new myStringBox('hello world! '); echo $stringBox; // "hello world![space]" echo $stringBox->trim(); // "hello world!" $stringBox->set('A new world'); echo $stringBox->trim(); // "A new world"

这一切都引导我们回到类型提示,这可能是不必验证你的论点的最有效方式.

相关阅读

> Spl类型 – http://www.php.net/manual/en/book.spl-types.php
>在PHP中输入提示http://php.net/manual/en/language.oop5.typehinting.php
>防守编程 – http://en.wikipedia.org/wiki/Defensive_programming

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...