【问题标题】:Use of variable '$name' in a function在函数中使用变量“$name”
【发布时间】:2011-06-13 14:35:11
【问题描述】:

我喜欢认为我对 php 非常了解,但这让我感到困惑。

保持基本我有:

function req_new($pname, $use=null, $depID=null, $manID=null, $manName=null, $suppID=null, $suppName=null, $cat=null, $brand=null, $name, $email, $custom_code, $user=null, $method=null)
{
    //validation
    if($pname == ''){return false;}

    if($manID==null AND $manName==null){return false;}

    foreach(func_get_args() as $arg)
    {
        $arg = fquery_sanitize($arg);
    }

    //submit new request
    $sql = "insert into sds_product_requests ".
           "(prodName, produse, depID, reqDate, manID, manName, suppID, suppName, prodCat, prodBrand, Name, Email, InternalC, `user`, method) ".
           "VALUES ".
           "('$pname','$use','$depID', NOW(),'$manID', '$manName', '$suppID', '$suppName', '$cat', '$brand', '$name', '$email', '$custom_code', '$user', $method)";
    $result = fquery_db($sql);
    if($result>1)
    {return true;}
    else
    {return false;}
}

如果代码使用变量名$name,则不起作用。改用另一个变量名,如$pname,它可以工作。如果我使用变量名$name,则返回false。

关于为什么会发生这种情况的任何想法?

调用函数

    <?php

     $name = getPOST('name');
     $depID = getPOST('depID');
     $cat = getPOST('cat');
     $supp = getPOST('supp');
     $suppID = getPOST('suppID');
     $man = getPOST('man');
     $manID = getPOST('manID');
    $confirm = req_new('THIS IS A NAME', null, $depID, $manID, $man, $suppID, $supp, $cat, null, null, null, null, fauth_GetUserID(), 1);
?>

【问题讨论】:

  • 您能否提供更多的代码,或者整个函数的代码?另外,你忘记return false 中的分号了吗?
  • @Luzhin:+1,听起来好像是名称冲突导致了问题。
  • PHP现在有变参函数了吗?!
  • @Tomalak Geret'kal,多年来我一直在 PHP 中使用可变参数函数(从版本 4 开始)。请参阅func_num_args()func_get_arg()func_get_args(),以及“Default argument values”。如果说, $bla....部分,很明显它只是一个伪代码
  • 在原始版本中,您将$name 作为第一个参数,并将其与'' 进行了比较。在编辑版本中,您将 $name 作为 n-th 参数,但与 $pname 进行比较,这是第一个参数。在意识形态上,情况并非如此。

标签: php variable-names


【解决方案1】:

来自问题下方的 cmets - 有两个参数名为 $name,第二个参数设置为 NULL

function req_new(
    $pname, /* first $name, wich started to work after renaming to $pname */
    $use=null, $depID=null, $manID=null, $manName=null, $suppID=null,
    $suppName=null, $cat=null, $brand=null,
    $name, /* second $name, which was set to NULL and overrode first argument */
    $email, $custom_code, $user=null, $method=null)
{
    // ...
}

【讨论】:

    【解决方案2】:

    我无法重现 OP 的现象,至少不能在 OP 发布的代码范围内。

    <?php
    
    function bla($name, $whatever, $bla)
    {
        if ($name == '') { return false; }
        return true;
    }
    
    $name = "ORLY?";
    echo bla($name, null, null) . "\n"; // prints 1, as expected
    
    ?>
    

    【讨论】:

    • 这展示了 OP 如何未能提供正确的测试用例,而不是解决他的问题。仍然 +1。
    【解决方案3】:

    $name不是特殊的变量名,php只有reserves names__开头(还有一些继承的预定义变量)。我找不到以不同方式处理 $name 的单个程序。你能提供一个完整的例子吗?

    请注意,return false 之后缺少分号。打开error debugging 可以查看这些错误。

    【讨论】:

      【解决方案4】:

      你是如何调用代码的?由于您正在进行常规相等性测试 (==),请记住 PHP 会为您自动转换值,并且有很多值等于空字符串。

      例如

      bla(0, ...);
      

      仍然会触发返回,因为在 PHP 中 0 在相等性测试中等同于 ''。 (0 == '' 为真)。使用严格相等测试来强制检查值和类型:

      if ($blah === '') {
          return false;
      }
      

      这将按预期工作,因为在 0 == '' 时,严格检查不可见地附加了 int == string 检查,其评估结果为 FALSE。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 2023-03-29
        • 2019-08-22
        • 2019-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多