全球不工作

时间:2011-07-29 10:22:44

标签: php codeigniter

我在PHP中有一个带有大数组的文件和一个搜索数组的函数。

下面是代码:

$details = array(

  array('fieldID'=>'0','fieldCaption'=>'Address 1','fieldType'=>'text','fieldName'=>'addr1','fieldRequired'=>'1'),
  array('fieldID'=>'1','fieldCaption'=>'Address 2','fieldType'=>'text','fieldName'=>'addr2','fieldRequired'=>'1'),
  .
  .
  .
);

if(!function_exists('find_detail'))
{
  function find_detail($fieldName)
  {
    global $details;
    var_dump($details); // NULL

    foreach ($details as $detail)
    {
      if($detail['fieldName'] == $fieldName)
      {
        return $detail['fieldID'];
      }
    }
    return false;
  }
}

这位于一个帮助文件中并调用var_dump($ details);正在返回NULL。我怀疑存在范围问题。

非常感谢

- 编辑 -

这是不好的做法,处理这个问题的最佳方法是(如@Gordon所说)将细节数组传递给函数。 (警告:存在更好的方法,例如使用array_filter)

if(!function_exists('find_detail_by_field_name'))
{
  function find_detail_by_field_name($details, $fieldName)
  {
    foreach ($details as $detail)
    {
      if($detail['fieldName'] == $fieldName)
      {
        return $detail['fieldID'];
      }
    }
    return false;
  }
}

并提供一种获取细节的方法,在函数中包装细节将提供许多好处,如缓存,更改源等。

function get_details() 
{
   static $details = array(...)
   return $details;
}

3 个答案:

答案 0 :(得分:4)

为什么global似乎不起作用的答案是CI的帮助文件包含在函数范围内。换句话说,$details数组不在全局范围内,因此global看不到它。

至于你应该怎么做 - 看看别人的答案。

答案 1 :(得分:1)

如果你的函数在$details数组上运行,它应该在函数签名中询问该数组。其他任何东西只是隐藏依赖项,很难调试和维护(正如您可以看到需要提出问题)。所以把它改成

function find_detail($fieldName, array $details)

然后传递给传入的数组。

此外,由于该函数确实返回了fieldId而不是某些细节,因此您可能希望将其重命名为

function findFieldIdByFieldName($fieldName, array $details)

但是要回答你的问题:你可能会得到这种效果,因为你在全局范围之外创建了$ details数组,这是你脚本的最高范围。如果您在函数或方法中定义了$ details,或者它包含在另一个函数的范围内,则它不在全局范围内。

答案 2 :(得分:0)

此外,您可以考虑使用Config类代替global。这样,您就拥有了一个静态数组变量,只要您需要它,只需使用助手中的CI超级对象$ci =& get_instance();调用CI Config函数。