Vadim Goncharov ([info]nuclight) wrote,
@ 2006-02-05 03:36:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:web-разработка, программирование, сравнение ЯП и компиляторы

К вопросу об ублюдочности PHP
Октябрьское обсуждение у [info]potan, перевалившее за три сотни комментов, состоит в основном из флейма. Да, конечно, там много интересных реплик, ссылок, и рассуждений о том, "как оно должно быть", но более-менее систематизированного перечисления недостатков PHP нет (разные "невинные" мелочи вроде отсутствия вменяемого DBMS API или приколов типа setlocale(LC_ALL,"ru_RU.KOI8-R"); echo (float)(string)(float)"1.5"; не в счёт).
Можно долго спорить о том, каким должен быть язык web-разработки ([info]mauhuur выразил претензию, что PHP слишком низкоуровневой язык общего назначения, и я вполне согласен, что DSL - лучше). Вместо это я рассмотрю PHP, главным образом, в сравнении с Perl'ом, поскольку оба претендуют на примерно одну и ту же нишу (на PHP можно и обычные скрипты писать, не для Web), оставив в стороне другие языки (и так слишком много получилось). Дальше будет преимущественно изложен переведенный и обработанный материал документа PHP in contrast to Perl и ссылок из него.

1. Бессистемное именование функций, нелогичные аргументы и возвращаемые значения [1, 3, 4].

 Perl - это стиль программирования. PHP - это его полное отсутствие.
(с) [info]ilya666

Функции могут именоваться разными способами - с подчеркиваниями (getnumberoffiles), слитно без них (get_number_of_files), с чередованием заглавных и строчных букв (getNumberOfFiles - как у функций WinAPI). В PHP применяются все три способа (третий - потому что регистр не различается, а именуют и так и эдак). Это ничего бы само по себе не значило, но в именовании функций нет никакой системы. Имеем функции: snmp_get_quick_print, snmpget, base64_encode, urlencode, htmlentities, html_entity_decode. Нельзя заранее предугадать, как функция будет называться. Кроме того, нет системы и в словах в названиях функций - меняются местами глагол и объект: base64_decode, iptcparse, create_function, recode_string.
На этом сюрпризы в именовании не заканчиваются - в именах функций конверсии есть и "2", и "to": bin2hex, cal_to_jd (jdto*, *tojd), strtolower.
Но и это еще не всё (с). Названия выбираются, видимо, тоже от балды: есть функции unlink, link и rename, которым соответствуют одноименные syscall'ы Unix, но системного вызова touch нет - есть utime. Есть функция mysql_connect, а "парная" ей называется mysql_close - а почему не disconnect ?.. уперли название из соответствующей библиотеки для Си (где единый close для всех дескрипторов, так что название в принципе логично), не потрудившись хоть немного соблюсти стиль?..
Для сравнения, в перле в именах базовых функций нет подчеркиваний вообще, все имена (кроме dbm*) имеют форму "глагол объект" (shm* и msg* соответствуют библиотечным вызовам, а sys - префикс, а не объект).
И это не предел (с). Для некоторых операций существуют много "вроде бы подходящих" функций, и не всегда легко решить, какую же именно из них применить. Вот например, пачку функций поиска совпадений можно свести вот в такую таблицу (что характерно, в документации на PHP такой таблицы нет... может кому-то из PHPистов хоть здесь пригодится):
                         replaces case                 gives   s/m/x offset
                 matches with     insens number arrays matches flags (-1=end)
ereg             ereg             no     all    no     array   no    0
ereg_replace     ereg    str      no     all    no     no      no    0
eregi            ereg             yes    all    no     array   no    0
eregi_replace    ereg    str      yes    all    no     no      no    0
mb_ereg          ereg             no     all    no     array   no    0
mb_ereg_replace  ereg    str/expr no     all    no     no      yes   0
mb_eregi         ereg             yes    all    no     array   no    0
mb_eregi_replace ereg    str      yes    all    no     no      no    0
preg_match       preg             yes/no one    no     array   yes   0
preg_match_all   preg             yes/no all    no     array   yes   0
preg_replace     preg    str/expr yes/no n/all  yes    no      yes   0
str_replace      str     str      no     all    yes    number  no    0
str_ireplace     str     str      yes    all    yes    number  no    0
strstr, strchr   str/char         no     one    no     substr  no    0
stristr          str/char         yes    one    no     substr  no    0
strrchr          char             no     one    no     substr  no    -1
strpos           str/char         no     one    no     index   no    n
stripos          str/char         yes    one    no     index   no    n
strrpos          char             no     one    no     index   no    n
strripos         str              yes    one    no     index   no    -1
mb_strpos        str              no     one    no     index   no    n
mb_strrpos       str              yes    one    no     index   no    -1

Для сравнения, в перле вся перечисленная функциональность обеспечивается набором из 4 простых операторов. Я уж умолчу о том, что для регистрозависимых и регистронезависимых сравнений в PHP надо применять разные функции (в перле lc(), /i). Или про небезопасный вызов system(), сделанный через одно место [3] - мало того, что аргументы нельзя передать безопасно, так еще и возвращаемое значение системного вызова system() возвращается в другом аргументе PHP-функции system(), а сама она вернет последнюю строку вывода запускаемой команды (кому нужна одна лишь последняя строка? Программерам явно было лениво реализовывать сохранение всего вывода. Хотя, есть же функция passthru() - так что вообще идиотизм).

2. Чрезмерно большое количество глобально видимых функций [1, 4, 9].
По состоянию на ноябрь 2003 года, PHP имел 3079 глобально видимых функций (примерно 4400 в феврале 2006) при сборке со всеми возможными расширениями, тогда как Perl - всего 206 core-функций.
"У нас есть всё необходимое!"

Средняя длина имени функции в PHP составляла 13 символов, в перле же - 6 символов.
Вывод - в перле необходимо учить и помнить гораздо меньше (особенно с учетом пункта 1, с более строгим именованием функций).
Происходит же это как за счет использования в перле модулей, так и из-за того, что в PHP обычно существуют несколько очень похожих функций. Вот наиболее характерные примеры:
* Сортировка:

    * PHP: (16)
    sort, arsort, asort, krsort, ksort,
    natsort, natcasesort, rsort, usort,
    array_multisort, uasort, uksort, dbx_sort,
    imap_sort, ldap_sort, yaz_sort

    * Perl: (1)
    sort

* Обработка списков

    * PHP: (10)
    array_filter, preg_grep, array_search,
    array_unique, in_array, array_map, array_walk,
    array_count_values, array_change_key_case, array_sum

    * Perl: (2)
    map, grep

* Разбиение строк:

    * PHP: (8)
    split, explode, strtok, spliti, chunk_split, mb_split, preg_split,
    str_split

    * Perl: (1)
    split

* Замена подстроки:

    * PHP: (12)
    ereg_replace, eregi_replace, mb_ereg_replace, mb_eregi_replace,
    preg_replace, str_ireplace, str_replace, ltrim, rtrim, trim, nl2br

    * Perl: (1)
    s///

* Печать/вывод:

    * PHP: (14)
    print, echo, printf, fprintf, vprintf, dio_write, fwrite, fputs,
    gzwrite[2], socket_send, socket_sendmsg, socket_sendto, socket_write,
    socket_writev

    * Perl: (5)
    print, printf, syswrite, send, write


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

3. Отсутствие раздельных пространств имен; области видимости [1, 2, 4, 6, 7, 9].
Одним из наиболее серьезных недостатков PHP является наличие только одного единого namespace'а. PHP не поддерживает модули ни в каком виде. Все подключаемые файлы (файлы, а не модули!) разделяют то же самое пространство имен, что здорово затрудняет работу в команде - разработчикам приходится следить за именованием функций, чтобы не назвать их одинаково. Да, и не попасть случайно названием (даже похожим, чтобы не путаться) в одну из более 4000 функций, уже имеющихся в языке. Весело? Вот и получаются длинные уродливые названия функций вроде xsl_xsltprocessor_transform_to_xml - надо же как-то отличать функции по принадлежности...
Надо отметить, что ООП в PHP5 проблему смягчает, но вовсе не устраняет.
А меж тем PHP не то что бы знать не знает про lexical scoping и dynamic scoping (забудьте, это заоблачная высь) - проблемы есть с гораздо более приземленными вещами. Вроде использования глобальных переменных в функциях. Привычная по другим языкам видимость переменных во вложенных блоках есть:
$message = 'Hello, world!';
if (!$quiet) {
    echo $message, "
";
}

