Числа против строковых литералов для аргументов функций - PullRequest
0 голосов
/ 16 июля 2011

Я не думаю, что этот вопрос задавался ранее (по крайней мере, я не смог найти его, если он ...)

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

<?php
function uberFunc($myArgument){
    switch($myArgument){
         //Stuff
    }
}
?>

И допустим, в этом примере, что $myArgument может быть только определенным количеством ответов (то есть он не создан пользователем). Например, $myArgument может определять порядок упорядочения sql или используемый хеш, или некоторый предопределенный список значений . Затем оператор case превращает $myArgument в какое-то действие (добавление строки mysql или хеширование строки определенным образом).

tl; dr: Аргумент для функции, которая может быть только одним из набора предопределенных значений.

Мой вопрос: для этих типов переменных лучше использовать строковый литерал (который будет декодироваться с помощью оператора switch-case) или числа (которые также будут декодироваться с помощью оператора switch-case)

В настоящее время у меня есть триггер, который начинает создавать неуклюжий код, поэтому я хочу выбрать один (строковые литералы или числа) и придерживаться его

Преимущества (о которых я знаю) в использовании строковых литералов :

  • читаемость
  • Прямая диссертация (т. Е. Если вы передаете переменную, которая определяет, как организовать ваш sql, вы можете сделать что-то вроде "SELECT * FROM main ORDER BY ".$myArgument

Преимущества (о которых я знаю) в использовании номеров :

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

Ответы [ 3 ]

0 голосов
/ 16 июля 2011

На самом деле, единственное, что я на самом деле вижу, что может быть правильным, это «читаемость».

О том, могут ли переменные быть "непосредственно вставлены" в вашу базу данных sql, если у вас есть "SELECT * FROM main ORDER BY ".$myArgument Это будет работать независимо от того, является ли $ myArgument строкой или целым числом. Однако вы должны использовать подготовленные операторы (например, с PDO), которые предотвратят внедрение SQL, а также другие преимущества.

Может манипулировать математикой?

echo "3" + "4"; // Outputs 7

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

Как сказал другой человек, разница в скорости весьма незначительна.

for ($i = 0; $i < 1000000; $i++) {
    $var = "3" + "4"; // takes 0.207326889038 seconds
}

for ($i = 0; $i < 1000000; $i++) {
    $var = 3 + 4; // takes 0.103585958481 seconds
}

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

0 голосов
/ 16 июля 2011

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

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

class Foo {

    const BAR = 1;

    public function baz($arg) {
        switch ($arg) {
            case self::BAR :
            ...
        }
    }

}

$foo = new Foo;
$foo->baz(Foo::BAR);
0 голосов
/ 16 июля 2011

Конечно, это зависит от того, что ваша функция собирается делать.

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

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

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

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

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

Извиняюсь, если я полностью пропустил, понял ваш вопрос.

...