Даже если вы разрабатываете новую крупномасштабную программу PHP, вы неизбежно будете использовать глобальные данные, поскольку некоторые данные будут использоваться в разных частях вашего кода. Некоторые общие глобальные данные включают в себя: классы настроек программы, классы подключения к базе данных, информацию о пользователе и т. д. Существует много способов сделать эти данные глобальными, наиболее часто используемый из них — использование объявления ключевого слова «global», которое мы подробно объясним позже в этой статье.
Единственный недостаток использования ключевого слова «global» для объявления глобальных данных заключается в том, что на самом деле это очень плохой способ программирования и часто приводит к более серьезным проблемам в дальнейшем в программе, поскольку глобальные данные разделяют ваш код. Все сегменты кода связаны. вместе, поэтому если вы измените одну часть кода, это может привести к сбоям в других частях. Поэтому, если в вашем коде много глобальных переменных, всю вашу программу будет сложно поддерживать.
В этой статье будет показано, как предотвратить эту проблему глобальных переменных с помощью различных методов и шаблонов проектирования. Конечно, сначала давайте посмотрим, как использовать ключевое слово «global» для глобальных данных и как оно работает. Используя глобальные переменные и ключевое слово «global»,
PHP по умолчанию определяет некоторые «суперглобальные» переменные. Эти переменные автоматически глобализуются и могут вызываться в любом месте программы, например, $_GET и $_REQUEST и т. д. Обычно они берутся из данных или других внешних данных, и использование этих переменных обычно не вызывает проблем, поскольку они практически не доступны для записи.
Но вы можете использовать свои собственные глобальные переменные. Используя ключевое слово «global», вы можете импортировать глобальные данные в локальную область действия функции. Если вы не понимаете «область использования переменной», обратитесь к соответствующим инструкциям в руководстве по PHP.
Ниже приведен демонстрационный пример использования ключевого слова «global»:
Ниже приводится содержание в кавычках:
<?php
$my_var = 'Привет, мир';
test_global();
функция test_global() {
// Теперь в локальной области видимости
// переменная $my_var не существует
// Выдает ошибку: «Неопределенная переменная: my_var»
эхо $my_var;
// Теперь давайте изменим значение переменной
глобальный $my_var;
// Работает:
эхо $my_var;
}
?>
Как вы можете видеть в приведенном выше примере, ключевое слово «global» используется для импорта глобальных переменных. Похоже, что это работает хорошо и просто, так почему же нам беспокоиться об использовании ключевого слова «global» для определения глобальных данных?
Вот три веские причины:
1. Повторное использование кода практически невозможно.
Если функция зависит от глобальных переменных, практически невозможно использовать эту функцию в разных средах. Другая проблема заключается в том, что вы не можете извлечь эту функцию и использовать ее в другом коде.
2. Отладка и решение проблем очень сложны.
Отслеживать глобальную переменную гораздо сложнее, чем отслеживать неглобальную переменную. Глобальная переменная может быть переопределена в каком-то малоизвестном включаемом файле, и даже если у вас есть очень хороший программный редактор (или IDE), вам может потребоваться несколько часов, чтобы обнаружить проблему.
3. Разобраться в этих кодах будет очень сложно.
Вам сложно разобраться, откуда берется глобальная переменная и для чего она используется. В процессе разработки вы можете знать каждую глобальную переменную, но примерно через год вы можете забыть хотя бы некоторые из них. На этот раз вы пожалеете, что использовали так много глобальных переменных.
Итак, если мы не используем глобальные переменные, что мы используем? Давайте рассмотрим некоторые решения ниже.
Использование параметров функции
Один из способов отказаться от использования глобальных переменных — просто передать переменную в качестве параметра функции, как показано ниже:
Содержимое кавычки следующее:
<?php
$var = 'Привет, мир';
тест ($var);
функциональный тест($var) {
эхо $вар;
}
?>
Если вам нужно передать только глобальную переменную, то это очень хорошее или даже выдающееся решение, но что, если вы хотите передать много значений?
Например, предположим, что мы хотим использовать класс базы данных, класс настроек программы и класс пользователя. В нашем коде эти три класса используются во всех компонентах, поэтому их необходимо передать каждому компоненту. Если мы используем метод параметра функции, нам нужно сделать следующее:
Содержание в кавычках:
<?php
$db = новый DBConnection;
$settings = новый Settings_XML;
$user = новый пользователь;
тест ($db, $settings, $user);
function test(&$db, &$settings, &$user) {
// Делаем что-нибудь
}
?>
Очевидно, что это того не стоит, и как только у нас появятся новые объекты для добавления, нам придется добавить к каждой функции еще один параметр функции. Поэтому нам нужно использовать другой способ решения этой проблемы.