PHP. Собеседование в вопросах и ответах

    imageНекто Андрей Шевченко составил, структурировал и выпустил в виде бесплатной PDF книги список вопросов, которые всенепрменнно могут встретится(и чаще всего встречаются) любому PHP программисту на самом стандартном собеседовании. Более того — каждый вопрос снабжен достаточно подробным ответом.

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

    Прямая ссылка на книгу.
    Сайт книги.

    (я не автор данной книги, просто спешу поделиться, т.к. она показалась мне полезной)

    upd
    На Хабре обнаружился автор.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 432
    • +33
      Такое ощущение, что сейчас это тред – учиться проходить собеседования, а не программировать. Знать ответы на вопросы собеседования, но не применить их на практике ни разу.
      Я видел собеседования, где программисты не могли сказать, чем отличается объект от класса, процедурный подход от объектно-ориентированного. Вот, что важно.

      Я нисколько не умаляю информации в этой книге, я просто не очень доволен ситуацией в области.
      • +13
        скоро будут агентства, которые будут за Вас ходить на собеседование, а может и кодить :)
        • Спрос порождает предложение.
          • +5
            Почему бы и нет? На «эстраде» у нас уже давным-давно такая ситуация.
            тьфу-тьфу-тьфу, конечно
            • +64
              Анекдот в тему:

              Нанимает американский генерал летчиков на работу. Заходит немец.
              Рассказывает, сколько налетал, в каких операциях участвовал.
              Генерал спрашивает:
              — А сколько ты хочешь получать?
              — 3 тысячи долларов.
              — А на что ты их потратишь?
              — Ну как? Одну в банк положу, одну — семье, одну себе.
              Заходит англичанин. Тоже рассказывает, сколько налетал, в каких
              операциях участвовал.
              — А сколько ты хочешь получать?
              — 4 тысячи долларов.
              — А на что ты их потратишь?
              — Ну как? Одну в банк положу, две — семье, одну себе.
              Заходит русский. Генерал спрашивает:
              — Сколько налетал?
              — Нисколько.
              — ???
              — В каких операциях участвовал?
              — Ни в каких.
              — ???!!!
              — А сколько получать хочешь?
              — 9 тысяч.
              — А зачем тебе столько?
              — Ну как? Три — Вам. Три — себе. А за три немец летать
              согласился.
              • –10
                Я бы поменял здесь русского на еврея.
              • +1
                Так в был же пост недавно вроде, в Британии агенты ходят за тебя.
                • 0
                  Они не собеседуются, они назначают встречу работнику с работодателем.
                • +8
                  Как в анекдоте: «Три тыщи Вам, три мне, а за тыщу согласен индус работать».
                  • +2
                    Эх, не обновил страницу перед отправкой.
                • 0
                  Зато по ответам можно будет определить, понимает ли человек, о чем говорит, или просто вызубрил книгу.
                  • +2
                    Учиться проходить собеседования надо :(
                    • +4
                      меня несколько удивляет и то, как многие конторы проводят собеседования — задавая вопросы о том, чего в работе и близко не используют. поэтому часто главное собеседование пройти — а работать сможешь
                    • +1
                      в книге как раз и написаны ответы на вопросы типа «чем отличается объект от класса, процедурный подход от объектно-ориентированного» :)
                      • +3
                        Просто прохождение собеседования часто зависит не от навыков программирования, а от социальных навыков. Тебя могут завернуть, если ты, там, вяло руку рекрутеру пожал, или смело в глаза не смотрел.
                        Или задаются пространные вопросы типа чем отличается php 5.3 от php 5.2.

                        Нафига? Человек должен понимать код, писать код, уметь правильно мыслить и уметь учиться (или гуглить). Всё. Я встречал туеву кучу людей, которые блестяще проходили собеседование на php программиста, приходили на рабочее место и сдувались, потому что блестящая теория не давала им бонуса к практике.

                        Вот по себе скажу — если мне вопрос зададут, я не смогу, например, ответить чем ООП отличается от процедурного метода. Тем не менее в мозгах я это понимаю и одинаково хорошо пишу как в одном так и в ином направлении. Но на вопрос не отвечу. Потому что думаю не так.

                        Как то так, вот…
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • 0
                            По-этому я предпочитаю перед собеседованием принять на душу=)
                            • 0
                              пространные вопросы типа чем отличается php 5.3 от php 5.2.


                              Я этот вопрос задаю на собеседовании, что бы понять на сколько человеку интересно то чем он занимается. Если человеку действительно интересно, то он постоянно следит за новинками в области, а потом подходит к руководству и говорит: «Надо на нашем выделенном сервере обновить php и я даже готов исправить все баги на всех наших 5-10 сайтах, которые всплывут после перехода. Зато, я больше времени сэкономлю используя современные технологии». Но если человек ходит на работу ради ЗП и молча делает всё то что ему приказывают, то ему новые технологии до лампочки и тем более он не будет изучать: ООП, паттерны, tdd,…
                              • 0
                                Главное — писать код, который будет работать без сбоев. Если будет участок работ, где система, скажем, будет в разы стабильнее работать без ООП — глупостью будет стремиться за новинками в ущерб стабильности и производительности.

                                Поэтому более интересным был бы вопрос не в разнице версий, а, скажем «какую бы вы предложили версию для реализации %problemName% и почему?».
                                имхо.
                                • +1
                                  какую бы вы предложили версию для реализации %problemName% и почему?.

                                  Для всех возможных задач правильным ответом будет: «самую последнюю» (php 5.4). Почему бы и нет? Не вижу смысла использовать старые динозавры.
                                  А вы можете придумать задачу для решения которой лучше было бы использовать старое древнее php4?

                                  Вы не поверите сколько php-программистов не могут ответить на вопрос «какая самая последняя стабильная версия пхп?», потому что им пофиг — им лишь бы быстрее дожить до выходных, получить ЗП и пойти в бар с друзьями.
                                  • 0
                                    Я вот например не знал, что последняя — 5.4
                                    Потому что до сих пор у всех заказчиков — 5.2 и менять не собираются. И только один из последних заказов проскочил — переписать 5.2 на 5.3

                                    В конце концов, если вы — компания, где рядовой программист может прийти, сказать «а давайте обновимся, адаптация — с меня» и компания бесспорно согласится, то вы — очень дружелюбная к разработчику компания. Сочтите за комплимент. ))

                                    Да и вообще — писать код чтобы дожить до выходных — я такого отказываюсь понимать. Это должен быть или очень скучный вялотекущий проект, или сотрудник, которому не нравится работа. По первому вопросу — стоит рассмотреть возможность заинтересовать сотрудника, по второму… Второй вообще как бы удивляет — такого человека и принять то не должны были. Или убрать если всё так плохо. Но он есть. Где собака порылась — непонятно.
                                    • 0
                                      Может выбирать особо не из чего, а проект(ы) малоинтересные, вот работа и не нравится.
                                • 0
                                  А я вот толком не помню уже, что изменилось в 5.3 — давно это было. Особенно в плане потери обратной совместимости нюансы. Так-то глобально можно сказать — нэймспэйсы, анонимные функции, замыкания, сборщик циклических ссылок. А вот посмотрел список и вижу что многое забыл, например: goto (про него вообще забыл :) ), LSB (казалось что в 5.2 он уже был), константы в глобальном нэймспейсе, ?:, и т. п. В общем я сейчас озабочен совместимостью своего 5.3 кода с 5.4, чем с 5.2.

                                  Не пройду ваше собеседование?
                                  • 0
                                    Пройдёте :) goto — зло, по этому хорошо что про него забыли. Наизусть учат когда готовятся к собеседованию по таким книжкам. Изменений в php5.3 было очень много — запомнить всё не возможно, да и было это 3 (!!!) года назад.
                                    • 0
                                      Когда мне на собеседовании озвучивают что «Goto зло»
                                      У меня сразу возникает куча вопросов
                                      1. «А вот объяснить почему оно зло можете?»
                                      Ну или давайте с другого конца —
                                      2. «Вы используете break для прерывания цикла?»
                                      или вот еще
                                      3. «Как часто в методах и функциях которые вы пишите вы используете больше одного return?»
                                      и последнее
                                      4. «а причем здесь goto?»

                                      И break, continue, goto а также «несколько точек выхода из метода (return)» нарушают принципы структурного программирования.
                                      Когда люди во всю нарушая принципы структурности в своем коде, говорят что «goto зло» мне это напоминает курильщиков марихуанны, которые ратуют за смертную казнь наркоманам.
                                      Continue break — ИМХО удобны и полезны больше чем вредны
                                      множественный выход из функции — вреден почти всегда (например чтобы добавить логгер перед завершением метода придется копипастить его перед каждым return), в поддержку него можно только назвать проверка входных данных и выход до основного блока
                                      goto — после того как ввели break а некоторых языках и break N то придумать хоть какую нибудь задачу где он был бы полезен стало мягко говоря проблематично

                                      Я это к чему веду. Если человек голословно заявит при мне что goto зло, но при этом не может объяснить почему — то сие заявление я скорее запишу ему в минус чем в плюс
                                      • 0
                                        это применимо не только к goto, а к абсолютно любому утверждению. я вообще-то всегда считал, что любые однозначные/категоричные утверждения, которые не могут быть хоть немного внятно объяснены — это минус.
                                        есть даже шутка-мысль такая — чем меньше человек делает категоричных заявлений, тем менее смешно он выглядит в будущем.
                            • +10
                              == 3. Какими способами можно перенаправить страницу в PHP?
                              кроме двух указанных есть ещё один через meta refresh

                              == 13. Обязательно ли писать ?> в конце скрипта?
                              Так как есть завязка на пхп версии 4, то этот ответ имеет два варианта, а не один, как указано
                              в пыхе 4.х обязательно

                              == 17. Какая разница между функциями echo и print в PHP?
                              echo не функция, а часть языка (statement), print функция.

                              и вобще ответы устаревшие по отношению к 5.3… 5.4

                              но если честно, вопросы по мануалу, а их редко задают
                              • +4
                                Пролистав дальше: это какой-то шаблонный справочник совсем для нубов, в школе на экзаменах могут такие вопросы задавать, но не на собеседовании.
                                • +11
                                  У вас в школе PHP преподавали? Мы дальше шестнадцатеричной системы не ушли.
                                  • 0
                                    В мои школьные года пхп не существовал в зачатках. Но нам преподавали, кажется, основы паскаля.
                                    • +1
                                      Его до сих пор преподают, хотя учителя большей частью сами толком программировать не могут.
                                      • 0
                                        вы закончили школу раньше 94 года?
                                        • 0
                                          позже. но писать, на каком там, пхп 3.0 было удовольствие как сайты на баше :)
                                          • 0
                                            Что и 4 даже не застали?
                                          • 0
                                            Это вы просто сайты на Си не писали. PHP3 был вполне нормальным процедурным языком, ориентированным на веб.
                                            • 0
                                              Я на перле писал за то :) А сейчас вот переписываю часть сайта на плюсах.
                                              • 0
                                                Ну я выбирал между PHP3 и Perl, когда понял, что писать сайты на СИ как-то не очень правильно.
                                  • 0
                                    ==== 3. Какими способами можно перенаправить страницу в PHP?
                                    ==кроме двух указанных есть ещё один через meta refresh

                                    А еще есть заголовок Refresh
                                    • 0
                                      refresh это метатег
                                      а заголовок — location
                                      • 0
                                        Если refresh-это всего лишь метатег, то что же означают слова «http-equiv» в его конструкции?

                                        Возможно, вы об этом забыли, но каждый метатег, определяемый через http-equiv, является аналогом одноименного заголовка HTTP.
                                        • 0
                                          ага вспомнил, я подумал что тот кому я ответил перепутал location с refresh
                                          ну тогда если не перепутал, получается есть еще один способ, заголовок location :)
                                          • 0
                                            Читай внимательнее!

                                            В книге были приведены два способа:
                                            1. Заголовок Location
                                            2. javascript

                                            romy4 добавил третий — meta refresh

                                            Я (тот, кому вы ответили) добавил четвертый — заголовок refresh

                                            Какой «еще один способ» вы нашли?
                                            • 0
                                              все верно. вам бы лишь бы придраться? я не читал эту книгу и не искал сколько там ответов дано
                                              • 0
                                                4 способ: meta http-equiv=«location»
                                                • 0
                                                  Да когда вы читать научитесь, для начала хотя бы тот комментарий, на который отвечаете.
                                                  Во-первых, это не 4 способ, а пятый!

                                                  А во-вторых, этот «способ» не работает (по крайней мере, в Chrome)
                                                  • +3
                                                    Ведь это же сто процентный тупняк вот вы спрашиваете у человека на с-нии
                                                    Какими способами можно перенаправить страницу в PHP?

                                                    а он тебе ответ:
                                                    2. Используя JavaScript…

                                                    по моему очень смешно
                                                    • 0
                                                      Не тупняк, а один из способов как можно перенаправить страницу в PHP.
                                                      • 0
                                                        ага с помощью ЯваСкрипта :) браво!!!
                                                        • 0
                                                          Это всего лишь один из нескольких способов.
                                                          • 0
                                                            это все шутка перво-апрельская? :) или это такой тонкий троллинг?
                                    • +3
                                      Если уж придираться, то print тоже языковая конструкция, а не функция: print 'helo world';
                                      • 0
                                        Если уж так копать, то да. Но echo парсится как языковая конструкция (language token T_ECHO), а print как функция, что ищется в массиве функций области видимости global.
                                        • +5
                                          T_PRINT.
                                          • +1
                                            ы. вы правы совершенно.
                                            и в конечном итоге сводится к ZEND_ECHO_SPEC_TMP_HANDLER которая выводит переменную.
                                        • 0
                                          Чтите мануал на эту тему: http://php.net/manual/ru/reserved.keywords.php
                                          • +1
                                            Вы действительно это мне отвечаете? =)
                                        • 0
                                          придраться ко всему можно, было бы желание :)
                                        • 0
                                          > а часть языка (statement)
                                          функция в императивном ЯП это тоже statement. Print тоже не функция, они все конструкции языка.
                                          • 0
                                            == 25.
                                            Ряд Фибоначчи выводится за сложность O(2^n), хотя можно за O(n).
                                            • +2
                                              Это кстати хороший тест на инерцию мышления:
                                              24. Напишите рекурсивную ф-ю ХХХХ
                                              25. Напишите ф-ю Фибоначчи
                                              • 0
                                                Ну рекурсивно с динамикой, да.
                                              • 0
                                                Просто энное число Фибоначчи и вовсе за логарифмическое время можно посчитать.
                                                • +5
                                                  И даже за константное, если точность не важна.
                                                  • 0
                                                    Спасибо, вы мне на весь вечер настроение подняли.
                                              • 0
                                                ua.php.net/manual/en/function.print.php Я просто на всякий случай здесь оставлю, почитайте описание, там черным по белому говорится что принт — не функция. И это в мануале.
                                                • +1
                                                  да и сам интерпретатор такого же мнения
                                                  $ php -a
                                                  Interactive shell

                                                  php > var_dump(function_exists('print'));
                                                  bool(false)
                                                  • 0
                                                    чёрт, комент предыдущий не отправился. Да, вы правы. print сводится к вызову ZEND_ECHO_… в конечном итоге.
                                                  • 0
                                                    еще как задают
                                                    • 0
                                                      Это печельно, что такие вопросы порой являются порогом прохождения по вакансии.
                                                      • 0
                                                        печально, но это так :) что есть то есть.
                                                  • +15
                                                    Это не книга, а некий текст, завернутый в PDF. В книгах не бывает такого количества ошибок правописания.

                                                    Обратите внимание на третий вопрос: «Какими способами можно перенаправить страницу в PHP?». Судя по ответу, подразумевается перенаправление браузера на другую страницу. Вопрос сформулирован некорректно.

                                                    Мне это творение кажется низкокачественным.
                                                    • +15
                                                      Там не только грамматические ошибки.
                                                      Вот к примеру еще такие вещи есть:

                                                      Как задать красный цвет для всех элементов, имеющих класс red?
                                                      .red { background-color:white; }
                                                    • +2
                                                      нашел вредный совет:

                                                      21. А как перевернуть массив без функции array_reverse?
                                                      Например, так:
                                                      <?php
                                                      $arr = array(‘h’, ‘e’, ‘l’, ‘l’, ‘o’);
                                                      $reversed = array();
                                                      for ($i=0; $i<count($arr); $i++) array_unshift($reversed, $arr[$i]);
                                                      for ($i=0; $i<count($reversed); $i++) echo “$reversed[$i]”;
                                                      ?>


                                                      считать count($arr) в каждой итерации не ок.
                                                      Да и вариант не оч человеческий выбран:
                                                      for ($i=count($arr)-1; $i<=0; $i++) { $reversed[] = $arr[$i]; }
                                                      • +13
                                                        Для массива hello world это по-барабану, даже на массиве с тысячей элементов. Сложность count($arr) константная, а не линейная. На пикосекунду дольше, чем вызов переменной со значением размера.
                                                        • +4
                                                          Ну мне кажется что человек который так пишет в примерах будет использовать такой подход и в реальном коде.
                                                          • +19
                                                            минусующие сосните тунца, сперва разберитесь в исходниках пыха.

                                                            PHP_FUNCTION(count) → zend_hash_num_elements() → return ht->nNumOfElements;
                                                            • +8
                                                              Да это ведь горе-оптимизаторы. У них запросы к базе без индексов в цикле, а тормозит из-за неправильного count.
                                                              • +13
                                                                И двойных кавычек, ага.
                                                                • +1
                                                                  Кстати, КО подсказывает, что производительность двойных кавычек в новых версиях тоже изменилась, причём, судя по поведению токенайзера PHP, который выделяет токены в двойных кавычках, выражения внутри двойных кавычек теперь тоже компилируются заранее, а поэтому есть вероятность, что это будет работать быстрее. И это подтверждает, к примеру, такой тест:

                                                                  <?php
                                                                  define('NUM', 1000000);
                                                                  $start = microtime(true);
                                                                  for ($i = 0; $i < NUM; $i++);
                                                                  $for_time = microtime(true) - $start;
                                                                  
                                                                  $some_str = "Hello world!";
                                                                  
                                                                  echo "For loop time: " . round($for_time, 3) . " sec\n";
                                                                  
                                                                  $start = microtime(true);
                                                                  for ($i = 0; $i < NUM; $i++);
                                                                  echo "Empty stmt time (should be 0): " . round(microtime(true) - $start - $for_time, 3) . " sec\n";;
                                                                  
                                                                  $start = microtime(true);
                                                                  for ($i = 0; $i < NUM; $i++) {
                                                                  	"hello world $for_time $i $for_time $i $for_time $i $some_str $some_str";
                                                                  }
                                                                  echo "Double quotes: " . round(microtime(true) - $start - $for_time, 3) . " sec\n";
                                                                  
                                                                  $start = microtime(true);
                                                                  for ($i = 0; $i < NUM; $i++) {
                                                                  	'hello world ' . $for_time . ' ' . $i . ' ' . $for_time .' ' . $i . ' ' . $for_time . ' ' . $i . ' ' . $some_str . ' ' . $some_str;
                                                                  }
                                                                  echo "Single quotes: " . round(microtime(true) - $start - $for_time, 3) . " sec\n";
                                                                  


                                                                  Результаты:

                                                                  $ php bench.php 
                                                                  For loop time: 0.097 sec
                                                                  Empty stmt time (should be 0): -0.005 sec
                                                                  Double quotes: 2.183 sec
                                                                  Single quotes: 2.891 sec
                                                                  
                                                                  • +1
                                                                    Всегда использовал одинарные кавычки, не потому что они быстрее, а потому, что shift не надо нажимать.
                                                                    • 0
                                                                      Ваши тесты немного ошибочные. Дело не в разных кавычках, а в том, что в варианте с одинарными кавычками используется оператор конкантенации, из-за которого вы и получаете разницу в 0.7 сек. Если в варианте с двойными кавычками использовать ту же конкатенацию, то время выполнения двух вариантов должно сравняться.
                                                                      • 0
                                                                        Не согласен, как раз и были очень известные тесты, в которых говорилось, что конкатенация быстрее интерполяции переменных в двойных кавычках. Моё утверждение было о том, что это более неверно, причём уже довольно давно.
                                                                        • 0
                                                                          А, ну да, с 2001 года многое изменилось :)
                                                                          • 0
                                                                            что это более неверно, причём уже довольно давно.

                                                                            Да, эти тесты уж слишком известные. Когда уже их удалять с сервера.
                                                                            Особо доверчивых после прочтения сложно переубедить, аргументы о замшелости статьи не помогают, трясти начинает, когда в качестве аргумента дают пруф на эту статью. А начальство переубеждать сложнее всего (было у меня с кавычками).
                                                                        • 0
                                                                          Любопытно.
                                                                          Если же уменьшить количество переменных до 4, то конкатенация и двойные кавычки выравниваются по скорости.
                                                                          Ещё уменьшить — конкатенация быстрее.

                                                                          PHP5.3.5
                                                                          • 0
                                                                            Похоже на правду.
                                                                            • 0
                                                                              Резюмируя, как это часто бывает, правильны оба вывода сразу, каждый при своих условиях:
                                                                              конкатенация в малых количествах быстрее переменных в двойных кавычках, однако с ростом числа участвующих переменных конкатенация оказывается медленнее.
                                                                    • 0
                                                                      Клева, можно не парица оказывается. Похоже ето знание ко мне пришло как в известной истории про «здесь так принято» :)
                                                                      • 0
                                                                        И все таки, как тогда обьяснить это?
                                                                        • 0
                                                                          просто переменная $num: поиск в массиве переменных, возврат значения
                                                                          count($data): поиск переменной $data, возврат значения $data, вызов count для $data, возврат к-ва элементов $data.

                                                                          в два раза больше действий
                                                                    • +1
                                                                      Там скорее будет проблема в array_unshift, нежели в чем-то другом
                                                                      • 0
                                                                        Хоть бы кто-нить написал про ошибку )
                                                                        Там же не $i++, а $i--
                                                                        • +4
                                                                          Чтобы не ошибаться — пишите так:
                                                                          for ($i = count($arr); $i--;} {
                                                                              $reversed[] = $arr[$i];
                                                                          }
                                                                          
                                                                          • +2
                                                                            for ($i=count($arr); $i-->0;)

                                                                            мне так больше нравится :) Как будто $i стремится к нулю )
                                                                          • 0
                                                                            Здрасьте! С какой стати там должно быть а $i-- ??
                                                                            • 0
                                                                              В моем варианте:

                                                                              for ($i=count($arr)-1; $i>=0; $i--) { $reversed[] = $arr[$i]; }

                                                                              Там еще и условие выхода не правильное )
                                                                      • +8
                                                                        Кажется пора очередной пост писать :)
                                                                        habrahabr.ru/post/21681/
                                                                        habrahabr.ru/post/67963/
                                                                        • 0
                                                                          Это действительно вопросы для собеседований? о_О В моем говноколледже спрашивали примерно то же на экзаменах, правда про C++.
                                                                          • +2
                                                                            Если коротко, то устаревшая хрень…
                                                                            • 0
                                                                              Мал, что устаревшая, так ещё и не точная хрень…
                                                                              • +1
                                                                                Если еще короче, то просто хрень
                                                                              • 0
                                                                                > В чем различия между четвертой и пятой версиями PHP?
                                                                                Кажется уже пора спрашивать в чем отличие 5.4 от 5.3 и от 5.2.
                                                                                • 0
                                                                                  пора, но некоторые до сих пор спрашивают отличие 5 от 4…
                                                                                • +1
                                                                                  31. Нарисуй форму для отправки файла…
                                                                                  Разве не корректней использовать move_upload_file вместо copy?
                                                                                  • +1
                                                                                    и корректно, и правильно. Человек будет забивать темп загруженными файлами делая copy.
                                                                                    • +1
                                                                                      Не будет. После завершения скрипта загруженные файлы, если они не были перемещены, неважно каким образом, будут подчищены сами.
                                                                                      • 0
                                                                                        Да, мой баг. Но copy делает лишнюю работу.
                                                                                        • +1
                                                                                          Какую? В случае, если tmp и хранилище на разных разделах, а это зачастую так и есть, работа будет производиться одинаковая.
                                                                                          • +1
                                                                                            Да нет, далеко не часто.
                                                                                            • 0
                                                                                              Я чаще встречал хостинги, где tmp для виртуалхоста лежит на том же диске, даже в директории юзера, который хостится. Использование общего tmp чревато дырами.
                                                                                            • 0
                                                                                              Разница:

                                                                                              copy:
                                                                                              1. копирует файл

                                                                                              move_upload_file:
                                                                                              1. проверяет этот файл есть?
                                                                                              2. проверяет загружен ли он пхп через пост?
                                                                                              3. копирует файл
                                                                                              4. удаляет файл

                                                                                              Чувствуете разницу кто делает лишнюю работу? Не говорите глупостей, просто достаточно перед тем как что-то написать, почитать _официальный_ мануал по пхп, для того чтоб увидеть разницу и не выглядеть как человек которому эта книга нужна.
                                                                                              • 0
                                                                                                1 вопрос, а насколько корректно использовать вместо них rename? В случае если файлы на одном и том же локальном диске — будет ли копирование? А если они на разных томах? Судя по Changelog-у здесь начиная с 5.3.1(win) и 4.3.3(linux) должно сработать.
                                                                                                • 0
                                                                                                  использовать можно хоть побайтовое чтение собственным расширением, написанным на сях. только зачем? move_uploaded_file сам всё делает. или я неправильно понял вопрос? :)
                                                                                                  • 0
                                                                                                    Ну если верить taliban-у, то move_uploaded_file всегда копирует файл. Если я правильно понимаю rename, то переименовывание файла должно быть существенно быстрее, нежели копирование (особенно если речь идёт о каких-либо больших файлах, к примеру видео).
                                                                                                    • 0
                                                                                                      А вы лучше не верьте, а смотрите исходники. Мой ответ чуть ниже.
                                                                                                  • 0
                                                                                                    Вот тут уже не вкурсе, но вообще как человек выше говорил все же уместней использовать move_upload_file, именно из-за проверки ее на загруженность через пост, чтоб не скопировать «подсунутый» файл.
                                                                                                • +3
                                                                                                  Сталкивался с тем, что если скрипт заперт в DOC ROOT`е, то copy не сможет достать файл, а move_uploaded_file сможет.
                                                                                                  • +1
                                                                                                    Вот она, сермяжная правда!
                                                                                          • 0
                                                                                            move_uploaded_file лучше в целях безопасности вроде как.
                                                                                            • 0
                                                                                              не корректней.
                                                                                          • 0
                                                                                            А как перевернуть массив без нее?
                                                                                            Это как моя любимая задачка на строку-перевертыш.

                                                                                            $arr = array(‘h’, ‘e’, ‘l’, ‘l’, ‘o’);
                                                                                            
                                                                                            for ($i = 0; $i < floor(count($arr)/2); $i++)
                                                                                            {
                                                                                                $tmp = $arr[$i];
                                                                                                $arr[$i] = $arr[count($arr)-$i-1];
                                                                                                $arr[count($arr)-$i-1] = $tmp;
                                                                                            }
                                                                                            
                                                                                            • +2
                                                                                              Вот, на мой взгляд, более элегантное решение:
                                                                                              	$source = array( 50 , 40 , 30 , 20, 10);
                                                                                              	$pieces = count($array)-1;
                                                                                              	$reversed = array();
                                                                                              	while($pieces >= 0) {
                                                                                              		$reversed[] = $source[$pieces--];
                                                                                              	}
                                                                                              

                                                                                              Результат:
                                                                                              Array (
                                                                                                  [0] => 10
                                                                                                  [1] => 20
                                                                                                  [2] => 30
                                                                                                  [3] => 40
                                                                                                  [4] => 50
                                                                                              )
                                                                                              • 0
                                                                                                Всё зависит от требований. Решение перед вашим зато памяти дополнительной потребляет лишь в размере одной временной переменной. А у вас второй массив в памяти.
                                                                                                • +2
                                                                                                  Может быть, может быть. Но, скажу честно, от конструкции floor(count($arr)/2) меня почему-то передёрнуло.
                                                                                                  • +1
                                                                                                    в школе стандартные алгоритмы на паскале не реализовывали чтоли?
                                                                                                    Или, наоборот, поэтому и передернуло? :)
                                                                                                    • +1
                                                                                                      Таким примером можно показать что недавно использовал активно паскаль, а как сделать оптимальнее в php не знаешь.
                                                                                                      • 0
                                                                                                        В школе, вы удивитесь, мы писали на Ассемблере. Но это был «кружок для избранных», остальные с горем пополам осваивали Бэйсик.
                                                                                                      • +1
                                                                                                        Более того она будет вычисляться каждую итерацию, неоптимальненький ответ.
                                                                                                      • +1
                                                                                                        Совершенно верно. Идет расчет на расход памяти. В идеале еще можно сделать через SplFixedArray, но я посчитал это излишним.
                                                                                                      • +1
                                                                                                        Преимущества такого подхода:
                                                                                                        1. Минимум писанины
                                                                                                        2. Наглядность
                                                                                                        3. count() вычисляется всего один раз (в отличие от остальных примеров у автора и в комментариях)
                                                                                                        4. Всего одна математическая операция — декремент. Нет путаницы в вычислениях, не нужен дебаг.

                                                                                                        Я понимаю, что это микрозадача. Но по стилю её решения сразу видно какой реальный опыт имеется у человека за плечами и каким образом этот «стиль» может сказаться на его фактической работе.
                                                                                                        • 0
                                                                                                          3. count() не вычисляется, он уже хранится вычисленным. А функция просто его возвращает.

                                                                                                          Недостаток этого подхода: в случае массива в 20мб и выделенной памяти в 32мб — ваше решение упадёт, а решение выше, хоть с десятком каунтов, будет работать.

                                                                                                          Говорю же — всё зависит от требований и ограничений.
                                                                                                          • 0
                                                                                                            Теоретически — да. На практике с массивами по 20Мб я просто не сталкивался и ничего не могу сказать о нагрузке при таких операциях. И ещё сразу появилась мысль, что если внутри ворочаются такие массивы, то не всё хорошо с архитектурой самого приложения.
                                                                                                            • 0
                                                                                                              Я с вами совершенно согласен, что такие массивы это или кривота, или исключение из правил. Но я хотел указать на то, что «более элегантное» это оценка настолько качественная, что в отрыве от требований к решению использовать её стоит очень и очень осторожно :-)
                                                                                                              • 0
                                                                                                                Задачи бывают разные
                                                                                                                • 0
                                                                                                                  Моё любопытство настаивает на примере подобной задачи =)
                                                                                                                  • 0
                                                                                                                    Такие задачи носят не постоянный характер, но встречаются.
                                                                                                                    В данный момент занимаемся переносом данных из доморощенной CRM в Salesforce. Данные переносятся по филиалам, до 100+тыс клиентов. В БД есть клоны, необходимо при переносе их склеить, поиск идент по ФИО и телефонам. Данные по телефонам хранятся как ввели. С помощью SQL решаемо, но долго, оказалось дешевле загрузить все в массивы и сравнить.
                                                                                                                    • 0
                                                                                                                      Разделяй и властвуй.
                                                                                                                      Это я к тому, что решение данной конкретной задачи в рамках корпоративной системы на локальном сервере с парой гигов оперативы носит абсолютно банальный характер.
                                                                                                                      Другое дело — если мы работаем в рамках виртуального хостинга на довольно ограниченных ресурсах. По образу и подобию можно было бы представить перелив данных из морально устаревшего, но довольно крупного интернет-магазина на новую архитектуру.
                                                                                                                      Да, задачка не из разряда «2+3», но это уже боевые условия и боевые задачи, которые должны решаться исходя из тех ресурсов, которые имеются на данный момент. И практика показывает, что на каждую конкретную задачу есть не менее трёх очевидных путей решения, не говоря уже о нестандартных. И тут уже важно выбрать самый оптимальный из них, а не спорить о том, чей говнокод отработает быстрее.

                                                                                                                      Суть всех холиваров в том, что они абстрагированы от реальных условий. Кто элегантнее заебенит функцию или класс, кто при обработке огромных массивов данных на доли секунды превзойдёт своего предшественника — это просто пиписькомер. Каждый день в боевых условиях настоящий программист должен принимать решения — какой путь более оптимален с поправкой на реальное положение вещей. Если он принимает верные решения — это хороший программист. Если он не может удержать в своём сознании все связи классов и модулей, не может хотя бы приблизительно оценить нагрузки и не может предсказать поведение системы в тех или иных условиях, он — плохой программист. Такая вот простая, но одновременно очень доступная мораль.
                                                                                                                • 0
                                                                                                                  Парсер Excel-файла на 40000 строк и примерно 15 столбцов может сожрать до полугигабайта в оперативке.
                                                                                                                  • 0
                                                                                                                    Плохой парсер! Фу!
                                                                                                                    • 0
                                                                                                                      Предвещая претензии и аргументы — а чем не устраивает CSV?
                                                                                                                  • 0
                                                                                                                    Не важно хранится или нет. Вызов функции — сравнительно долгая операция в ПХП.
                                                                                                                  • 0
                                                                                                                    «Но по стилю её решения сразу видно какой реальный опыт имеется у человека за плечами».

                                                                                                                    В том то и дело. Получив опыт в highload-проектах, я стал сделить за памятью в скриптах.
                                                                                                                  • +1
                                                                                                                    $source = array( 50 , 40 , 30 , 20, 10 );
                                                                                                                    $rev = array();
                                                                                                                    while ( count ( $source ) ) $rev[] = array_pop( $source );
                                                                                                                    
                                                                                                                    • 0
                                                                                                                      Это вы сейчас мой пример сократили до трёх строк, да?
                                                                                                                    • 0
                                                                                                                      вот только php вроде как оптимизирует использование памяти при присовении значения одной переменной другой, не проверял с массивами. На хабре статья была.
                                                                                                                      • 0
                                                                                                                        Во второй строке ошибка.
                                                                                                                      • –2
                                                                                                                        Три count в цикле — не есть гуд.
                                                                                                                        • 0
                                                                                                                          Частично согласен, но не могли бы вы пояснить, чем именно, к примеру 3 count — не гуд, а 3 арифметические операции — гуд?

                                                                                                                          Это я к тому, что не совсем понятно, почему вы заострили внимание именно на count, а не на арифметику с `-1`, которую точно так же можно убрать выше.
                                                                                                                          • 0
                                                                                                                            Я не говорил, что арифметика — гуд. Count в глаза бросился, да и все.
                                                                                                                            • 0
                                                                                                                              Я плохо разбираюсь в компиляторах, а в интерпретаторах и подавно, но разве count не оптимизируется во всех языках, которые только существуют? Или хотя бы в тех, о которых можно говорить в приличном обществе?
                                                                                                                              • +1
                                                                                                                                <?php
                                                                                                                                
                                                                                                                                $iterations = 100001;
                                                                                                                                
                                                                                                                                $arr = array('h', 'e', 'l', 'l', 'o');
                                                                                                                                $t1 = microtime(true);
                                                                                                                                for ($i = 0; $i < $iterations; $i++) {
                                                                                                                                	$arr = reverse1($arr);
                                                                                                                                }
                                                                                                                                $t1 = microtime(true) - $t1;
                                                                                                                                var_dump($arr);
                                                                                                                                var_dump($t1);
                                                                                                                                
                                                                                                                                $arr = array('h', 'e', 'l', 'l', 'o');
                                                                                                                                $t2 = microtime(true);
                                                                                                                                for ($i = 0; $i < $iterations; $i++) {
                                                                                                                                	$arr = reverse2($arr);
                                                                                                                                }
                                                                                                                                $t2 = microtime(true) - $t2;
                                                                                                                                
                                                                                                                                var_dump($arr);
                                                                                                                                var_dump($t2);
                                                                                                                                
                                                                                                                                function reverse1($arr) {
                                                                                                                                	for ($i = 0; $i < floor(count($arr)/2); $i++)
                                                                                                                                	{
                                                                                                                                		$tmp = $arr[$i];
                                                                                                                                		$arr[$i] = $arr[count($arr)-$i-1];
                                                                                                                                		$arr[count($arr)-$i-1] = $tmp;
                                                                                                                                	}
                                                                                                                                	return $arr;
                                                                                                                                }
                                                                                                                                
                                                                                                                                function reverse2($arr) {
                                                                                                                                	$c = count($arr);
                                                                                                                                	for ($i = 0; $i < floor($c/2); $i++)
                                                                                                                                	{
                                                                                                                                		$tmp = $arr[$i];
                                                                                                                                		$arr[$i] = $arr[$c-$i-1];
                                                                                                                                		$arr[$c-$i-1] = $tmp;
                                                                                                                                	}
                                                                                                                                	return $arr;
                                                                                                                                }
                                                                                                                                


                                                                                                                                Вывод:
                                                                                                                                array
                                                                                                                                  0 => string 'o' (length=1)
                                                                                                                                  1 => string 'l' (length=1)
                                                                                                                                  2 => string 'l' (length=1)
                                                                                                                                  3 => string 'e' (length=1)
                                                                                                                                  4 => string 'h' (length=1)
                                                                                                                                
                                                                                                                                float 2.8682391643524
                                                                                                                                
                                                                                                                                array
                                                                                                                                  0 => string 'o' (length=1)
                                                                                                                                  1 => string 'l' (length=1)
                                                                                                                                  2 => string 'l' (length=1)
                                                                                                                                  3 => string 'e' (length=1)
                                                                                                                                  4 => string 'h' (length=1)
                                                                                                                                
                                                                                                                                float 1.7087500095367
                                                                                                                                
                                                                                                                                
                                                                                                                                • 0
                                                                                                                                  Ок, понял. Для полноты картины, можете сделать тест, который в теле цикла не изменяет массив?
                                                                                                                                  • +1
                                                                                                                                    Пустой цикл? Или как?
                                                                                                                                    • 0
                                                                                                                                      Пустой может как-то иначе соптимизироваться, что-то внутрь надо поместить, хоть арифметику простую. Смысл в том, чтобы сам массив не изменялся.
                                                                                                                                      • 0
                                                                                                                                        Вас это интересовало?

                                                                                                                                        <?php
                                                                                                                                        
                                                                                                                                        $iterations = 100001;
                                                                                                                                        $t1 = microtime(true);
                                                                                                                                        for ($i = 0; $i < $iterations; $i++) {
                                                                                                                                        	$a = 1;
                                                                                                                                        }
                                                                                                                                        $t1 = microtime(true) - $t1;
                                                                                                                                        var_dump($t1);
                                                                                                                                        

                                                                                                                                        float 0.038902044296265
                                                                                                                                        
                                                                                                                                        • +1
                                                                                                                                          Не-не-не :)

                                                                                                                                          Меня интересует сравнение

                                                                                                                                          for ($i = 0; $i < $count($arr); $i++) {
                                                                                                                                          $a = $arr[$i];
                                                                                                                                          }


                                                                                                                                          и

                                                                                                                                          $iterations = count($arr);
                                                                                                                                          for ($i = 0; $i < $iterations; $i++) {
                                                                                                                                          $a = $arr[$i];
                                                                                                                                          }


                                                                                                                                          PS: я не PHPшник, возможны ошибки :)