За последние 24 часа нас посетили 19255 программистов и 1634 робота. Сейчас ищут 839 программистов ...

Передача нескольких констант через побитовое сравнение

Тема в разделе "Прочие вопросы по PHP", создана пользователем TheShock, 20 июн 2009.

  1. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Тебе какая разница, какое там число? Есть константа E_WARNING, оно и в африке warning. Понятно же. А если какой чудак на букву м поменяет в следующей версии API значения констант, ты будешь свой код переписывать?

    1. У константы должно быть норомальное, осмысленное имя.
    2. Никого, кроме автора данного класса не должно волновать, чему эта константа равна.

    Единственный правильный стиль — хорошее имя константы, остальное не важно.

    Да чего уж мелочится: создай объект с методами опций и передавай в функцию ;-)
     
  2. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    AlexGousev
    естественно, нормальное имя цитаты. Например E_ERROR;
    Вот пишешь ты код функции error_repporing и ставишь в ней константу const E_ERROR = 52464; потому что посчитал, что в нее должны включится 7 других констант. А потом, через полгода, решил одну убрать и этой константы, а другую - добавить (как раз в стиле разрабов пхп). Ты будешь с калькулятором сидеть и отнимать десятичные значения? Или просто посмотреть: "А какие ж константы я включил в эту константу то?". Тут вообще только полным перебором всех остальных констант получится узнать. Вот я предложил удобный стиль констант.
    Или это лишь бы попридираться?
     
  3. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    TheShock
    Нифига не понял. Кто куда должен включаться? Зачем нужна константа, которая будет значить сразу несколько других констант, если просто можно использовать побитовое ИЛИ.
    А насчет чисел, так каждая константа - определенный бит. В десятичном представлении будет 2^n-1.
     
  4. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Про побитовое или я и говорю:

    PHP:
    1. <?php
    2. class ConstantsDec {
    3.     const A =   1;
    4.     const B =   2;
    5.     const C =   4;
    6.     const D =   8;
    7.     const E =  16;
    8.     const F =  32;
    9.     const G =  64;
    10.     const I = 128;
    11.     const K = 256;
    12.     const L = 512;
    13. //      Не работает: Parse error: syntax error, unexpected '|', expecting ',' or ';'
    14. //  const STANDART = self::A | self::D | self::E;
    15.  
    16. //  Если бы не строка выше - какие значения идут по-умолчанию?
    17.     const STANDART = 25;
    18. //  Вот какие значения идут тут? По доброй традиции php включено не все
    19.     const FULL = 955;
    20. }
    21.  
    22.  
    23. class ConstantsOct {
    24.     const A =    01;
    25.     const B =    02;
    26.     const C =    04;
    27.     const D =   010;
    28.     const E =   020;
    29.     const F =   040;
    30.     const G =  0100;
    31.     const I =  0200;
    32.     const K =  0400;
    33.     const L = 01000;
    34.  
    35. // Тут полегче сказать, правда?
    36.     const STANDART = 031;
    37.     const FULL = 01673;
    38. }
    39. ?>
    Про понятные имена констант я знаю. В error_reporting - понятные имена? Можете подставить сюда имена и значения из еррор_репортинг.


    Есть три константы - 16, 17, 18. Их значения:
    65536, 131072, 262144 или 0200000, 0400000, 01000000
    Вы решили добавить еще три константы. В какой системе счисления легче добавить еще три значения?
    Потом вы решили сделать константу, которая является суммой констант 1024, 4096, 65536 и 262144, или 02000, 010000, 0200000, 01000000. Какие четыре числа легче просуммировать? Или у вас есть константа 197152, или 0601040. В какой системе счисления понятней из каких констант она состоит?
     
  5. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    TheShock, много шума из ничего.
    На начальном этапе для побитового сравнения Вы добавите 10 констант и парочку составных констант (те константы, значения которых зависят от других).

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

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    iliavlad, если это пустая трата времени, то зачем ты тратил свое время и писал свой пост ?
     
  7. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    так, поболтать перед работой захотелось.
     
  8. kostyl

    kostyl Guest

    iliavlad
    Да все нормлаьно, восьмиричная намного удобней. TheShock - Хороший пост, так держать.
     
  9. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    define('E_MY_ERROR_LEVEL', E_ERROR | E_WARNING | E_STRICT);
    не?
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    AlexGousev, с константой в классе такое не проделать.
     
  11. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    AlexGousev
    классы с параметрами, это у нас Сергей любит =)
    я за массивы
     
  12. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Упаковывать константы в класс для "пространства имент" - это маразм.
     
  13. kostyl

    kostyl Guest

    Это не единственное достоинство их использованияhttps://php.ru/manual/language.oop5.constants.html(смотреть примеры)
     
  14. Упаковывать константы в класс ТОЛЬКО для пространства имен, это маразм, да.
     
  15. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Ну как я понял речь идёт не о таком случае, а когда константы являются неотъемлемой частью полноценного класса.
     
  16. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А в полноценном классе получение каких-то сложных опций выносится в отельный метод. Где уже рожаете логические объединения одиночных констант.
     
  17. PHP:
    1. <?php
    2. define('E_ERROR',1);
    3. define('E_WARNING',1<<1);
    4. define('E_PARSE',1<<2);
    5. define('E_NOTICE',1<<3);
    6. define('E_CORE_ERROR',1<<4);
    7. define('E_CORE_WARNING',1<<5);
    8. define('E_COMPILE_ERROR',1<<6);
    9. define('E_COMPILE_WARNING',1<<7);
    10. define('E_USER_ERROR',1<<8);
    11. define('E_USER_WARNING',1<<9);
    12. define('E_USER_NOTICE',1<<10);
    13. define('E_STRICT',1<<11);
    14. define('E_RECOVERABLE_ERROR',1<<12);
    15. define('E_DEPRECATED',1<<13);
    16. define('E_USER_DEPRECATED',1<<14);
    17. define('E_ALL',1<<15);
    18. ?>
    Внезапно, еще вариант :)
     
  18. kostyl

    kostyl Guest

    флоппик
    ????
     
  19. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    флоппик, круто. 2 вопроса:
    1. Работает ли в классе?
    2. Как сделать соединенную константу? Т.е. E_ALL == E_ERROR | E_WARNING | E_STRICT
     
  20. define('E_ALL', E_ERROR | E_WARNING | E_STRICT); =)

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

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    флоппик, а в классе как?