Используя ассоциативный массив как php вход функции

Это не должно быть проблемой. Пока вы разбираетесь в объектно-ориентированном программировании, у вас все в порядке.

12
задан thekevinscott 15 June 2009 в 17:36
поделиться

9 ответов

Идея не так уж и плоха, поскольку в PHP отсутствует функция «аргументы ключевого слова», которая присутствует во многих других современных языках программирования (Python, Ruby и т. Д.). Однако с этим определенно есть несколько проблем: и использовать глобальные переменные для всего? (шутка)

Передача ассоциативного массива имеет одно полезное преимущество: вы можете сделать несколько параметров функции необязательными, и вы можете передать значение для N -го параметра без необходимости передавать значение для * N -1 * th параметр.

Но у вас нет возможности сделать обязательные параметры с ошибкой времени компиляции, если вы их не передадите. Вы также не можете объявить проверку типов.

Вам нужно будет написать код внутри вызываемой функции для проверки наличия и типа требуемых параметров.

Я использовал альтернативу, чтобы объявить обычные параметры для тех, которые являются обязательными, а затем в качестве последнего (необязательного) аргумента объявите ассоциативный массив с именем $ options , который содержит только необязательные элементы.

function database_connect($dbname, $user, $password, array $options = array())
12
ответ дан 2 December 2019 в 05:28
поделиться

В некоторых случаях я чувствую, что это имеет смысл, но часто вы можете упростить ситуацию, создав несколько методов с немного разным поведением. Имя метода затем прояснит, для чего он нужен.

В общем, если ваши функции имеют> 3 аргумента, он все равно станет нечитаемым.

В качестве альтернативы, и часто используемый шаблон делает единственный аргумент вашего функция (классифицированный) объект. «Класс параметров» будет определять, что именно поддерживается.

0
ответ дан 2 December 2019 в 05:28
поделиться

Самым большим запахом кода здесь является то, что добавление другой переменной приведет к каскадному выполнению 4-5 различных функций. Я не могу придумать причину, по которой это должно было произойти.

Похоже, вам нужно преобразовать этот код в класс, чтобы затем вы могли один раз передать значения в конструктор и сохранить их как переменные-члены .

0
ответ дан 2 December 2019 в 05:28
поделиться

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

1
ответ дан 2 December 2019 в 05:28
поделиться

предположительно одним из недостатков является то, что вы получите слишком много параметров. Это приводит к проблеме, заключающейся в том, что код, вероятно, потеряет читаемость.

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

Вы никогда не должны передавать параметры функциям, которые на самом деле им не требуются.

2
ответ дан 2 December 2019 в 05:28
поделиться

Обратной стороной является то, что любой, кто смотрит на ваш код (кроме вас), не поймет, какие параметры поступают в метод, откуда они пришли и для чего они нужны. Они также не знали бы, как вызвать метод, поскольку без просмотра кода неясно, что именно требуется внутри этого «массива параметров».

9
ответ дан 2 December 2019 в 05:28
поделиться

Это значительно упрощает создание документации, если у вас есть параметры, названные и переданные отдельно. Вы можете подумать, что использование массива упрощает добавление нового кода, но его преимущества не влияют на удобочитаемость. Плюс отойди от кода на 2 месяца и вернись ... выясняя, в каком порядке добавлять параметры в массив, когда ситуации станут большой головной болью.

0
ответ дан 2 December 2019 в 05:28
поделиться

Возможно, ваш экземпляр SQL не настроен для приема входящих TCP-соединений, вы можете проверить это в Пуск -> SQL Server 2008 -> Инструменты насыщения -> Диспетчер конфигурации SQL Server. В левой части этого инструмента вы увидите конфигурацию сети, разверните ее, чтобы увидеть, какие протоколы включены.

Явное указание переменных и предоставление небольшой документации в док-блоке с использованием @param очень помогает. Необходимость добавления аргумента в двух местах - это незначительные затраты по сравнению с выходом аргументов для удобочитаемости.

1
ответ дан 2 December 2019 в 05:28
поделиться

Выберите символ класса в его заголовочном файле - то есть бит сразу после @interface . Затем следует включить рефакторинг.

функция, присутствующая во многих других современных языках программирования (Python, Ruby и т. д.). Однако с этим определенно есть несколько проблем:

  1. Если вы измените параметры, которые принимает функция, то, вероятно, вам все равно придется изменить какой-то код, в котором она вызывается, чтобы соответствовать новым параметрам.

  2. Если вы широко используете эти массивы, и во многих вызовах функций принимаете массив и просто «передаете его», это может быть признаком того, что вам следует подумать о превращении некоторых из этих параметров в структурированный класс.

  3. Если вы ' Если вы используете эти массивы как изменяемую структуру данных, вы не обязательно знаете, что массив, который у вас есть после вызова функции, совпадает с тем, который вы передали. Это, вероятно, вернется, чтобы получить вас в какой-то момент.

2
ответ дан 2 December 2019 в 05:28
поделиться