Глобальный не работает - PullRequest
1 голос
/ 29 июля 2011

У меня есть файл на 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.Я подозреваю, что проблема со сферой охвата.

Большое спасибо

- edit -

Это плохая практика, и лучшим подходом к ее решению будет (как сказал @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 ]

4 голосов
/ 29 июля 2011

Ответ о том, почему global не работает, заключается в том, что вспомогательные файлы CI включены в область действия функции.Другими словами, массив $details не находится в глобальной области видимости, поэтому global не видит его.

Что касается того, как вы должны это сделать, см. Ответы других.

1 голос
/ 29 июля 2011

Если ваша функция работает с этим массивом $details, она должна запросить этот массив в сигнатуре функции. Все остальное - это просто скрытие зависимостей, и его сложно отлаживать и поддерживать (как вы можете видеть по необходимости задать свой вопрос). Так что измени его на

function find_detail($fieldName, array $details)

и foreach для переданного массива.

Кроме того, поскольку функция действительно возвращает fieldId, а не какую-либо деталь, вы можете переименовать его в

function findFieldIdByFieldName($fieldName, array $details)

Но чтобы ответить на ваш вопрос: вы, вероятно, получите этот эффект, потому что вы создали массив $ details за пределами глобальной области видимости, самой верхней области действия вашего сценария. Если вы определили $ details в функции или методе или если он включен в область действия другой функции, он не входит в глобальную область.

0 голосов
/ 29 июля 2011

Кроме того, вы можете рассмотреть возможность использования класса Config * global.Таким образом, у вас есть переменная статического массива, и когда вам это нужно, просто вызовите функцию CI Config, используя суперобъект CI $ci =& get_instance(); в вашем помощнике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...