Доступ к глобальной переменной внутри вложенных функций - PullRequest
1 голос
/ 14 мая 2011

Вот мой сценарий:

$foo = bar;

one()
{
   two()
   {
      three()
      {
         // need access to $foo here
      }
   }
}

Я знаю, что мог бы передать $ foo во все три функции, но это не совсем идеально, потому что вы можете или не можете требовать этого, кроме того, уже есть другие параметры, и я не хочу добавлять в этот список если я могу предотвратить это. Только когда вы доберетесь до three() вам нужно $foo. Я знаю, что мог бы также указать global $foo; в three(), но я читал, что это не очень хорошая практика.

Есть ли другой способ $foo сделать доступным для three(), не делая ни одного из них?

Чтобы предоставить немного больше информации, в этом случае $ foo - это информация о том, как подключиться к базе данных, например, сервер, пользователь, пароль, но только в three() эта информация действительно нужна. Конечно, я мог бы подключиться к базе данных прямо при загрузке документа, но это не нужно, если документ может не понадобиться.

Есть идеи?

ОБНОВЛЕНИЕ : Извините, я не хотел иметь «функцию» в начале каждой функции, подразумевая, что я создал их вложенным способом.

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

Да, вы можете использовать global или передать его в качестве параметра. И то и другое честно. Тем не менее, я бы сделал последнее. Или вы также можете использовать замыкания и ключевое слово use:

$foo = 'bar';

$one = function() use($foo) {
   $two = function() use($foo) {
      $three = function () use($foo) {
         // access to $foo here
      };
   };
};

Также может быть use(&$foo), если вам нужно изменить значение top $foo внутри $three()

1 голос
/ 14 мая 2011

Использование global не является плохой практикой, если используется правильно.В этом случае вы будете использовать global, и все будет в порядке.

Поскольку global дает функциям доступ к глобальным переменным, существует риск повреждения данных.Просто будьте осторожны, и вы будете знать, что делаете (то есть не случайно измените данные, которые вы не хотите, чтобы они меняли. Это иногда вызывает некоторые неприятные ошибки, которые трудно отследить.)

Подводя итог: global в этом случае прекрасно.

Что действительно плохо, так это вложенные функции, по крайней мере, в PHP.

0 голосов
/ 14 мая 2011

Не слушайте никого, кто говорит о global.
Читайте книги об ООП (например, этот ), читайте о Внедрении Зависимостей, Фабричных шаблонах.
Внедрение Зависимостейэто лучший способ создания гибкого и простого в обслуживании кода, и, согласно философии DI, вы передадите $ foo от первой до третьей функции в аргументах или передадите объект Context со всеми необходимыми переменными (если вы хотите минимизировать количество аргументов).
Подробнее о DI вы можете прочитать здесь: http://components.symfony -project.org / зависимость-инъекция / ствол / книга / 00-введение

...