用精确变量调用php函数

时间:2011-09-19 20:42:35

标签: php mysql function

让我们说我们的函数有5个变量。

function func($var1, $var2, $var3, $var4, $var5 ) 
{
  if ($var1==1)
  {
    work with $var2, $var3
  }
  if ($var1==2)
  {
    work with $var4, $var5
  }
}

例如,我们想要调用此函数:func(1,$var2, $var3)(没有未使用的变量)或类似func(2,$var4, $var5)

有可能吗?如何将精确变量发送到php函数?

更新 根据@ marcus的回答,我修改了我的功能。

<?

function GenerateTopNav($current, $lang, $db)
{
    $result=$db->query("SELECT `id`, `parent`, $lang FROM `nav` WHERE `menu`='1'");
        while ($row=$result->fetch_object()){
            echo '<a ';
            if($row->id==$current)
            echo 'class="active"';
            echo 'href="index.php?id='.$row->id.'">'.$row->$lang.'</a> | ';
    }

function GenerateLeftNav($parent, $level, $lang, $db){  
         $q = $db->query("SELECT `id`, `$lang` AS name FROM nav WHERE parent = '$parent' AND `menu`='2'");
          if($level > 0 && $q->num_rows > 0){
          echo "\n<ul>\n";
          }
          while($row=$q->fetch_object()){
                echo "<li>";
                echo '<a href="?page=' . $row->id . '">' . $row->name . '</a>';
                //display this level's children
                GenerateLeftNav($row->id, $level+1, $lang, $db);
                echo "</li>\n\n";
            }
          if($level > 0 &&  $q->num_rows > 0){
                echo "</ul>\n";
            }
          }
}
?>

4 个答案:

答案 0 :(得分:3)

您不应该尝试将这些东西打包成一个功能。每个功能都应该只有一个目的和一个目的。如果这两个任务非常相似,你可以这样做,但这里没有给出。

您可以而且应该做的是将代码分解为接管类似位的较小函数。例如,您可以使用名为createLinkMarkup()的函数,该函数将返回一个链接元素的HTML标记。然后你可以从'母亲' - 函数调用这个函数。

更为重要是你做错的一些事情:

变量和函数命名

  • 不要调用函数'func',这是你能做的最糟糕的事情,没有人会知道这些函数是做什么的
  • 使用'动词'作为函数名称,所以不要再称它们为菜单,更好:createMenuMarkup()
  • 不要在函数名中使用数字,它也使代码不可读。您的第二个函数可以称为createSubmenuMarkup()。这些名字是可读的。几个星期之后你必须再次阅读你的代码并且对于任何看到你的代码的其他编码人员都有好处......就像我们一样。
  • 以同样的方式,不要调用变量$var。对于可读性而言,这是最糟糕的事情(可读性=代码质量)。使用描述容器的名称,使用名词来描述你正在传递的内容。 @animuson说的不是真的,你需要正确命名你的变量。是的,您的代码将使用模糊名称,但它不可读=可维护=值得生存。

全局变量的用法

  • 不要让db连接成为全局变量,事实上,不要使用全局变量,这是一个非常好的经验法则。如果您需要重命名变量,是否要在代码中的100个不同位置重命名该怎么办? Globals违背了封装的最佳实践。更好的方法:将连接传递给函数,使连接可用于类并将其注入此类,或类似于全局,但更容易管理,将连接存储在注册表中(注册表模式)。

来自职能部门内的回声

  • 不要在函数中使用echo。相反,将每个标记存储在一个字符串中,然后返回标记。通过这种方式,您可以随时控制最终渲染的内容,因为您可以在函数运行后对其进行操作。

SQL注入

  • 注意SQL注入。您将参数$lang传递给您的查询,它来自哪里,可能来自查询字符串?如果它可以被用户操纵,那么你就处于危险之中。使用预备语句或至少mysql_real_escape_string来防止这种情况发生。

答案 1 :(得分:0)

您可以使用数组:

function func($var1, $array ) 
{
  if ($var1==1)
  {
    work with $array["var2"], $array["var3"]
  }
  if ($var1==2)
  {
    work with $array["var4"], $array["var5"]
  }
}

并将其称为:

func(1, array(
  "var2" => "foo",
  "var3" => "bar"
));

答案 2 :(得分:0)

对于可选参数,您可以为它们设置默认值:

func($val1,$val2,$val3 = 0,$val4 = 0)

你无需打电话给他们。

func($val1,$val2)

答案 3 :(得分:0)

为什么你甚至需要指定4个变量?您基本上是说为该类型指定一个类型然后输入2个变量,所以如果总有3个变量,那么只需执行以下操作:

function ($type, $var1, $var2) {
    if ($type === 1) {
        // $var1 = lang and $var2 = current
        // do something with var1 and var2
    } else {
        // $var1 = parent and $var2 = level
        // do something else with var1 and var2
    }
}

你真的不需要使用过多的不会被使用的变量来垃圾邮件。

要更清楚:变量不需要需要,你只需要评论如果type = 1,这两个变量意味着这两件事,如果type = 2 ,这两个变量意味着这两个因素并相应地处理这两种类型。