А вот внутри функций - почему-то уже нет:
$message = 'Hello, world!';

function print_message ()
{
    // Tries to print a nonexistent local variable
    echo $message, "<br />";
}


Даже опытные PHP-программисты, бывает, проводят часы в поисках ошибок, связанных с забытым импортом глобальных переменных внутрь функций:

$message = 'Hello, world!';

function print_message ()
{
    // Bring the variable into this function's scope
    global $message;
    echo $message, "<br />";
}


Всё становится еще смешнее, когда дело касается встроенных переменных PHP. Если вы не импортируете внутрь функции, к примеру, переменную $HTTP_USER_AGENT, взятую от web-сервера, то PHP вам и не даст к ней доступ. Доступ к переменной, которую он создал для вашего же удобства.
Сюда же надо отнести и известные проблемы с настройкой register_globals, когда для удобства создавались отдельные глобальные переменные, а потом, после отключения сей переменной, все завязанные на это скрипты разом перестали работать. Вообще, совместимость между разными версиями PHP - сплошная головная боль для админов...

4. Недостатки реализации [4, 6].
Отдельная тема - непосредственно сам интерпретатор PHP, работающий на серверах. Из наиболее важного следует отметить плохую поддержку рекурсии - PHP4 использует для размещения данных стек, а не heap. Другая проблема - не все подключаемые модули PHP тредобезопасны. В результате чего авторы PHP официально не рекомендуют использовать Apache 2 в multithreaded-режиме. Более того, есть мнение, что именно эта недоработка PHP до сих пор препятствует широкому распространению Apache 2 (см. Slashdot: Sites Rejecting Apache 2?). На этом фоне уже мелочью выглядит то, что производительность PHP может быть повышена до 500% (!). Почему же не повысят? А потому что как тогда Zend будет зарабатывать деньги на своем Zend Accelerator? (Существуют и другие коммерческие компиляторы PHP - потому что для больших сайтов интерпретатор их серьезной нагрузки просто не выдержит). Производители некоторых модулей (например, генерации PDF-Файлов), кстати, тоже поставляют их под коммерческой лицензией.
Впрочем, эти проблемы в принципе поправимы. А про особенность проектирования под названием "php.ini" такого сказать уже нельзя. Настройки в этом файле едины для всех сайтов, располагающихся на том же сервере. А им может быть требоваться совершенно разная конфигурация. Начиная от того, что кому-то может быть нужен E_NOTICE, а соседа и warning'и не интересует, и заканчивая уже упомянутой опцией register_globals и другой, не менее коварной - magic_quotes_gpc. Последняя автоматически экранирует полученные от пользователя данные для безопасного помещения их в базу данных. Видимо, в надежде, что они сразу пойдут только туда, а программист туп, и сам их заэкранировать не догадается. А программист может захотеть не положить данные в базу, а вывести на экран. В результате пользователь получит мусор. Таким образом, для написания переносимых скриптов придется проверять наличие этой переменной и обрабатывать данные самостоятельно, если такое поведение нежелательно:
if (isset($param1) && get_magic_quotes_gpc())
    $param1 = stripslashes($param1);

[Update: Здесь [6], вообще говоря, ошибается - существует возможность переопределения почти всех настроек php.ini в httpd.conf или .htaccess, а многие можно сменить прямо в скрипте функцией
ini_set()
(см., однако, комментарии по приведенным ссылкам). Тем не менее, утверждение о порочности практики изменения поведения языка с помощью директив какого-то конфигурационного файла остается в силе.]
Еще здесь можно отметить, что PHP до сих пор не поддерживает Unicode. PHP-исты правда радуются, что это уже в планах и она скоро появится. В то время, как прочие языки это уже давно умеют, ага...

5. Недостатки языка [1, 2, 5, 6, 7].
Языковые недостатки PHP уже были частично рассмотрены в предыдущих разделах - из отсутствия namespace многое вытекает. Однако программиста ожидают заботливо разложенные грабли и в других, самых неожиданных местах.
PHP был разработан с целью максимально легкого обучения и использования не-программистами. Кроме того, язык, в отличие от других "доживших до наших" популярных сейчас языков, не был спроектирован одним человеком либо небольшой группой специалистов. Он вырос - Расмус Лердорф, автор PHP, принимал любые добавления в код от сторонних авторов. Отсюда и проистекает отсутствие единой концепции, что проявлется в том же хаотичном именовании функций. А стремление упростить приводит в перспективе лишь к избыточной сложности при попытке описания сложных вещей.
Вот, к примеру, массивы в PHP. Многие языки имеют как обычные массивы с числовыми индексами, так и массивы, индексируемые строками (хэши в Perl). PHP комбинирует оба в единый тип. С одной стороны, неопытному программисту не приходится заботиться о лишних типах (как в Бейсике когда-то, ага). С другой стороны - посмотрим на вот такой код:
$a1 = Array(10, 'Anne' => 32, 11, 'Bob' => 28, 12);
$a2 = Array(1 => 21, 2 => 22, 3 => 23);
$a2[0] = 20;

Сразу же возникает куча вопросов:
  • По какому индексу доставать значение 11 из $a1 ?

  • Каков порядок итерации по $a2 ? Он нумеруемый или хэшируемый?

  • Что будет, если попытаться добавить элементы в "конец" массива конструкцией $a2[] = ... ?

  • Могут ли в нумеруемых массивах отсутствовать элементы? А если да, можно ли простым способом пройтись по массиву в порядке индексов?

Разумется, на вопросы можно ответить, внимательным чтением документации и экспериментами. Но нужно ли такое счастье, даже опытному программисту?..
Похоже дело обстоит с типами данных. Когда нет разницы, число или строка, начинающему программисту вроде бы проще. И в PHP один оператор сравнения ==, не привязаный к типам данных. А теперь смотрим:
$n1 = 0;      $n2 = 10;
$s1 = 'foo';  $s2 = 'bar';

$n1 == $n2;  // Числовое сравнение, вернет false
$s1 == $s2;  // Строковое сравнение, вернет false
$n1 == $s1;  // Хороший вопрос
$s1 == $n1;  // Есть ли разница?

В таких случаях язык уже не может определить, что хочет программист. И вот в PHP4 уже появлется оператор ===, сравнивающий одинаковые типы - за что боролись, на то и напоролись...
В перле аналогичные правила преобразования строк в числа и обратно. Но перл имеет два разных оператора сравнения, для строк и для чисел. А PHP явно отвергает этот подход, утверждая в руководстве к PHP2, что это усложнит язык.
Есть и другие недостатки. В PHP отсутствуют замыкания (closures). В PHP нет анонимных фукнций. А как насчет хэша строк, вычисляемых eval'ом в процессе исполнения? Нет и других полезных мелочей. Например, в PHP нельзя легко повторить перловое $foo = bar() || $baz (если вы считаете, что эквивалентным выражением будет $foo = bar() ? bar() : $baz;, подумайте о функции bar() как об исполняющейся 10 секунд и имеющей сторонние эффекты вроде инкремента счетчика). Массивы в PHP не разворачиваются в строку, как в перле. И т.д.

6. Пригодность к разработке серьезных приложений [2, 3, 4, 5, 6, 8].
 Я не знаю ни одного программиста, который бы продолжил развиваться как программист, перейдя на пхп. Даже профессиональные программисты, переключаясь на пхп, со временем начинают деградировать (вплоть до переквалификации в манагеров :-)).
(с) [info]potan

