Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

PHP 5.3: что нового

На «Хабре» хорошая обзорная статья рассказывающая о том, что нового в PHP 5.3.

P.S. почему к любой статье по PHP обязательно появится коментарий с полной пургой, а?

41 комментарий
decil.livejournal.com 2009

P.S. почему к любой статье по PHP обязательно появится коментарий с полной пургой, а?

Потому что это хабралюди, питаемые хабрасилой.

Про лейблы, кстати, для меня тоже осталось загадкой.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для decil.livejournal.com:

Ну а что такого? В Си есть, в Perl есть, почему бы в PHP ему не быть? Я даже знаю случаи, когда бы я использовал goto.

david-m.livejournal.com 2009

Комментарий для Евгения Степанищева:

О! Ну хоть кто-то такие случаи знает:)

Очень было бы интересно узнать. Только не «поточные парсеры», ради бога.

astur (astur.net.ru) 2009

про «PS»:
есть люди, которые не знают пхп, но знают, что нужно сказать с умным видом, чтобы произвести впечатление на себе подобных. Их не волнует, что реальные спецы над ними смеются, реальных спецов мало.
Справиться с этим явлением, имхо, невозможно. Можно только натренировать в голове отдельный фильтр сигнал/шум.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для david-m.livejournal.com:

Да не. Ну, например.

if (A) {
foo();
goto OUT;
}

if (B) {
bar();
goto OUT;
}

otherwise();
OUT:

щас я делаю это через for :)

Евгений Степанищев (bolknote.ru) 2009

Комментарий для astur.net.ru:

Ну вот как-то в статьях по Python этого всего меньше. Хотя язык-то тоже очень простой.

david-m.livejournal.com 2009

Комментарий для Евгения Степанищева:

Э… я, может, не так понял глобальную идею, но разве это не:

if (A) foo();
elseif (B) bar();
else otherwise();

?

astur (astur.net.ru) 2009

Комментарий для Евгения Степанищева:

Вообще, простота языка — это не показатель, культура сообщества тоже имеет значение. Python-программеры воспитаны не на клепании сайтов на радость тупым заказчикам, а на скриптовании серьёзных десктопных приложений и плагинов к ним, поэтому их статьи — это не винегрет из понтов и заготовок кода, а вдумчивый анализ проблем разработки. Вспомни, кто ещё в начале века был королём запросов типа «Шаблоны на PHP для чайников», а кто сейчас лидирует по запросам типа «выбор хостинга для django»? Просто сравни этих людей, как невольных воспитателей сообществ (благо, ты знаком с обоими). Спецы получают то сообщество, которое воспитывают, вот и всё.

Alisey (alisey.myopenid.com) 2009

Комментарий для david-m.livejournal.com:

for ($i=1; $i-​-​;) {
    $foo = make_me_foo();
    if (!$foo) break;

    $bar = bar_from_foo($foo);
    if (!$bar) break;

    ...
}

Евгений Степанищев (bolknote.ru) 2009

Комментарий для david-m.livejournal.com:

Неправильно написал. В два часа ночи-то :)

if (A) {
foo();
goto MORE;
}
if (B) {
bar();
goto MORE;
}

goto OUT;
MORE:
somethingelse();
OUT:

voldmar (voldmar.ru) 2009

Комментарий для Евгения Степанищева:

Это всё можно и без GOTO сделать. А вот что с ним удобно делать, так это выход из вложенных циклов.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для voldmar.ru:

Я это сейчас делаю for’ом, как я уже написал.

Выход из вложенных циклов можно делать через break. Например, «break 2» — выход на две конструкции наверх.

hshhhhh.name 2009

Комментарий для Евгения Степанищева:

Выход из вложенных циклов можно делать через break. Например, «break 2»

Мануал надо читать внимательно. Спасибо :), я через триггер это делал.

anton-ikonnikov.moikrug.ru 2009

Комментарий для Евгения Степанищева:

А не проще somethingelse(); вместо goto MORE; написать в этом случае?

david-m.livejournal.com 2009

Комментарий для Евгения Степанищева:

$found_something = true;

if (A) foo();
elseif (B) bar();
else $found_something = false;

if ($found_something) somethingelse();

Я согласен, что переменные-флаги — это моветон, но уж точно не больший моветон, чем goto. А читаемость логики, нмв, выше.

Ну и чисто для приколоться:
if ( A and foo() or B and bar() ) somethingelse();

Евгений Степанищев (bolknote.ru) 2009

Комментарий для david-m.livejournal.com:

Последнее пройдёт, если там действительно функции foo и bar, обычно там логики побольше.

Флаги — хороший выход, многие так и делают :) Никакого изврата тут нет и я это не считаю моветоном, но я извращаюсь через for :)

zencd.livejournal.com 2009

Потому что в микробиологии и астрофизике разбираются немногие, зато в кино и PHP — все. Отсюда и качество комментариев — они более заметны и обладают бОльшим диапазоном разброса качества.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для anton-ikonnikov.moikrug.ru:

