PHP Избегая глобальности в процедурном программировании - PullRequest
2 голосов
/ 11 марта 2019

Я обычно использую процедурное программирование на PHP и смотрю здесь на другие вопросы, спрашивающие, как избежать глобальных изменений, в ответах часто вместо этого использовалось ООП. Разве нельзя избежать глобальных значений при процедурном программировании?

Например, я могу написать следующую функцию двумя способами. Оба имеют свои преимущества и недостатки. Если я часто вызываю эту функцию, то она выглядит раздутой со вторым методом, поскольку она должна каждый раз передавать все переменные. Альтернативой является первый метод, в котором функция просто передает значение, а все переменные являются глобальными переменными в функции.

doWhatIneedtodo(2);

function doWhatIneedtodo($val) {
  global $this; global $that; global $theother;
  if ($val == 1) { 
    $this++;
  } else
  if ($val == 2) { 
    $that++;
  } else
  if ($val == 3) { 
    $theother++;
  }
}

doWhatIneedtodo(2,$this,$that,$theother);

function doWhatIneedtodo($val,&$this,&$that,&$theother) {
  if ($val == 1) { 
    $this++;
  } else
  if ($val == 2) { 
    $that++;
  } else
  if ($val == 3) { 
    $theother++;
  }
}

Или, может быть, есть лучший способ сделать это, чего у меня нет?

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Это очень большой переход от проблемного кода к менее проблемному коду:

  • Чисто процедурный код без использования функций: практически невозможно повторное использование или модульность, быстро приводит к конфликтам имен и спагетти-коду в любой программе приличного размера.
  • Процедурный код с использованием функций : некоторое пространство имен / область видимости для некоторых переменных, хотя в конечном итоге те же проблемы, что и выше, если вы используете глобальные переменные.
  • Процедурный код с функциями и без глобалов , поворот в сторону функционального программирования: нет конфликтов имен, многократное использование, но много раздачи отдельных значений.
  • В других языках именно здесь структуры приходят, чтобы определить структурированные «наборы» значений для передачи между функциями, но поскольку в PHP отсутствуют структуры, вы будете использовать массивы, которые утомительны, потому что они полностью неструктурированы и не имеют типа, и в долгосрочной перспективе становится трудно сохранять их структуру прямой.
  • Итак, объекты вводят изображение, которое предоставляет структуры данных.
  • И в любом случае, когда вы используете объекты, вы также можете пойти на инкапсуляцию и позволить объектным методам действовать на свои собственные данные, скрывая внутреннюю структуру данных и вместо этого выставляя функциональность (методы), так что базовые структуры данных могут быть изменены, и это изменение локализуется в самом классе, а не во всех функциях, которые используют определенную структуру / массив.

Итак, вы видите, что решение проблем с глобальным процедурным кодом один за другим в конечном итоге приводит к ООП, по крайней мере, в PHP. На полпути есть развилка, по которой вы можете перейти и к чисто функциональному программированию, но PHP плохо подготовлен для того, чтобы быть чисто функциональным языком.

0 голосов
/ 11 марта 2019

Причина, по которой вы в основном находите ответы на этот вопрос для ООП, двояка. Я думаю:

  • В наши дни все делают PHP ООП, это действительно того стоит.
  • В ООП глобальныеплохо, как вы хотите, чтобы избежать глобального состояния.Внедрение глобального состояния приводит к тому, что код сложнее тестировать и поддерживать.В процедурном PHP все равно глобально, поэтому гораздо меньше нужно избегать глобалов.

Кроме того, я предпочитаю вашу вторую реализацию, потому что было бы гораздо проще перевести это в правильный ООП-код,Если вы используете первую реализацию и хотите изменить имена переменных, вам придется настроить вызывающий код и саму функцию.

...