Опыт показывает, что PHP плохо приспособлен для разработки больших проектов. Это касается не только проблем взаимодействия разработчиков или особенностей языка, рассмотренных ранее - это вытекает из самой предлагаемой PHP организации страниц. PHP поощряет смешение разметки страниц и логики приложения, тогда как этого следует всячески избегать. Для PHP только недавно (!) начал разрабатываться стандартный framework (существует некоторое количество их от сторонних разработчиков), однако большинство авторов сайтов на PHP, похоже, вовсе не слышали ни о том, что такое framwork, ни об MVC-модели.
Отсутствует и много других важных для масштабной разработки вещей. Например, для Perl есть DBI - единый интерфейс к базам данных. Для PHP же, чтобы сменить одну СУБД на другую, придется переписать кучу кода (да, и в случае Perl скорее всего потребуется изменить часть запросов ввиду отличающихмя диалектов, но для PHP работы по переделке будет гораздо больше). Этим дело не ограничивается - для PHP нет ни хорошего HTML-парсера, ни удобных библиотек работы с WWW или почтовыми MIME-вложениями (что-то отличное от простых действий придется реализовывать своими руками на низком уровне). В то время как в CPAN есть не только это (см. LWP, MIME::Lite, WWW::Mechanize), но и многое-многое другое (PEAR до такого ой как далеко).
Вообще, профессионализм PHP-истов оставляет желать лучшего. Существующие сайты предназначены в основном для не-программистов. Оно и понятно, ориентируются-то на начинающих. Поэтому и сам язык развивается далеко не лучшим образом. Весьма актуальна, например, проблема XY [3]: когда вопрошающий хочет, чтобы было X, тогда как в действительности он хочет Y, и думает, что X поможет ему достичь Y - и, как правило, ошибается (сразу возникают ассоциации на "Как правильно задавать вопросы" - видимо, они этого не читали).
В результате многие разработчики вынуждены самостоятельно изобретать велосипед. Рассмотрим такой типичный проект среднего размера, как phpBB. Этот форум поддерживает несколько распространенных СУБД, умеет отправлять письма почтой, поддерживает "темы" (полностью изменяющие внешний вид), в том числе для разных языков, предоставляет сносные возможности по администрированию и модерации - в результате, очень популярен.
И что же мы видим внутри? Свой собственный уровень абстракции для доступа к базам данных. Свою собственную реализацию составления e-mail сообщений (соответствующих RFC по MIME). И полное разделение программного кода и HTML-разметки - более того, создана своя собственная система шаблонов - HTML-код в шаблонах параметризуется множеством идентификаторов, в которые и подставляется результат работы. То есть разработчики были попросту вынуждены отказаться от одной из ключевых возможностей PHP - вставки тегов с кодом непосредственно в разметку.
Понятно, что при всём вышеперечисленном у phpBB код далеко не самого худшего качества. И, тем не менее, phpBB - постоянный гость в новостных лентах сайтов, посвященных безопасности - за несколько лет существования проекта в нем было обнаружено поистине огромное для его размеров количество дыр (даже червь существовал, поражающий эти форумы), и многие хосты стали просто отказываться от него. И это при том, что документация заявляет, что он "...Designed with security as a priority" !
Дыры нередки и во многих других приложениях, написанных на PHP. Что поделать, если язык плодит неквалифицированных программистов. Но в таких условиях, выбор PHP как инструмента для создания больших проектов - рискованное решение.

Резюме.
PHP весьма удобен для написания небольших динамических сайтов (домашних страничек, например), но категорически не является подходящим инструментом для создания чего-то большего. В случае, если ваш проект состоит более чем из десятка скриптов, лучше использовать что-то более заточенное под web-разработку, хотя бы Perl, если нет ничего лучше (Perl тоже отнюдь не идеален и многим плох - см., например, "Критический анализ языка Perl" или Perl: Terse and Ugly?).

Ссылки:
[1] PHP in contrast to Perl
[2] Re^2: Is Perl a good career move?
[3] Yaywoo!
[4] Why PHP sucks
[5] I hate PHP
[6] Experiences of Using PHP in Large Websites
[7] PHP Annoyances
[8] PHP: A love and hate relationship
[9] My list of PHP shortcomings
[10] "Держитесь подальше от PHP!"
(если какой-либо документ недоступен, используйте http://web.archive.org)

Дополнения (ответы на некоторые возражения):
1. Получилось сравнение на уровне хорошо (Perl) - плохо (PHP), и Perl типа рулит. А где разбор недостатков перла? И вообще, какой-то детский сад, "что круче, Феррари или Порше?".

Это именно разбор глюков PHP ("какое говно Запорожец"), а Perl приводится лишь для сравнения. Насчет перла в конце ссылки даны, например "Критический анализ языка Perl" - сходите и удивитесь, там 200 килобайт разбора недостатков перла.

2. Фигня про глобальные переменные, функции и модули написана - в PHP 5 же есть нормальное ООП.

Написал же. Проблему смягчает, но не устраняет - имена классов, например, по-прежнему глобально видимы. Сравните, например, с пакетами в Java (хотя это далеко не лучшая реализация, но в PHP и этого нет).

3. Ну и что, что массивы и хэши объединены - пример кода специально подобран, разве будет такое в реальном web-приложении?

Ну вот из [2]:
You can't just translate
$foo[4] = 4; $foo[2] = 2; foreach $element (@foo) { print $element }
to
$foo[4] = 4; $foo[2] = 2; foreach ($foo as $element) { print $element }

The Perl version prints 24, PHP insists on 42. Yes, there is ksort(), but that isn't something you can guess. It requires very in-depth knowledge of PHP. And that's the one thing PHP's documentation tries to avoid :)

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

4. Изобретают велосипед, говорите? Проблемы негров шерифа не волнуют Пусть мучаются, и наступают на грабли, а опытный программист таких ошибок не допустит, выберет все нужные инструменты/подходящий framework/библиотеки, и сделает качественный продукт. Так что не пугайте голым PHP.

Проблема в том, что язык культивирует именно дилетантский подход. Понятно, что профессионал сделает лучше, только вот мало их, профессионалов (вот и имеем дырявые продукты...). И вообще, можно и из говна конфетку сделать, но зачем тратить столько усилий, когда можно взять более подходящий материал?

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

Читаю, и перед глазами живо встает картина: 20-е годы, советская власть - "Пока вы, бездельники, тут трактор изобретаете, миллионы крестьян запрягают в плуг быков и делают реальное и полезное дело, хлеб выращивают!". А что, ведь два миллиона леммингов не могут ошибаться действительно полезным делом занимаются, ага...



Page 1 of 2
<<[1] [2] >>

(Post a new comment)

Часть первая. PHP vs Perl.
[info]qusk
2006-02-05 06:03 am UTC (link)
В целом - плоско. Честно говоря, уж извини, но на уровне хорошо(Перл)-плохо(ПХП).
Если уж мы сравниваем два языка - то будь так полезен упомянуть и про недостатки Perl по сравнению... (а, их нету? ;-))

Одним из наиболее серьезных недостатков PHP является наличие только одного единого namespace'а. PHP не поддерживает модули ни в каком виде. Все подключаемые файлы (файлы, а не модули!) разделяют то же самое пространство имен, что здорово затрудняет работу в команде - разработчикам приходится следить за именованием функций, чтобы не назвать их одинаково.
Уже давно и вполне нормально эмулируются через классы. ClassName::Method(); и всё.

Даже опытные PHP-программисты, бывает, проводят часы в поисках ошибок, связанных с забытым импортом глобальных переменных внутрь функций
_Опытные_ ПХП-программисты хернёй вида "использование глоб. переменных в функциях" не страдают.

Всё становится еще смешнее, когда дело касается встроенных переменных PHP. Если вы не импортируете внутрь функции, к примеру, переменную $HTTP_USER_AGENT, взятую от web-сервера, то PHP вам и не даст к ней доступ. Доступ к переменной, которую он создал для вашего же удобства.
Мораль сей басни - использовать супер-глобальные встроенные переменные ($_SERVER, $_POST, $_GET). То, что ты описал - пережиток прошлого.

Сюда же надо отнести и известные проблемы с настройкой register_globals, когда для удобства создавались отдельные глобальные переменные, а потом, после отключения сей переменной, все завязанные на это скрипты разом перестали работать.
Одни тупоумные включали эту strongly not recommended опцию, а потом разгребали последствия этого, своего тупоумного шага. Мне вот лично пофиг на тупоумных и на этот их шаг.

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

