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

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

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

Комментарии 41

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

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

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

Евгений Степанищев (bolknote.ru) автор № 2
Ну а что такого? В Си есть, в Perl есть, почему бы в PHP ему не быть? Я даже знаю случаи, когда бы я использовал goto.
david-m.livejournal.com № 3
О! Ну хоть кто-то такие случаи знает:)

Очень было бы интересно узнать. Только не «поточные парсеры», ради бога.
Евгений Степанищев (bolknote.ru) автор № 5
Да не. Ну, например.

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

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

otherwise();
OUT:

щас я делаю это через for :)
astur (astur.net.ru) № 4
про «PS»:
есть люди, которые не знают пхп, но знают, что нужно сказать с умным видом, чтобы произвести впечатление на себе подобных. Их не волнует, что реальные спецы над ними смеются, реальных спецов мало.
Справиться с этим явлением, имхо, невозможно. Можно только натренировать в голове отдельный фильтр сигнал/шум.
Евгений Степанищев (bolknote.ru) автор № 6
Ну вот как-то в статьях по Python этого всего меньше. Хотя язык-то тоже очень простой.
david-m.livejournal.com № 7
Комментарий для Евгения Степанищева:

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

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

?
astur (astur.net.ru) № 8
Комментарий для Евгения Степанищева:

Вообще, простота языка — это не показатель, культура сообщества тоже имеет значение. Python-программеры воспитаны не на клепании сайтов на радость тупым заказчикам, а на скриптовании серьёзных десктопных приложений и плагинов к ним, поэтому их статьи — это не винегрет из понтов и заготовок кода, а вдумчивый анализ проблем разработки. Вспомни, кто ещё в начале века был королём запросов типа «Шаблоны на PHP для чайников», а кто сейчас лидирует по запросам типа «выбор хостинга для django»? Просто сравни этих людей, как невольных воспитателей сообществ (благо, ты знаком с обоими). Спецы получают то сообщество, которое воспитывают, вот и всё.
Alisey (alisey.myopenid.com) № 9
Комментарий для 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) автор № 10
Комментарий для david-m.livejournal.com:

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

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

goto OUT;
MORE:
somethingelse();
OUT:
voldmar (voldmar.ru) № 11
Комментарий для Евгения Степанищева:

Это всё можно и без GOTO сделать. А вот что с ним удобно делать, так это выход из вложенных циклов.
Евгений Степанищев (bolknote.ru) автор № 12
Я это сейчас делаю for'ом, как я уже написал.

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

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

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

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

anton-ikonnikov.moikrug.ru № 14
Комментарий для Евгения Степанищева:

А не проще somethingelse(); вместо goto MORE; написать в этом случае?
Евгений Степанищев (bolknote.ru) автор № 18
Не надо так серьёзно псевдокод анализировать. В этом блоке дофига кода.
david-m.livejournal.com № 15
Комментарий для Евгения Степанищева:

$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) автор № 16
Комментарий для david-m.livejournal.com:

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

Флаги — хороший выход, многие так и делают :) Никакого изврата тут нет и я это не считаю моветоном, но я извращаюсь через for :)
zencd.livejournal.com № 17
Потому что в микробиологии и астрофизике разбираются немногие, зато в кино и PHP — все. Отсюда и качество комментариев — они более заметны и обладают бОльшим диапазоном разброса качества.
decil.livejournal.com № 19
Эм, я бы сделал
if ($a || $b) {
if ($a)
foo();
if ($b)
bar();

somethingelse();
}

Косовато, да, но всяко лучше goto и циклов.
Или я чего–то не понял?
decil.livejournal.com № 20
То есть да, даж в ядре у Линуса порядочно goto, но там есть свои причины для этого.
Лично я за последние 10 лет не испытывал необходимости (и более того, даже желания) использовать метки.

Проблема даже не в появлении меток, как таковых, а в том, что молодняк, ринувшийся «праграмить сайты» начнет их использовать без разбору, как это было с бэйсиком.
Евгений Степанищев (bolknote.ru) автор № 22
Комментарий для decil.livejournal.com:

А чем оно лучше? Циклом мне кажется читаемее. Кроме того, нет проверки одного и того же, да и $b не вычисляется где не надо.
anton-ikonnikov.moikrug.ru № 23
Комментарий для Евгения Степанищева:

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

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

В приведенной конструкции смущает же не goto MORE;, а goto OUT;
Евгений Степанищев (bolknote.ru) автор № 24
Комментарий для anton-ikonnikov.moikrug.ru:

Можно :)

Я использую эту конструкцию именно для того, чтобы не уносить ничего в отдельную функцию.
Евгений Степанищев (bolknote.ru) автор № 27
Комментарий для ugh.ru:

Я ж говорю — не надо так на псевдокод орентироваться. Ну представьте, что вместо foo() стоит unset($smth);, вместо bar() — fclose($fp); $result = sin($a);
Sas (ugh.ru) № 28
Комментарий для Евгения Степанищева:

падумаешь… ну вместо короткой !foo() будет чуть длинее (foo() || 1) …
masterspammer.livejournal.com № 29
ой, ёёё!!! Помню как с break N столкнулся… До сих пор не понимаю, ЗАЧЕМ так сделано, а не break LABEL?
Евгений Степанищев (bolknote.ru) автор № 30
Комментарий для ugh.ru:

А стоило подумать. unset не функция, её нельзя применять внутри if.
masterspammer.livejournal.com № 32
Комментарий для Евгения Степанищева:

Проще… А потом удаление цикла вынуждало менять break во вложенном цикле, что вообще-то достаточно неочевидно. Учитывая, что реально break как и goto ОЧЕНЬ полезен при большом количестве вложенных циклов — как раз в этом случае будет максимальный геморрой.
Евгений Степанищев (bolknote.ru) автор № 33
Комментарий для masterspammer.livejournal.com:

Проще в реализации, я имею ввиду.
masterspammer.livejournal.com № 34
Комментарий для Евгения Степанищева:

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

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

masterspammer.livejournal.com № 36
Вот как-то так, да, оно удобнее — при удалении цикла программа должна стать СИНТАКСИЧЕСКИ неверной, а не изменить своё поведение. После перла __такое__ исполнение казалось чем-то варварским, похожим на номера строк.
Евгений Степанищев (bolknote.ru) автор № 37
Комментарий для masterspammer.livejournal.com:

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

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

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

/all/1655#25

he-he

Евгений Степанищев (bolknote.ru) автор № 39
Комментарий для hshhhhh.name:

В чём прикол? В том, что я поменял своё мнение? Мне кажется, что сверхнормально.
shmatrix.livejournal.com № 40
P.S. почему к любой статье по PHP обязательно появится коментарий с полной пургой, а?

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

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

Евгений Степанищев (bolknote.ru) автор № 41
Я не говорю о том, что его поносят, я говорю о низком уровне тех, кто комментирует эти статьи.

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