Это не должно быть проблемой. Пока вы разбираетесь в объектно-ориентированном программировании, у вас все в порядке.
Идея не так уж и плоха, поскольку в PHP отсутствует функция «аргументы ключевого слова», которая присутствует во многих других современных языках программирования (Python, Ruby и т. Д.). Однако с этим определенно есть несколько проблем: и использовать глобальные переменные для всего? (шутка)
Передача ассоциативного массива имеет одно полезное преимущество: вы можете сделать несколько параметров функции необязательными, и вы можете передать значение для N -го параметра без необходимости передавать значение для * N -1 * th параметр.
Но у вас нет возможности сделать обязательные параметры с ошибкой времени компиляции, если вы их не передадите. Вы также не можете объявить проверку типов.
Вам нужно будет написать код внутри вызываемой функции для проверки наличия и типа требуемых параметров.
Я использовал альтернативу, чтобы объявить обычные параметры для тех, которые являются обязательными, а затем в качестве последнего (необязательного) аргумента объявите ассоциативный массив с именем $ options
, который содержит только необязательные элементы.
function database_connect($dbname, $user, $password, array $options = array())
В некоторых случаях я чувствую, что это имеет смысл, но часто вы можете упростить ситуацию, создав несколько методов с немного разным поведением. Имя метода затем прояснит, для чего он нужен.
В общем, если ваши функции имеют> 3 аргумента, он все равно станет нечитаемым.
В качестве альтернативы, и часто используемый шаблон делает единственный аргумент вашего функция (классифицированный) объект. «Класс параметров» будет определять, что именно поддерживается.
Самым большим запахом кода здесь является то, что добавление другой переменной приведет к каскадному выполнению 4-5 различных функций. Я не могу придумать причину, по которой это должно было произойти.
Похоже, вам нужно преобразовать этот код в класс, чтобы затем вы могли один раз передать значения в конструктор и сохранить их как переменные-члены .
Перечисление каждого параметра может улучшить читаемость кода. Передача единственного ассоциативного массива не обязательно объясняет, какие данные передаются функции.
предположительно одним из недостатков является то, что вы получите слишком много параметров. Это приводит к проблеме, заключающейся в том, что код, вероятно, потеряет читаемость.
При строгом объектно-ориентированном подходе вы должны преобразовать все эти параметры, которые "проходят" через несколько вызовов функций, в переменные экземпляра классов, содержащих методы.
Вы никогда не должны передавать параметры функциям, которые на самом деле им не требуются.
Обратной стороной является то, что любой, кто смотрит на ваш код (кроме вас), не поймет, какие параметры поступают в метод, откуда они пришли и для чего они нужны. Они также не знали бы, как вызвать метод, поскольку без просмотра кода неясно, что именно требуется внутри этого «массива параметров».
Это значительно упрощает создание документации, если у вас есть параметры, названные и переданные отдельно. Вы можете подумать, что использование массива упрощает добавление нового кода, но его преимущества не влияют на удобочитаемость. Плюс отойди от кода на 2 месяца и вернись ... выясняя, в каком порядке добавлять параметры в массив, когда ситуации станут большой головной болью.
Возможно, ваш экземпляр SQL не настроен для приема входящих TCP-соединений, вы можете проверить это в Пуск -> SQL Server 2008 -> Инструменты насыщения -> Диспетчер конфигурации SQL Server. В левой части этого инструмента вы увидите конфигурацию сети, разверните ее, чтобы увидеть, какие протоколы включены.
Явное указание переменных и предоставление небольшой документации в док-блоке с использованием @param очень помогает. Необходимость добавления аргумента в двух местах - это незначительные затраты по сравнению с выходом аргументов для удобочитаемости. Выберите символ класса в его заголовочном файле - то есть бит сразу после @interface
. Затем следует включить рефакторинг.
Если вы измените параметры, которые принимает функция, то, вероятно, вам все равно придется изменить какой-то код, в котором она вызывается, чтобы соответствовать новым параметрам.
Если вы широко используете эти массивы, и во многих вызовах функций принимаете массив и просто «передаете его», это может быть признаком того, что вам следует подумать о превращении некоторых из этих параметров в структурированный класс.
Если вы ' Если вы используете эти массивы как изменяемую структуру данных, вы не обязательно знаете, что массив, который у вас есть после вызова функции, совпадает с тем, который вы передали. Это, вероятно, вернется, чтобы получить вас в какой-то момент.