Разумется, на вопросы можно ответить, внимательным чтением документации и экспериментами. Но нужно ли такое счастье, даже опытному программисту?..
Разумеется - нет. Потому что похожий кусок кода можно увидеть везде, но только не в рабочем/реально-действующем веб-приложении.
Кстати, это на _недостаток_ ну никак не тянет. Наоборот - чрезмерный достаток :-).
Недостаток - это к примеру отсутствие анонимных ф-ий - вот тут согласен.

(Reply to this) (Thread)

Re: Часть первая. PHP vs Perl.
[info]nuclight
2006-02-07 07:51 pm UTC (link)
>Честно говоря, уж извини, но на уровне хорошо(Перл)-плохо(ПХП). Если уж мы сравниваем два языка - то будь так полезен упомянуть и про недостатки Perl по сравнению... (а, их нету? ;-))

Плохо читаешь. Это именно разбор глюков PHP, а перл приводится лишь для сравнения. насчет перла я в конце ссылку дал, на "Критический анализ языка Perl" - сходи и удивись, там 200 килобайт разбора. Я об этом, кстати, уже писал: http://www.livejournal.com/users/nuclight/78155.html

>Уже давно и вполне нормально эмулируются через классы. ClassName::Method(); и всё.

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

>_Опытные_ ПХП-программисты хернёй вида "использование глоб. переменных в функциях" не страдают.

Наверное, как раз потому, что их там использовать приходится через жопу :)

>Одни тупоумные включали эту strongly not recommended опцию, а потом разгребали последствия этого, своего тупоумного шага. Мне вот лично пофиг на тупоумных и на этот их шаг.

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

>Разумеется - нет. Потому что похожий кусок кода можно увидеть везде, но только не в рабочем/реально-действующем веб-приложении.

Ой, да ну? Из [2]:
You can't just translate
</pre>$foo[4] = 4; $foo[2] = 2; foreach $element (@foo) { print $element }</pre>
to
$foo[4] = 4; $foo[2] = 2; foreach ($foo as $element) { print $element }
.
The Perl version prints 24, PHP insists on 42. Yes, there is
ksort()
, but that isn't something you can guess. It requires very in-depth knowledge of PHP. And that's the one thing PHP's documentation tries to avoid :)


>Кстати, это на _недостаток_ ну никак не тянет. Наоборот - чрезмерный достаток :-)

Да это полный пиздец, уже за одно такое язык бы надо на помойку выкидывать.

(Reply to this) (Parent)(Thread)

Re: Часть первая. PHP vs Perl. - [info]qusk, 2006-02-08 09:24 am UTC
Re: Часть первая. PHP vs Perl. - [info]nuclight, 2006-02-11 05:59 pm UTC
Re: Часть первая. PHP vs Perl. - [info]muxa_ru, 2006-02-11 06:56 pm UTC
Re: Часть первая. PHP vs Perl. - [info]darkodemon, 2007-06-14 08:51 am UTC
Re: Часть первая. PHP vs Perl. - [info]nuclight, 2007-06-14 11:23 am UTC
Re: Часть первая. PHP vs Perl. - [info]darkodemon, 2007-06-14 01:01 pm UTC
Часть вторая. Пригодность к разработке серьезных прил
[info]qusk
2006-02-05 06:27 am UTC (link)
PHP поощряет смешение разметки страниц и логики приложения, тогда как этого следует всячески избегать.
Посмотри на проблему с другой стороны: становится не нужен шаблонизатор.

Для PHP только недавно (!) начал разрабатываться стандартный framework
Нифига не понял. Как это "стандартный" фреймворк? Концепции фреймворков бывают совсем разные: от design-realisation, продолжаясь MVC, и наконец доходя до монстров event-based (есть и под PHP). Какой из них стал стандартным? (ворчливо: и зачем там стандарты?) И, наконец, самый волнующий вопрос: где он? Ссылку!

большинство авторов сайтов на PHP, похоже, вовсе не слышали ни о том, что такое framwork, ни об MVC-модели.
Ну и что? Это чьи проблемы?

Отсутствует и много других важных для масштабной разработки вещей. Например, для Perl есть DBI - единый интерфейс к базам данных. Для PHP же, чтобы сменить одну СУБД на другую, придется переписать кучу кода. Этим дело не ограничивается - для PHP нет ни хорошего HTML-парсера, ни удобных библиотек работы с WWW или почтовыми MIME-вложениями
Начал за здравие про шаблоны, кончил за упокой про pure-PHP...

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

Сейчас будет часть третия.

(Reply to this) (Thread)

Re: Часть вторая. Пригодность к разработке серьезных пр
[info]nuclight
2006-02-07 07:59 pm UTC (link)
>Посмотри на проблему с другой стороны: становится не нужен шаблонизатор.

Так ты уж определись, выступаешь ты за фреймворки или этот примитивизм

>Какой из них стал стандартным? (ворчливо: и зачем там стандарты?) И, наконец, самый волнующий вопрос: где он? Ссылку!

Стандартный - значит от производителя, "шоб не пропустили". http://www.zend.com/collaboration/framework_overview

>Ну и что? Это чьи проблемы?
>Опять таки не аргумент. Ну вынуждены они - так это их проблемы. Причём тут разработка серьёзных приложений?

Если язык провоцирует ламерство - в жопу такой язык.

>Начал за здравие про шаблоны, кончил за упокой про pure-PHP...

На проблему надо на самом деле смотреть с другой стороны. А с какого хуя объявляется пригодным для веба язык, в котором ничего толком встроенного для этого самого веба нет, и всё равно нужны разнообразные навески, как и в прочих языках? Чем он лучше них тогда, спрашивается, еще и такой кривой низкоуровневой?

(Reply to this) (Parent)(Thread)

Re: Часть вторая. Пригодность к разработке серьезных пр - [info]qusk, 2006-02-08 09:53 am UTC
Re: Часть вторая. Пригодность к разработке серьезных пр - [info]nuclight, 2006-02-11 06:06 pm UTC
Re: Часть вторая. Пригодность к разработке серьезных пр - [info]qusk, 2006-02-08 09:54 am UTC

[info]nekuts
2006-02-05 06:44 am UTC (link)
Бредни "настоящего программиста"(ТМ).

Любому адекватному человеку вообще пофиг на чем писать. Мануалы сейчас вполне приличные к любому языку, и нужная функция находится за секунду. Примера "Hello World" и простейшей документашки достаточно, чтобы написать проект любой сложности.
А "профессиональный PHP-программист" - это как профессиональный пользователь молотка - заколотит гвоздь немного быстрее, не более.

Ненавижу, блядь, программистов.

(Reply to this) (Thread)


[info]qusk
2006-02-05 07:15 am UTC (link)
Любому адекватному человеку вообще пофиг на чем писать
Ну давай: си в руки и вперёд хуярить веб-приложение.

Примера "Hello World" и простейшей документашки достаточно, чтобы написать проект любой сложности.
Ага. А потом появляются продукты деятельности таких альтернативно-одарённых гениев. Засуньте обратно! :-)

(Reply to this) (Parent)(Thread)

(no subject) - [info]nekuts, 2006-02-05 07:50 am UTC
(no subject) - [info]qusk, 2006-02-05 07:58 am UTC
(no subject) - [info]muxa_ru, 2006-02-05 09:13 am UTC
(no subject) - [info]qusk, 2006-02-05 09:28 am UTC
(no subject) - [info]muxa_ru, 2006-02-05 09:39 am UTC
(no subject) - [info]qusk, 2006-02-05 09:45 am UTC
(no subject) - [info]zabivator, 2008-06-13 04:00 pm UTC
(no subject) - [info]jtraub, 2006-02-05 10:55 am UTC
(no subject) - [info]nekuts, 2006-02-05 11:27 am UTC
(no subject) - [info]nuclight, 2006-02-07 07:28 pm UTC
(no subject) - [info]nekuts, 2006-02-07 07:37 pm UTC
(no subject) - [info]nuclight, 2006-02-07 08:09 pm UTC
(no subject) - [info]darkodemon, 2007-06-14 09:05 am UTC
(no subject) - [info]anmiles, 2007-08-13 06:42 am UTC
(no subject) - [info]simple_better, 2009-05-26 06:20 pm UTC

