在php中使用断言进行类型检查?

时间:2010-05-11 19:41:44

标签: php oop assertions

我使用异常抛出函数在php的类中检查参数。我有执行基本检查的函数(===in_array等)并在false上抛出异常。所以我可以assertNumeric($argument, "\$argument is not numeric.");而不是

if ( ! is_numeric($argument) ) {
    throw new Exception("\$argument is not numeric.");
}

保存一些打字

我正在阅读php manual page on assert()

的评论
  

如维基百科所述 - “断言   他们主要是一种开发工具   通常在程序运行时被禁用   向公众发布。“和   “断言应该用于记录   逻辑上不可能的情况和   发现编程错误 - 如果   “不可能”发生,然后发生了什么   根本显然是错误的。这是   与错误处理不同:大多数   错误条件是可能的,   虽然有些可能非常   在实践中不太可能发生。运用   断言是一种通用错误   处理机制通常是不明智的:   断言不允许优雅   从错误中恢复,并断言   失败通常会使计划停止   突然执行。断言也有   不显示用户友好的错误   消息“。

     

这意味着给出的建议   “gk at proliberty dot com”给力   断言即使在启用时也是如此   他们已被手动禁用了   反对仅使用的最佳做法   它们作为开发工具

那么,我做错了吗?有什么其他/更好的方法吗?

2 个答案:

答案 0 :(得分:1)

就个人而言,我是第二个维基百科内容,而不是使用断言进行常规类型检查。

相反,我会使用PHP Type-Hinting(目前正在处理对象作为php 5.1和php 5.2中的数组......对于基本数据类型无法帮助你,但它仍然比没有更好);然后你可以使用你暗示的功能甚至更进一步,并考虑Ilia Alshanetsky的一般类型提示补丁。 See here

答案 1 :(得分:0)

与常规断言一样,您应该能够通过方便的全局常量或变量或类构造方法将自定义断言关闭。它们实际上不属于(活动)生产代码,或者默认在任何类型的库中都是活动的。对于你正在使用它们做的事情,即使你可以关闭它们,它似乎也浪费了CPU周期。

在低级语言中,断言对于捕获非常奇怪的情况非常有用,例如由过度热心的体系结构特定编译器优化所创建的错误。例如,你知道在任何理智的宇宙中,断言的条件都是正确的。然后你的编译器将时空结构分开,一切都改变了。所以,如果您使用PHC或Roadsend之类的东西编译您的应用程序,它们可能会很有用。

我还看到了“过于安全”的代码(主要是在C中),其中每个函数的入口都受到断言的保护。我真的质疑这样做的智慧。

简而言之,您希望您的代码优雅或根本不会失败,而不仅仅是暂停,特别是如果它取决于用户输入。断言仅报告评估为false的条件,它们不会处理错误。