1. PHP / Говнокод #11900

    +48

    1. 1
    2. 2
    3. 3
    PHP supports eight primitive types - four scalar types, two compound types and finally three special types.
    
    8 == 4+2+3?

    http://www.php.net/manual/en/language.types.intro.php

    Запостил: defecate-plusplus, 09 Октября 2012

    Комментарии (34) RSS

    • Ну допустим в primitive не входит compound. Тогда 3+4=7.
      Может быть array примитивный тип, а вот object - нет. Но всё-равно тупо.

      Короче какой язык, такая и документация.
      Ответить
    • PHP уже умеем, считать еще не умеем.

      Объекты однозначно не примитивы, поэтому без них получается 8. Но лично я бы не стал относить ресурсы к примитивам.

      Вероятно, принцип разделения - by-val/by-ref. Объекты по ссылке передаются (PHP 5.3):
      $ php -r "\$a = new StdClass; \$a->a = 1; function f(\$s) { \$s->a = 2; } f(\$a); var_dump(\$a->a);"
      int(2)


      Но тогда что же получается - ресурсы по значению передаются?
      Ответить
      • за это я не люблю всякие пыхи и жавы. В них надо ебать мозг by-value/by-reference и обращать внимание на всякие iclonable. Вот в плюсах с этим проблем нет - всегда знаешь что передаешь
        Ответить
        • ещё еблю с equals забыл написать
          Ответить
          • >ебать
            >еблю
            Ясно.
            Ответить
          • The one does not simply equals two objects.
            На самом деле сравнить в жабе 2 произвольных объекта - дико сложное занятие
            Ответить
            • > На самом деле сравнить в жабе 2 произвольных объекта - дико сложное занятие
              Как и в жизни сравнивать ежа со слоном.
              Ответить
              • Ну вот например, есть два массива в одном инты знаковые, в другом чары юникодные.
                int[] a={1,2,3};
                int[] b={1,2,3};
                Человек обжегшийся на == и уже знающий про equals сочтет логичным написать:
                a.equals(b)
                Ответить
        • > Вот в плюсах с этим проблем нет - всегда знаешь что передаешь
          Зато из-за перегрузки операторов и имплисит преобразований и конструкторов не всегда знаешь куда передаешь ;)
          Ответить
        • >и обращать внимание на всякие iclonable
          Что ты имеешь ввиду?
          Ответить
          • Как-будто бы в крестах не нужно обращать внимание на всякую iхрень
            Ответить
        • > надо ебать мозг by-value/by-reference
          не надо

          > и обращать внимание на всякие iclonable
          не надо

          > в плюсах с этим проблем нет - всегда знаешь что передаешь
          нет
          Ответить
        • > не люблю всякие пыхи и жавы
          Толи дело хацкель - никаких проблем с by-value/by-reference.

          P.S. В жабе то как раз всё очень просто: все объекты - по ссылкам, все примитивы (т.е. числа) - по значению.
          Ответить
          • > никаких проблем с by-value/by-reference
            Пока в дело не вступают всякие там IORef'ы с MVar'ами.
            Ответить
            • мда, XVar'ов там почти как умных указателей в cpp
              Правда, они в основном нужны в многопоточном коде
              Ответить
        • >за это я не люблю всякие пыхи и жавы. В них надо ебать мозг by-value/by-reference
          В жабе проще чем где-либо - всё передается по value. Даже примитивы, даже ссылки, даже Аллах. Проблема в другом - запомнить и принять, что обертки простых типов иммутабельны. Из-за автобоксинга это может смущать.
          >iclonable.
          Clonable - говно, ибо так сказал Doug Lea. А Жжош Блох его поддержал.

          >все объекты - по ссылкам
          Роман, не надо тут путать.
          Всё по значению. Просто ссылка на объект передается тоже по значению.
          А это кстати любимый вопрос многих на собеседованиях.
          Ответить
          • Ну, в жабе это называют reference и даже в книжках пишут так, как я написал. Это скорее касается семантики.
            Но мы-то знаем, что это тупо указатели, и на самом деле (tm) всё передаётся по значению.

            > Clonable - говно
            ещё какое
            Ответить
            • http://www.artima.com/intv/bloch13.html
              Doug Lea goes even further. He told me that he doesn't use clone anymore except to copy arrays. You should use clone to copy arrays, because that's generally the fastest way to do it. But Doug's types simply don't implement Cloneable anymore. He's given up on it. And I think that's not unreasonable.

              It's a shame that Cloneable is broken, but it happens. The original Java APIs were done very quickly under a tight deadline to meet a closing market window. The original Java team did an incredible job, but not all of the APIs are perfect. Cloneable is a weak spot, and I think people should be aware of its limitations.


              А все почему? У них видите ли дедлайн был - а люди годами мучаются.
              Ответить
          • > Всё по значению. Просто ссылка на объект передается тоже по значению.

            Нелепая придирка к словам.
            Если бы не собеседовании мне сказали, что я ответил неверное про "объекты по ссылкам" и что на самом деле "Всё по значению. Просто ссылка на объект передается тоже по значению", то я бы, конечно, не стал бы никого посылать нахуй, на всякий случай, но подумал бы, что собеседующий - тупой мудак, который воспринимает только строго те формулировки, которые написаны в книгах, и срезает семантически эквивалентные, но с другими словами. Знаете, бывают такие.
            Ответить
            • >то я бы, конечно, не стал бы никого посылать нахуй
              Хе-хе-хе.
              >что собеседующий - тупой мудак
              А ты как думал. Но дело не придирках, а в том, что так проще запомнить - всё по значению.
              Ответить
              • > а в том, что так проще запомнить - всё по значению
                Ага, если это бездумно запомнить, то будет так:
                Test a = new Test();
                a.x = 2;
                Test b = a; // ява проста, в ней все передается по значению :3
                a.x = 5;
                System.out.println(b.x); // че за нах, почему 5, по значению же ;(
                Ответить
                • Test a = new Test();//Test - тип не примитивный, значит ссылочный.
                  Test b = a; //Следует понимать, что я присваиваю значение ссылки a, ссылке b.
                  a.x = 5; //а тут я меняю x по ссылке a.
                  Ответить
                • А ещё меня ПИЗДЕЦ БЕСИТ БЕСИТ БЕСИТ необходимость как макака каждый раз руками набирать const SomeType &t!!!!
                  Потому что я каждый раз по адовой привычке пишу просто SomyType t, потом я спохватываюсь, вставляю этот const, и да ладно, хрен с ним, но меня бесит то, что мне надо втыкать знаки в текст в не одно место, а в два, и во второе место, точно прицелившись стрелочками курсора, я должен точно попасть и двумя руками (потому что одной не получается) колченогим движением набрать этот символ &, который не приспособлен для частого и удобного набора. Лучше бы они constref ввели, и то меньше гемора было бы, хотя бы один раз скопировал это слово в буфер обмена и вставляешь везде быстренько. Я уже заебался нажимать shift+7. С этим уёбищным крестоблядским & время правки одного-единственного места занимает минимум 5 секунд!!!
                  Ответить
                  • Кто о чем, а Тарас о крестах.
                    Ответить
                    • Короче сишная модель "всё по значению" в высокоуровневом С++ пиздец мешает.

                      Ох кресты вы мои кресты... Жизней сломанных пол-версты...
                      Ответить
                      • Наверное плюсам мешает отсутствие единого концепта - язык который пытается быть одновременно человекочитабельным асмом, ООП, а с недавних пор еще и функциональным.

                        Из-за этих эволюцонных причин и желания напихать туда побольше всякого, не особо разбираясь: "А надо ли?".
                        Ответить
                  • используй силу контрол+стрелка - вообще делается одной рукой
                    используй не const Type & t, а Type const & t
                    пиши изначально const & - это надо делать всего то в декларации аргументов функции
                    используй язык, где не надо так писать, а begin, end if, function, declare улучшают читабельность ДАЖВЕ ПРИ ОТСТУПЕ В ДЖВА ПРОБЕЛА!!11
                    Ответить
                    • В том-самом нормальном языке нет нужного мне готового компилятора.
                      Кстати там принято три пробела :3
                      Ответить
                      • > три пробела
                        Чтобы неповадно было расставлять табы (потому что кто включит шестипробельный таб в редакторе)?
                        Ответить
                  • Я если один раз где-то набрал const &, то потом если напишу const пробел, C-/, то автоподстановка предложит такой вариант (т.е. предложит дополнить амперсандом). Ну и M-t меняет соседние слова местами :| А в каком редакторе этого нету?
                    Ответить
        • А ещё говорят, что в четвёртом пхп объекты всегда по умолчанию возвращались по значению копированием, отчего можно было наловить немало лулзов.
          Ответить
          • А начиная с 5.3 если в списке формальных аргументов функции аргумент отмечен как by-ref (амперсандом), а при вызове передаем не переменную, а значение в форме литерала - получаем fatal error. Но что смешно, если делаем вызов через call_user_func_array, то получаем ВНЕЗАПНО WARNING:
            $ php -r "function f(&\$a) {} \$args = array(2); call_user_func_array('f', \$args);"
            
            Warning: Parameter 1 to f() expected to be a reference, value given in Command line code on line 1
            Ответить
    • vanished
      Ответить

    Добавить комментарий