(Reply from suspended user)
Часть третья. Про серьёзные приложения
[info]qusk
2006-02-05 06:58 am UTC (link)
Заключительная часть ;-). Итак, пожертвую некоторым кол-вом своего времени и высскажу своё мнение о последней главе "Пригодность к разработке серьезных приложений", претендующей на вынесение вердикта программированию на PHP.

Эпиграф забавный и во многом правильный. Дело в том, что нормальный программер не переходит куда-либо - он использует те средства которые наиболее целесообразно использовать для решаемых задач. В качестве средств предстают языки/библиотеки/шаблоны/движки и т.д. Переключение на какой-то один из языков (вообще любой) неизбежно ведёт за собой деградацию.

Итак: для решения определённой цели нам нужна какая-то совокупность средств. Не важно сколько их будет. Важно насколько они качественно, быстро решают проблемы, а также их доступность (всё вместе = целесообразность).

С этой точки зрения проблемы ламеров с некорректным использованием ПХП отпадают, просто потому-что мы будем программить по-другому :-). Во-первых учитывая условия и спектр имеющихся средств, во-вторых выбирая эти средства и применяя к ним необходимые парадигмы.

Язык - всего-лишь одно из средств. Программируя какое-то серьёзное веб-приложение мы будем должны или сами программировать каркас/библиотеку (изобретение велосипеда) или выбрать что-либо готовое.

Тогда, в любом случае, при нормальном выборе, у нас не возникают:
1. Смешения разметки страниц и логики приложения
2. Для PHP же, чтобы сменить одну СУБД на другую, придется переписать кучу кода.
И т.д. и т.п. указанные проблемы.

Таким образом, ты уж извини, но глава "Пригодность к разработке серьезных приложений" ничего не показывает. Рандомные мысли и только.

(Reply to this) (Thread)

Re: Часть третья. Про серьёзные приложения
[info]nuclight
2006-02-07 08:05 pm UTC (link)
>Дело в том, что нормальный программер не переходит куда-либо - он использует те средства которые наиболее целесообразно использовать для решаемых задач. В качестве средств предстают языки/библиотеки/шаблоны/движки и т.д.

Ок, допустим. Тогда неясно, в чем целесобразность именно PHP.

>Переключение на какой-то один из языков (вообще любой) неизбежно ведёт за собой деградацию.

Обосновать квантор не затруднит?

>С этой точки зрения проблемы ламеров с некорректным использованием ПХП отпадают, просто потому-что мы будем программить по-другому :-). Во-первых учитывая условия и спектр имеющихся средств, во-вторых выбирая эти средства и применяя к ним необходимые парадигмы.

Ага, героически решим проблемы, которые сами перед собой поставили выборм именно PHP.

>Тогда, в любом случае, при нормальном выборе, у нас не возникают:

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

>Таким образом, ты уж извини, но глава "Пригодность к разработке серьезных приложений" ничего не показывает. Рандомные мысли и только.

А что, все перечисленные проблемы типа не существуют?

(Reply to this) (Parent)(Thread)

Re: Часть третья. Про серьёзные приложения - [info]qusk, 2006-02-08 10:15 am UTC
Re: Часть третья. Про серьёзные приложения - [info]nuclight, 2006-02-11 06:13 pm UTC
По все части разом - [info]qusk, 2006-02-13 04:08 am UTC

[info]muxa_ru
2006-02-05 09:16 am UTC (link)
Например, для Perl есть DBI - единый интерфейс к базам данных. Для PHP же, чтобы сменить одну СУБД на другую, придется переписать кучу кода.

То есть DBI умеет переформатировать специфический постгресовский синтаксис в спцифический мускуловский синтаксис?

(Reply to this) (Thread)


[info]nuclight
2006-02-07 07:21 pm UTC (link)
А шо, он у них в каждом же запросе отличается, да? На стандарт SQL типа все забили?
Не путай "кучу кода" и "часть запросов".

(Reply to this) (Parent)(Thread)

(no subject) - [info]nekuts, 2006-02-07 07:39 pm UTC
(no subject) - [info]nuclight, 2006-02-07 08:07 pm UTC
(no subject) - [info]nekuts, 2006-02-08 04:30 am UTC
(no subject) - [info]muxa_ru, 2006-02-07 08:19 pm UTC
(no subject) - [info]muxa_ru, 2006-02-07 07:56 pm UTC
(no subject) - [info]nuclight, 2006-02-07 08:15 pm UTC
(no subject) - [info]muxa_ru, 2006-02-07 08:58 pm UTC
(no subject) - [info]nuclight, 2006-02-11 05:35 pm UTC
(no subject) - [info]darkodemon, 2007-06-14 09:15 am UTC
(no subject) - [info]felenka, 2006-12-08 03:08 pm UTC

[info]savmaxru
2006-02-05 09:42 am UTC (link)
Perl, PHP... Сравнение сортов дерьма, ИМХО. У меня вообще складывается впечатление, что изначальное позиционирование языка "для Web-программирования" - это диагноз. Языки, позволяющий Web-дизайнерам тоже чувствовать себя программистами. Нет там никаких особых задач, не покрываемях любым скриптовым языком общего назначения (прин наличии соответствующей библиотечной инфраструктуры). Так что для server-side сктриптинга - питон и ниибёт.

(Reply to this) (Thread)


[info]nekuts
2006-02-05 10:34 am UTC (link)
О, еще один "настоящий программист"(ТМ) ;). Пришел с питоном каким-то.

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

И пока "настоящие прогрммисты"(ТМ) обсуждают: что лучше "молоток" или "кувалда", ненастоящие даже над этим не заморачиваются. хехехе

(Reply to this) (Parent)(Thread)

(no subject) - [info]savmaxru, 2006-02-05 10:56 am UTC
(no subject) - [info]nekuts, 2006-02-05 11:18 am UTC
(no subject) - [info]nuclight, 2006-02-07 07:19 pm UTC
(no subject) - [info]savmaxru, 2006-02-07 08:33 pm UTC
(no subject) - [info]ded_flint, 2007-06-05 07:00 am UTC
(no subject) - [info]savmaxru, 2006-02-05 11:14 am UTC
(no subject) - [info]nekuts, 2006-02-05 11:20 am UTC
(no subject) - [info]savmaxru, 2006-02-05 11:27 am UTC

[info]muxa_ru
2006-02-05 10:21 am UTC (link)
У всех этих рассуждений есть только один недостаток.

Пока ты, потан, мау и прочие, рассуждают о том насколько ублюдочен php и на каких языках на самом деле нужно писать сайта, рома на "ублюдочной" пыхе делает www.antigreen.org, а я - www.atheism.ru

(Reply to this) (Thread)


[info]jtraub
2006-02-05 10:39 am UTC (link)
+1

(Reply to this) (Parent)

(no subject) - [info]nuclight, 2006-02-07 08:29 pm UTC
(no subject) - [info]muxa_ru, 2006-02-07 09:19 pm UTC
(no subject) - [info]rebel_web, 2006-03-11 04:51 pm UTC
(no subject) - [info]maserg, 2007-06-22 05:55 pm UTC

[info]jtraub
2006-02-05 10:38 am UTC (link)
Настройки в этом файле едины для всех сайтов, располагающихся на том же сервере. А им может быть требоваться совершенно разная конфигурация. Начиная от того, что кому-то может быть нужен E_NOTICE, а соседа и warning'и не интересует, и заканчивая уже упомянутой опцией register_globals и другой, не менее коварной - magic_quotes_gpc.

Грамотно написанные скрипты должны использовать ini_set
+ .htaccess И все проблемы с регистер_глобалс(который, кстати, по-хорошему должен быть выключеным) и прочих куда-то исчезают :-)

Для PHP же, чтобы сменить одну СУБД на другую, придется переписать кучу кода.
Надо же.. А мужики-то не знают :-)
Вот я пользуюсь ADODB и не ведаю никаких проблем. Странно. Видимо, руки у меня растут не из того места. Да и вообще-то вы немножко неправы. Неправы в том смысле, что Postrge и MySQL используют немного различные диалекты SQL

(Reply to this) (Thread)


[info]nuclight
2006-02-07 07:16 pm UTC (link)
>Грамотно написанные скрипты должны использовать

