【问题标题】:Numbers Vs String Literals for Function Arguments函数参数的数字与字符串文字
【发布时间】:2011-07-16 02:44:56
【问题描述】:

我认为这个问题以前没有被问过(至少我找不到它,如果它有......)

最近我开始从事一个比我通常使用的更大的项目(至少更多的 OOP(...我的意思是函数、类和对象));然而,我的函数参数应该是什么变量类型让我抓狂,例如:

<?php
function uberFunc($myArgument){
    switch($myArgument){
         //Stuff
    }
}
?>

让我们说,在这个例子中,$myArgument 只能是一定数量的响应(即它不是用户创建的)。例如,$myArgument 可能会定义 sql 的排序方式或要使用的哈希值或 一些 预定义的值列表。然后 case 语句将 $myArgument 转换为某种操作(附加 mysql 字符串或以某种方式散列字符串)。

tl;dr: 函数的参数只能是一组预定义值中的一个。

我的问题是:对于这些类型的变量,最好使用字符串文字(将由 switch-case 语句解码)或数字(也将由 switch-case 语句解码) ?

目前我一直在翻转,开始创建笨拙的代码,所以我想选择一个(字符串文字或数字)并坚持下去

使用字符串字面量的优势(据我所知):

  • 可读性
  • 直接插入(即,如果您传递一个决定如何组织 sql 的变量,您可以执行类似 "SELECT * FROM main ORDER BY ".$myArgument 的操作

使用数字的优势(据我所知):

  • 可以通过数学运算(如果您需要这样的代码)
  • 我相信它们的处理速度会稍微快一些(但还不足以产生影响)

【问题讨论】:

    标签: php function computer-science arguments


    【解决方案1】:

    实际上,我真正看到的唯一正确的是“可读性”。

    关于变量是否可以“直接插入”到你的sql数据库中,如果你有 "SELECT * FROM main ORDER BY ".$myArgument 无论 $myArgument 是字符串还是整数,这都会起作用。但是,您应该使用准备好的语句(例如使用 PDO),这将防止 SQL 注入以及其他优点。

    可以被数学操纵吗?

    echo "3" + "4"; // Outputs 7
    

    在进行数学运算时,PHP 会将带引号的字符串转换为其数值。

    正如其他人所说,速度上的差异很小。

    for ($i = 0; $i < 1000000; $i++) {
        $var = "3" + "4"; // takes 0.207326889038 seconds
    }
    
    for ($i = 0; $i < 1000000; $i++) {
        $var = 3 + 4; // takes 0.103585958481 seconds
    }
    

    当然,它的长度是原来的两倍,但 100 万次迭代的 0.1 秒差异不算什么。如果你能做第二个,基本上做第一个是愚蠢的,但是如果它增加了可读性,正如你所知道的,它真的不会对速度产生太大影响。

    【讨论】:

      【解决方案2】:

      这当然取决于你的函数要做什么。

      如果您有一个将两个数字相加的函数,那么将字符串作为参数传递几乎没有意义。

      您的函数可能需要作用于一个对象,在这种情况下,您可以将该对象作为参数传递。

      当然总会有函数需要接受字符串。

      我想说的是,您不能真正决定项目中的每个函数都只接受字符串作为参数。

      我经常将数组传递给函数,所以你的策略肯定不适合我。

      抱歉,如果我完全错过了理解您的问题。

      【讨论】:

        【解决方案3】:

        如果您有简单的独立函数,字符串参数可能是最好的。您将很难记住任何神奇的数字。

        最好的选择是常量。为每个可能的函数参数定义全局常量可能会变得很麻烦,但它们对于类来说很容易:

        class Foo {
        
            const BAR = 1;
        
            public function baz($arg) {
                switch ($arg) {
                    case self::BAR :
                    ...
                }
            }
        
        }
        
        $foo = new Foo;
        $foo->baz(Foo::BAR);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-28
          • 1970-01-01
          • 2013-05-05
          • 2021-09-20
          • 2013-06-11
          • 2021-02-03
          • 1970-01-01
          相关资源
          最近更新 更多