Не надо так серьёзно псевдокод анализировать. В этом блоке дофига кода.

decil.livejournal.com 2009

Эм, я бы сделал
if ($a || $b) {
  if ($a)
     foo();
  if ($b)
     bar();

  somethingelse();
}

Косовато, да, но всяко лучше goto и циклов.
Или я чего—то не понял?

decil.livejournal.com 2009

То есть да, даж в ядре у Линуса порядочно goto, но там есть свои причины для этого.
Лично я за последние 10 лет не испытывал необходимости (и более того, даже желания) использовать метки.

Проблема даже не в появлении меток, как таковых, а в том, что молодняк, ринувшийся «праграмить сайты» начнет их использовать без разбору, как это было с бэйсиком.

decil.livejournal.com 2009

if ($b) читать как elseif ($b) :)))

Евгений Степанищев (bolknote.ru) 2009

Комментарий для decil.livejournal.com:

А чем оно лучше? Циклом мне кажется читаемее. Кроме того, нет проверки одного и того же, да и $b не вычисляется где не надо.

anton-ikonnikov.moikrug.ru 2009

Комментарий для Евгения Степанищева:

«В этом блоке дофига кода»

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

В приведенной конструкции смущает же не goto MORE;, а goto OUT;

Евгений Степанищев (bolknote.ru) 2009

Комментарий для anton-ikonnikov.moikrug.ru:

Можно :)

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

Sas (ugh.ru) 2009

Комментарий для decil.livejournal.com:

Какой ужос.... :)

if &&  !foo( || ($b && !bar()) somethingelse();

Sas (ugh.ru) 2009

Комментарий для ugh.ru:

Ой, проворонил. Нечто подобное уже было, тока помоему нерабочее.... :)

Евгений Степанищев (bolknote.ru) 2009

Комментарий для ugh.ru:

Я ж говорю — не надо так на псевдокод орентироваться. Ну представьте, что вместо foo() стоит unset($smth);, вместо bar() — fclose($fp); $result = sin($a);

Sas (ugh.ru) 2009

Комментарий для Евгения Степанищева:

падумаешь... ну вместо короткой !foo() будет чуть длинее (foo() || 1) ...

masterspammer.livejournal.com 2009

ой, ёёё!!! Помню как с break N столкнулся... До сих пор не понимаю, ЗАЧЕМ так сделано, а не break LABEL?

Евгений Степанищев (bolknote.ru) 2009

Комментарий для ugh.ru:

А стоило подумать. unset не функция, её нельзя применять внутри if.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для masterspammer.livejournal.com:

Проще. Кроме того, break LABEL == goto LABEL

masterspammer.livejournal.com 2009

Комментарий для Евгения Степанищева:

Проще... А потом удаление цикла вынуждало менять break во вложенном цикле, что вообще-то достаточно неочевидно. Учитывая, что реально break как и goto ОЧЕНЬ полезен при большом количестве вложенных циклов — как раз в этом случае будет максимальный геморрой.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для masterspammer.livejournal.com:

Проще в реализации, я имею ввиду.

masterspammer.livejournal.com 2009

Комментарий для Евгения Степанищева:

Это да, но не в применении.

baka.name 2009

А потом удаление цикла вынуждало менять break во вложенном цикле, что вообще-то достаточно неочевидно.

В Perl оно мне больше нравится — блок (цикл) можно пометить меткой, а потом где-то внутри — сказать «last эта_метка» — независимо от уровня вложенности.

masterspammer.livejournal.com 2009

Комментарий для baka.name:

Вот как-то так, да, оно удобнее — при удалении цикла программа должна стать СИНТАКСИЧЕСКИ неверной, а не изменить своё поведение. После перла __такое__ исполнение казалось чем-то варварским, похожим на номера строк.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для masterspammer.livejournal.com:

Ну, Perl, всё-таки, не образец для подражания, хотя там есть множество интересных вещей. С рассуждениями про break LABEL я согласен.

hshhhhh.name 2009

Комментарий для Евгения Степанищева:

Ну а что такого? В Си есть, в Perl есть, почему бы в PHP ему не быть? Я даже знаю случаи, когда бы я использовал goto.

http://bolknote.ru/all/1655#25

he-he

Евгений Степанищев (bolknote.ru) 2009

Комментарий для hshhhhh.name:

В чём прикол? В том, что я поменял своё мнение? Мне кажется, что сверхнормально.

shmatrix.livejournal.com 2009

P.S. почему к любой статье по PHP обязательно появится коментарий с полной пургой, а?

Потому что PHP — язык с убийственно кривым дизайном: только глобальные функции, только глобальные классы, нет ссылок на функции.

Поэтому его и поносят.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для shmatrix.livejournal.com:

Я не говорю о том, что его поносят, я говорю о низком уровне тех, кто комментирует эти статьи.

Даже с таким дизайном можно нормально жить. Функции глобальны? Используем статические методы внутри класса, который служит package’м, нет ссылок на функции? Используем ссылки на классы.