А PHP ориентируется прежде всего на неграмотных писателей

>Надо же.. А мужики-то не знают :-)

Вот потому и не знают. А что, функции для каждой из БД в языке присутствуют отдельно, вполне закономерно.

>Да и вообще-то вы немножко неправы. Неправы в том смысле, что Postrge и MySQL используют немного различные диалекты SQL

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

(Reply to this) (Parent)(Thread)

(no subject) - [info]bert_msk, 2008-11-16 05:43 pm UTC
(no subject) - [info]nuclight, 2008-11-16 05:55 pm UTC

[info]muxa_ru
2006-02-05 01:10 pm UTC (link)
Ох.... ё.... как же я не заметил то

Как ты назовёшь человека который безапеляционно несёт чушь о том в чём не разбирается ни разу?

    А про особенность проектирования под названием "php.ini" такого сказать уже нельзя. Настройки в этом файле едины для всех сайтов, располагающихся на том же сервере. А им может быть требоваться совершенно разная конфигурация. Начиная от того, что кому-то может быть нужен E_NOTICE, а соседа и warning'и не интересует, и заканчивая уже упомянутой опцией register_globals и другой, не менее коварной - magic_quotes_gpc.


http://ru2.php.net/php_value

А теперь посмотрим хватит ли у тебя честности признать себя ламьём :)

(Reply to this) (Thread)


[info]nuclight
2006-02-07 07:11 pm UTC (link)
Не признаю. Потому что:

1) я вполне честно написал, что это преимущественно перевод и сведение воедино разных статей (а, возвращаясь к тематике, на моем месте обычный не-программист из target audience php скорее всего про это и не подозревает).
2) ты прицепился к одной из многих, причем второстепенных вещей, и без возражений по более серьезным вопросам сразу начинаешь обвинять... флеймер йопта.
3) эта фича всё равно не даёт того fine-grained control, какой хотелось бы (какие настройки в каких именно конфигах разрешены).

Но за нахождение бага благодарю, текст проапдейтил.

(Reply to this) (Parent)(Thread)

(no subject) - [info]muxa_ru, 2006-02-07 08:13 pm UTC
(no subject) - [info]nuclight, 2006-02-07 08:26 pm UTC
(no subject) - [info]muxa_ru, 2006-02-07 09:11 pm UTC
(no subject) - [info]nuclight, 2006-02-11 05:42 pm UTC
(no subject) - [info]muxa_ru, 2006-02-11 06:49 pm UTC
(no subject) - [info]darkodemon, 2007-06-14 09:29 am UTC
(no subject) - [info]nuclight, 2007-06-14 11:19 am UTC
(no subject) - [info]darkodemon, 2007-06-14 01:11 pm UTC
(no subject) - [info]nuclight, 2007-06-14 01:27 pm UTC
(no subject) - [info]darkodemono, 2007-06-14 08:47 pm UTC
(no subject) - [info]nuclight, 2007-06-15 07:56 am UTC
(no subject) - [info]wave_blessed, 2007-07-28 07:37 pm UTC
(no subject) - [info]nuclight, 2007-07-28 07:46 pm UTC
(no subject) - [info]anmiles, 2007-08-13 06:56 am UTC
(no subject) - [info]nuclight, 2007-08-15 04:24 pm UTC

[info]shannar
2006-02-11 11:38 am UTC (link)
Кстати, http://dklab.ru/chicken/nablas/ читал? Там можно найти ещё кое-какую инфу и по Перлу, и по ПХП.

(Reply to this)

Офтоп
[info]shannar
2006-02-13 12:42 pm UTC (link)
Про зелёных и биореактор (поскольку сообщество уже убито): http://zmeuka.livejournal.com/108393.html?style=mine

(Reply to this) (Thread)

Re: Офтоп
[info]victor_zagorski
2007-08-09 08:46 am UTC (link)
+1 ;)

(Reply to this) (Parent)


[info]zerkms
2006-05-23 11:32 am UTC (link)
афтар, низачот

(Reply to this) (Thread)


[info]ectb
2006-05-23 11:50 am UTC (link)
согласен

(Reply to this) (Parent)(Thread)

Обожаю придурков, которые только и могут, что вякнуть б - [info]nuclight, 2006-05-23 12:21 pm UTC
(no subject) - [info]zerkms, 2006-05-23 12:43 pm UTC
(no subject) - [info]nuclight, 2006-05-23 12:52 pm UTC
(no subject) - [info]zerkms, 2006-05-23 01:12 pm UTC
(no subject) - [info]nuclight, 2006-05-23 01:53 pm UTC
(no subject) - [info]zerkms, 2006-05-23 02:03 pm UTC
(no subject) - [info]nuclight, 2006-05-23 02:40 pm UTC
(no subject) - [info]zerkms, 2006-05-23 02:56 pm UTC
(no subject) - [info]nuclight, 2006-05-23 03:19 pm UTC
(no subject) - [info]pento, 2007-01-10 04:47 pm UTC
(no subject) - [info]nuclight, 2007-01-10 04:50 pm UTC
(no subject) - [info]avc, 2007-01-17 10:00 am UTC
(no subject) - [info]nuclight, 2007-01-17 10:30 am UTC
(no subject) - [info]avc, 2007-01-17 10:59 am UTC
(no subject) - [info]darkodemon, 2007-06-14 09:36 am UTC
(no subject) - [info]nuclight, 2007-06-14 11:18 am UTC
(no subject) - [info]darkodemon, 2007-06-14 01:09 pm UTC
(no subject) - [info]nuclight, 2007-06-14 01:14 pm UTC

[info]steel_ice
2006-10-10 10:36 am UTC (link)
а вот не подскажите аналог в перле str_replace?
а то мне понадобилось, а я ничего найти не могу :(
s/// не катит, нужно замена просто подстроки в строке, обязательно без регулярных выражений, т.к. подстроки могут быть любыми. не экранировать же их, право?

(Reply to this) (Thread)


[info]nuclight
2006-10-11 05:03 pm UTC (link)
А почему, собственно, не экранировать? Работает же:

$where =~ s/\Q$findstr/\Q$replacestr/g

(Reply to this) (Parent)(Thread)

(no subject) - [info]darkodemon, 2007-06-14 09:38 am UTC
(no subject) - [info]romy4, 2008-01-23 03:37 pm UTC
(no subject) - [info]nuclight, 2008-01-23 05:01 pm UTC
Добавление к пунтку 1
[info]ospf_ripe
2006-10-18 02:13 pm UTC (link)
Сегодня в web-developers обсуждался такой вопрос - как получить errno в случае неудачного завершения mkdir(). Как оказалось в php этого сделать нельзя. Можно получить текст ошибки в $php_errormsg но это не то, что нужно.

С передачей errno вообще разнобой.

В некоторых функциях, таких как mkdir его нельзя узнать совсем. Некоторые (например stat) указывают errno в тексте ошибки и можно распарсить $php_errormsg, чтобы узнать errno (только при переезде на новую версию все может сломаться т. к. формат текста ошибки может измениться).

В некоторых функциях (например fsockopen) можно указать переменную, в которой будет возвращено errno.

(Reply to this) (Thread)

Re: Добавление к пунтку 1
[info]darkodemon
2007-06-14 09:43 am UTC (link)
ну, по большому счёту, какая разница (именно скрипту) почему не была создана директория? ;-)

(Reply to this) (Parent)


[info]felenka
2006-12-08 03:04 pm UTC (link)
Неточности:

Если вы не импортируете внутрь функции, к примеру, переменную $HTTP_USER_AGENT, взятую от web-сервера, то PHP вам и не даст к ней доступ

$_SERVER['HTTP_USER_AGENT'];

(суперглобалы доступны с пхп 4.1.0)

В PHP нет анонимных фукнций.

http://ru.php.net/manual/en/function.create-function.php

string create_function ( string args, string code )

Creates an anonymous function from the parameters passed, and returns a unique name for it.

$foo = bar() || $baz

Вы можете написать в пхп в "Perl-style"

$foo = bar() or $baz;


Массивы в PHP не разворачиваются в строку, как в перле

Навскидку:

$str = join("", $arr);

