使用脚本语言时如何避免混淆?

时间:2011-06-22 15:54:07

标签: java php programming-languages

我曾经写过一种非常强大的类型语言,例如java。我需要告诉编译器我将放入什么类型的变量......例如......

 public static void sayHello(String aName)

我可以确保用户将字符串传递给我... 但如果我使用php,我可以这样做......

 function sayHello($aName)

我仍然可以调用sayHello,但我不知道param类型是什么......我可以让这个名字更具信息性:

 function sayHelloWithString($aName)

但是我无法阻止用户向我传递一个int .....用户仍然可以将int传递给我......这可能会导致很多错误....我怎么能停下来?分享任何想法或经验?谢谢。

8 个答案:

答案 0 :(得分:5)

如何阻止用户传入int?

在php中,您可以检查is_string,但当然,您将错过设置__toString的对象,或隐藏的数字转换为字符串。

如果必须让您的程序在开发人员尝试不同的东西时痛苦地哭泣,您可以在更高版本的PHP中指定类型(即function foo(ObjectType $bar)...)*

在大多数松散类型的语言中,您希望为主要类型设置后备:

  • 阵列
  • 字符串
  • 通用对象

在接受的内容中保持自由,对发送的内容要严格。

*类型提​​示不支持原始类型

答案 1 :(得分:2)

您可以使用以下方法检查他们传递的内容是否为字符串: http://php.net/manual/en/function.is-string.php

然后提供适当的错误处理。

答案 2 :(得分:2)

有几种方法可以解决这个问题......

  1. 使用支持docblock的IDE。这涉及编写代码时的运行前类型检查。
  2. 在函数中使用类型检查这只会对运行时类型检查有所帮助,而且在编写代码时也不会知道。
  3. 根据类型,您可以使用内置类型提示。但是,这仅适用于非标量值,特别是array和类名。
  4. 1 - 要使用优秀的IDE实现#1,您可以对文档进行文档拦截:

    /**
     * Say hello to someone.
     *
     * @param string $aName
     **/
    public function sayHello($aName) {
    

    2 - 要实现#2,请使用is_方法..

    public function sayHello($aName) {
        if (!is_string($aName)) {
            throw new ArgumentException("Type not correct.");
        }
        // Normal execution
    

    3 - 你不能用你上面的方法做到这一点,但这样的事情......除了#2之外的同样会抛出一个致命的致命错误,而不是ArgumentException

    public function manipulateArray(array $anArray) {
    

    值得注意的是,除非您正在编写可公开使用的库代码,否则大部分内容都是无关紧要的。您应该知道您的方法接受了什么,如果您首先尝试编写高质量的代码,那么您应该请事先检查一下。

    使用一个好的IDE(我推荐phpStorm一千次)你可以而且应该在任何地方利用DocBlocks来完成你的所有课程。它不仅在编写API和普通代码时有用,而且你可以用它来记录你的代码,如果你需要在6个月后查看代码怎么办,你可能不会记得它100%:-)

    此外,你可以使用docblocks做更多的事情,而不仅仅是定义参数类型,查找它。

答案 3 :(得分:1)

function sayHello($aName) {
  if (is_string($aName)) {
    //string OK!
  } else {
    echo "sayHello() only takes strings!";
  }
}

答案 4 :(得分:1)

在PHP中,您可以使用is_string函数检查已传递的变量是否为字符串:

 <?php 
 if (is_string($aName)) {
     echo "Yes";
 } else {
     echo "No";
 }
 ?>

希望有所帮助。

答案 5 :(得分:0)

或者/另外/使用Type Casting将变量转换为所需类型

http://us3.php.net/manual/en/language.types.type-juggling.php

答案 6 :(得分:0)

您可以选择检查以确保参数的类型正确。但是,如果不是,那么值得考虑一下你会做什么。如果您只是要抛出一个异常,那么最好只假设它是正确的类型,并且当您不允许执行某些操作时抛出异常。如果您不打算将更多有用的信息添加到已经抛出的异常/错误中,那么首先检查它没有多大意义。

至于向用户提供您想要的类型的指示,我通常坚持将其包含在变量名称中:

function sayHello($aNameStr)
function addItems($itemList)
...etc...

这一点,加上合理的文档,意味着用户可以查看该函数并找出它们应该首先传入的内容。

答案 7 :(得分:0)

某些脚本语言有可以帮助您的工具。例如,perl中的use strict需要在使用之前声明每个变量。但是,根据定义,语言仍然是弱类型的。

有时命名约定会有所帮助。例如,我们继承了旧的Fortran传统,即int变量的名称应该从i,j,k,l,m,n开始。此约定现在至少用于索引。