Или вот Вам более интеллектуальный вариант:

http://ru.php.net/manual/en/function.array-reduce.php

Iteratively reduce the array to a single value using a callback function


(Reply to this) (Thread)


[info]nuclight
2006-12-08 03:47 pm UTC (link)
>(суперглобалы доступны с пхп 4.1.0)

Да, даже термин новый пришлось вылепить - суперглобалы...

>Creates an anonymous function from the parameters passed, and returns a unique name for it.

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

>$foo = bar() or $baz;

"(если вы считаете, что эквивалентным выражением будет $foo = bar() ? bar() : $baz;, подумайте о функции bar() как об исполняющейся 10 секунд и имеющей сторонние эффекты вроде инкремента счетчика)." - цитата сразу же следом.
В perl, кстати, имеются две операции - || и or, причем с разным приоритетом.

>$str = join("", $arr);

Опять-таки эмуляция, а не прямое решение. А с reduce это вообще callback-функцию написать придется.

(Reply to this) (Parent)(Thread)

(no subject) - [info]darkodemon, 2007-06-14 09:49 am UTC
(no subject) - [info]nuclight, 2007-06-14 12:09 pm UTC
(no subject) - [info]darkodemon, 2007-06-14 01:14 pm UTC
(no subject) - [info]nuclight, 2007-06-14 02:02 pm UTC
(no subject) - [info]darkodemono, 2007-06-14 08:45 pm UTC
(no subject) - [info]nuclight, 2007-06-15 08:22 am UTC
(no subject) - [info]nuclight, 2007-06-15 09:01 am UTC

[info]felenka
2006-12-08 03:06 pm UTC (link)
А про особенность проектирования под названием "php.ini" такого сказать уже нельзя. Настройки в этом файле едины для всех сайтов, располагающихся на том же сервере. А им может быть требоваться совершенно разная конфигурация

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

(Reply to this) (Thread)


[info]nuclight
2006-12-08 03:42 pm UTC (link)
И в конфигурации виртуалхоста можно регулировать. И что? _Все_ настройки - там не поменять.

(Reply to this) (Parent)

Эхехех...
[info]glebofff
2007-01-11 05:02 am UTC (link)
Как же это я не забрёл сюда раньше? :-) Nuclight, браво! Ссылка под номером [1] у меня в закладках уже довольно давно, и на #php время от времени я её "закидываю". ;-) Твой пост, как квинтэссенция [1], отличается тем, что он на русском языке. И программистам от php (языка с низким порогом вхождения, в отличие от того же английского) он, конечно, даётся легче. Думаю, тебя заинтересует ещё и эта статья:

http://dmst.aueb.gr/dds/pubs/conf/2002-SANE-DynCont/html/dyncont.html

Собственно, я и хотел написать о "хорошо забытой и старой" технологии FastCGI.

В случае с Perl (FCGI, FCGI::ProcManager) или C (FastCGI Development Kit) реальностью становятся такие явления, как многопоточные (или "многопроцессовые") приложения, со своим распределением нагрузки, памяти, с пулами подключений к БД, etc.

Разработчики PHP, видимо, не могли пройти мимо такой прелести, но, внедряя поддержку FCGI в своё детище, дискредитировали всю идею на корню. Полноценное FastCGI приложение (или сервер) на PHP не напишешь. PHP-интерпретатор сам выступает в качестве этого сервера. Выгод по сравнению с mod_php - абсолютный ноль, и, видимо, работа в zend велась просто "для галочки".

qusk> Ну давай: си в руки и вперёд хуярить веб-приложение.
Когда возьмёшь си в руки (а лучше - в голову, через руки дольше будет доходить) и хотя бы начнёшь хуярить веб-приложение, возможно и поймёшь, что монстр, выращенный в подвалах zend - просто прокладка между тобой и системными вызовами, а также сишными библиотеками (gd, libpq, libmysql, libxslt, libxml2, etc).

zerkms> афтар, низачот
zerkms> честное слово доказывать вам что-либо желания нет, и аргументировать тоже

Позор, zerkms, позор! :-(

(Reply to this) (Thread)

Re: Эхехех...
[info]nuclight
2007-01-11 08:19 am UTC (link)
>и на #php время от времени я её "закидываю".

А толку. Им и моё закидывали, ответ - "nuclight мудак", без аргументов :)

За ссылку благодарю. Насчет FCGI - в принципе, mod_perl к нему приближается. У fcgi в чем недостаток - ебанутый протокол :) Аналог у mod_lisp куда проще, например. Ну и многократное копирование данных в ядро и обратно (из одного tcp-соединения в другое), впрочем, это неустранимо почти всегда.

>Выгод по сравнению с mod_php - абсолютный ноль, и, видимо, работа в zend велась просто "для галочки".

Ну почему, в схеме нагруженного сервера "nginx + apache + mod_php" vs "nginx + php-fcgi" выгода ощутима.

(Reply to this) (Parent)(Thread)

Re: Эхехех... - [info]glebofff, 2007-01-11 10:58 am UTC

[info]alex_executer
2007-01-11 09:46 pm UTC (link)
touch
(PHP 3, PHP 4, PHP 5)

touch -- Sets access and modification time of file

Wtf?

(Reply to this) (Thread)


[info]nuclight
2007-01-12 05:14 am UTC (link)
Какое слово перевести? (с)

(Reply to this) (Parent)(Thread)

(no subject) - [info]darkodemon, 2007-06-14 09:54 am UTC
(no subject) - [info]nuclight, 2007-06-14 11:10 am UTC
(no subject) - [info]darkodemon, 2007-06-14 01:06 pm UTC
(no subject) - [info]nuclight, 2007-06-14 01:20 pm UTC
(no subject) - [info]darkodemon, 2007-06-14 07:25 pm UTC
(no subject) - [info]nuclight, 2007-06-14 07:32 pm UTC
(no subject) - [info]darkodemono, 2007-06-14 08:46 pm UTC
(no subject) - [info]ospf_ripe, 2007-06-15 05:41 am UTC
(no subject) - [info]darkodemon, 2007-06-14 07:26 pm UTC
(no subject) - [info]pereresus_buggy, 2008-11-14 09:28 pm UTC

[info]avc
2007-01-17 09:57 am UTC (link)
То, что php довольно ущербный ясно и так - достаточно начать на нём писать (однако-ж это не в малой степени дело вкуса, который как известно у всех разный) =)

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

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

(Reply to this) (Thread)


[info]nuclight
2007-01-17 11:12 am UTC (link)
>Язык может быть хорош или плох только в каком-либо приложении - набором возможностей, производительностью, выбором средств разработки-отладки.

Это лишь полуправда. Стоит немного подумать, становится понятно, что язык применим/неприменим уже для целых классов задач. Можно привлекать и еще факторы и обобщать дальше.

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

Трудности в разработке для приложений большого размера.

(Reply to this) (Parent)(Thread)

(no subject) - [info]avc, 2007-01-17 11:23 am UTC
(no subject) - [info]nuclight, 2007-01-17 11:42 am UTC
(no subject) - [info]avc, 2007-01-17 12:02 pm UTC
(no subject) - [info]nuclight, 2007-01-17 01:19 pm UTC
(no subject) - [info]avc, 2007-01-17 01:47 pm UTC
Выдержка по еще одной "причудливой" функции
[info]nuclight
2007-03-06 10:05 pm UTC (link)
<iATlevsha> nuclight: еще одну монетку в копилку долбанутости языка php хочешь? Функция ip2long переваривает адреса типа 10.0.256 (для неё он равен 10.0.1.0), а если ей скормить ну совсем уж кривой адрес то функция возвращает не значение, приводимое к false, а -1
<Lazy> iATlevsha, это by design или просто бага?
<iATlevsha> Lazy: а кто их, странных зверьков, знает
<iATlevsha> в результате на сайте с документацией по php в коментариях лежат примеры проверки ip адреса на валидность в стиле if( long2ip(ip2long($ip)) == $ip )
<Lazy> iATlevsha, впрочем, вряд ли by design. Я далёк от мысли считать php идеалом, но вряд ли кривое поведение данной функции следует считать доказательством долбанутости :)
<Lazy> iATlevsha, а что, такой пример не будет работать? imho будет, даром что ip2long кривая.
<iATlevsha> Lazy: его можно считать как минимум доказательством безсистемности в разработке языка
<Grrrr> долбанутости, долбанутости
<iATlevsha> Lazy: ну, пример с поверкой на true как val.as_strintg.lengh < 5 тоже будет работать ;)
<Lazy> iATlevsha, и это нет. Это ведь функция того же сорта что и sin() или cos(), т.ч. всё же нет.
<Lazy> iATlevsha, val.as_strintg.lengh - это я не знаю что такое :)
<iATlevsha> Lazy: если исправить очепятки то получится пример, который когда-то гулял по инету :)
<iATlevsha> Lazy: с какого бодуна функция ip2long вдруг становится функцией того же сорта, что и sin/cos , я не понял
<Lazy> Grrrr, долбанутость языка и неправильная работа конкретной функции я бы не сказал что сильно коррелируют =)
<Lazy> iATlevsha, с такого, что она не содержит ничего специфичного для php.
<Grrrr> Lazy: да, но их там тысячи, и многие имеют закидоны в том же духе
<Lazy> Grrrr, а как с перлом в этом смысле дела обстоят?
<iATlevsha> Lazy: вот только не каждая сторка является допустимым аргументом для функции ip2long .
<Grrrr> Lazy: в смысле?
<iATlevsha> Lazy: функция пусть и не специфичная для php, а вот реализация её для php специфычна
<Lazy> iATlevsha, не понял.
<Lazy> Grrrr, в смысле баговости функций
<Grrrr> Lazy: стандартные функции таких закидонов не имеют
<iATlevsha> Lazy: "10.0.256" не является допустимым аргументом для функции ip2long, а она его хавает как ни в чём не бывало. Ну допустим это бага реализации, но возврат -1 описан в докумантации

(Reply to this) (Thread)

Re: Выдержка по еще одной "причудливой" функции
[info]egorkin
2007-03-26 11:21 am UTC (link)
Самое забавное, что я в свою бытность столкнулся с необходимостью операций над ip адресами, проверки принадлежности сетям и т.п.
Я написал свои функции по аналогии с реализацией в CPAN.

Хз насчет серьезных разработок, т.к. я не программист а системный администратор и пользую PHP исключительно под заказы начальства на временные сайтики с 3-4 разделами по типу "новости" "контакты" "архив ссылок" и прочую ботву. Ну еще допустим, что я с недавних пор начал работать с DOM и отделяю логику от представления при помощи XML + XSLT. По мне, так вполне приятно и удобно.
Для этих задач языка вполне достаточно и код получается удобоваримым и безопасным, учитывая собственные wrapper-ы того же взаимодействия с СУБД и собственным обработчиком ошибок.
Т.к. у меня есть готовый набор классов для реализации всего описанного и мне остается только выстроить в таблице дерево иерархии разделов да поменять id вызовов в обработчике событий, дело занимает неболее получаса. дольше для меня, скажем-таки человека не очень способного в этом деле - рисовка всяких дизайнов и css.
Вообще - говно вы возите, уважаемый. Ну покричите вы о том, что пхп - говно, а все кто на нем пишет - ламерье и неудачники, его же не прекратят пользовать, обновлять и продвигать в массы.
Ну плюньте да забейте, пишите свои проекты на том, что у вас ближе к душе лежит.
Я не понимаю этой любви обосрать нечто, вызывающее у вас личную неприязнь.

(Reply to this) (Parent)(Thread)

Re: Выдержка по еще одной "причудливой" функции - [info]nuclight, 2007-03-26 11:47 am UTC
Re: Выдержка по еще одной "причудливой" функции - [info]andrewstephanof, 2007-04-20 09:43 pm UTC
Re: Выдержка по еще одной "причудливой" функции - [info]nuclight, 2007-04-20 09:57 pm UTC
Re: Выдержка по еще одной "причудливой" функции - [info]darkodemon, 2007-06-14 10:11 am UTC
ебаныйе пидарасы!
[info]perlhuinya
2007-03-29 07:42 am UTC (link)
идите вы все нахуй БЛЯТЬ, на хую я вертел ваши диаграмки и выписки - де какие функции и насколько ахуеннее сделаны, ипал я в рот ваш трёп - "че лучше а че хуже", и перл ваш хуйня и никак это не исправить, его ипучий нах синтаксис никаму нахуй ни нужен, патаму што ПЕРЛ ХУЙНЯ! скоро сдохнет и вы пидарасы злаипучие, любители папистеть, а не делам занимаца, останитесь без темы для трёпа, а ПХП буит всех ипать, патамушто прастой и бе выипонов изык!!!

(Reply to this) (Thread)

Re: ебаныйе пидарасы!
[info]me_nz
2007-05-10 01:39 pm UTC (link)
вот из-за таких как ты и началась война...

(Reply to this) (Parent)(Thread)

Re: ебаныйе пидарасы! - [info]darkodemon, 2007-06-14 10:13 am UTC
Re: ебаныйе пидарасы! - [info]axshavan, 2007-09-03 02:42 am UTC
Integers in PHP, running with scissors, and portability
[info]ospf_ripe
2007-04-08 08:29 am UTC (link)
http://www.mysqlperformanceblog.com/2007/03/27/integers-in-php-running-with-scissors-and-portability/
(via [info]mithraen)

(Reply to this)


[info]zerg85
2007-05-11 12:17 pm UTC (link)
В мемориз!!
Спасибо!

(Reply to this)


[info]rusbreathless
2007-06-05 08:39 am UTC (link)
Бред.
За "ублюдошность" я бы вам въебал.

(Reply to this) (Thread)


[info]nuclight
2007-06-05 12:13 pm UTC (link)
О. Судя по полному отсутствию аргументов и выражениями, свидетельствующими, что кисо явно примерило на себя и абиделось, перед нами похапэ-быдлокодер, номер очередной. Ну так и что мешает въебать, собсно?

(Reply to this) (Parent)(Thread)

(no subject) - [info]rusbreathless, 2007-06-06 07:11 am UTC
(no subject) - [info]nuclight, 2007-06-06 07:49 am UTC
(no subject) - [info]rusbreathless, 2007-06-06 08:11 am UTC
(no subject) - [info]nuclight, 2007-06-06 08:30 am UTC
(no subject) - [info]rusbreathless, 2007-06-06 08:37 am UTC
(no subject) - [info]nuclight, 2007-06-06 08:45 am UTC
(no subject) - [info]rusbreathless, 2007-06-06 08:46 am UTC
Вопрос
[info]dkrig
2007-06-05 07:08 pm UTC (link)
Скажите что есть "lexical scoping и dynamic scoping" (можно и в гугле посмотреть, но хочется в общих чертах и на пальцах).

(Reply to this) (Thread)

Re: Вопрос
[info]nuclight
2007-06-06 01:24 pm UTC (link)
Речь идет об областях видимости переменных. Для лексических переменных области видимости (и перекрытия одноименных переменных из "наружных" блоков) определяются исключительно исходным текстом программы, так, как оно написано (потому и "лексические") - и позволяет делать трюки вроде замыканий (closures). Для динамических же оно зависит от порядка вызова блоков, то есть определяется в процессе выполнения программы.

Более подробно на примере Perl (там динамическими, хотя сам термин не употребляется, являются local) см. http://perl.plover.com/FAQs/Namespaces.html, а на примере Lisp см. http://www.gigamonkeys.com/book/variables.html

(Reply to this) (Parent)(Thread)

Re: Вопрос - [info]dkrig, 2007-06-06 02:17 pm UTC
Re: Вопрос - [info]nuclight, 2007-06-06 02:28 pm UTC
Re: Вопрос - [info]dkrig, 2007-06-06 02:50 pm UTC
Re: Вопрос - [info]nuclight, 2007-06-06 02:58 pm UTC
Re: Вопрос - [info]dkrig, 2007-06-06 03:33 pm UTC
Re: Вопрос - [info]nuclight, 2007-06-07 05:25 am UTC
Re: Вопрос - [info]darkodemon, 2007-06-14 10:17 am UTC

Page 1 of 2
<<[1] [2] >>

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…