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

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

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

decil.livejournal.com (decil.livejournal.com)
19 мая 2009, 00:52

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

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

bolk (bolknote.ru)
19 мая 2009, 01:07, ответ предназначен decil.livejournal.com:

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

david-m.livejournal.com (david-m.livejournal.com)
19 мая 2009, 01:13, ответ предназначен bolk (bolknote.ru):

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

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

astur (astur.net.ru)
19 мая 2009, 01:39

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

bolk (bolknote.ru)
19 мая 2009, 01:43, ответ предназначен david-m.livejournal.com:

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

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

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

otherwise();
OUT:

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

bolk (bolknote.ru)
19 мая 2009, 01:43, ответ предназначен astur (astur.net.ru):

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

david-m.livejournal.com (david-m.livejournal.com)
19 мая 2009, 02:12, ответ предназначен bolk (bolknote.ru):

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

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

?

astur (astur.net.ru)
19 мая 2009, 02:40, ответ предназначен bolk (bolknote.ru):

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

Alisey (alisey.myopenid.com)
19 мая 2009, 09:49, ответ предназначен david-m.livejournal.com:

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

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

    ...
}

bolk (bolknote.ru)
19 мая 2009, 10:34, ответ предназначен david-m.livejournal.com:

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

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

goto OUT;
MORE:
somethingelse();
OUT:

voldmar (voldmar.ru)
19 мая 2009, 10:43, ответ предназначен bolk (bolknote.ru):

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

bolk (bolknote.ru)
19 мая 2009, 11:10, ответ предназначен voldmar (voldmar.ru):

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

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

hshhhhh.name (hshhhhh.name)
19 мая 2009, 11:39, ответ предназначен bolk (bolknote.ru):

Выход из вложенных циклов можно делать через break. Например, «break 2»
Мануал надо читать внимательно. Спасибо :), я через триггер это делал.

anton-ikonnikov.moikrug.ru (anton-ikonnikov.moikrug.ru)
19 мая 2009, 13:24, ответ предназначен bolk (bolknote.ru):

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

david-m.livejournal.com (david-m.livejournal.com)
19 мая 2009, 13:30, ответ предназначен bolk (bolknote.ru):

$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();

bolk (bolknote.ru)
19 мая 2009, 15:10, ответ предназначен david-m.livejournal.com:

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

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

zencd.livejournal.com (zencd.livejournal.com)
19 мая 2009, 17:48

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

bolk (bolknote.ru)
19 мая 2009, 21:10, ответ предназначен anton-ikonnikov.moikrug.ru:

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

decil.livejournal.com (decil.livejournal.com)
20 мая 2009, 00:22

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

  somethingelse();
}

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

decil.livejournal.com (decil.livejournal.com)
20 мая 2009, 00:25

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

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

decil.livejournal.com (decil.livejournal.com)
20 мая 2009, 02:34

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

bolk (bolknote.ru)
20 мая 2009, 09:40, ответ предназначен decil.livejournal.com:

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

anton-ikonnikov.moikrug.ru (anton-ikonnikov.moikrug.ru)
20 мая 2009, 11:11, ответ предназначен bolk (bolknote.ru):

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

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

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

bolk (bolknote.ru)
20 мая 2009, 12:23, ответ предназначен anton-ikonnikov.moikrug.ru:

Можно :)

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

Sas (ugh.ru)
20 мая 2009, 18:23, ответ предназначен decil.livejournal.com:

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

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

Sas (ugh.ru)
20 мая 2009, 18:29

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

bolk (bolknote.ru)
20 мая 2009, 21:18, ответ предназначен Sas (ugh.ru):

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

Sas (ugh.ru)
20 мая 2009, 21:29, ответ предназначен bolk (bolknote.ru):

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

masterspammer.livejournal.com (masterspammer.livejournal.com)
21 мая 2009, 09:54

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

bolk (bolknote.ru)
21 мая 2009, 10:28, ответ предназначен Sas (ugh.ru):

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

bolk (bolknote.ru)
21 мая 2009, 10:28, ответ предназначен masterspammer.livejournal.com:

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

masterspammer.livejournal.com (masterspammer.livejournal.com)
21 мая 2009, 11:00, ответ предназначен bolk (bolknote.ru):

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

bolk (bolknote.ru)
21 мая 2009, 11:15, ответ предназначен masterspammer.livejournal.com:

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

masterspammer.livejournal.com (masterspammer.livejournal.com)
21 мая 2009, 11:24, ответ предназначен bolk (bolknote.ru):

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

baka.name (baka.name)
21 мая 2009, 12:18

А потом удаление цикла вынуждало менять break во вложенном цикле, что вообще-то достаточно неочевидно.
В Perl оно мне больше нравится - блок (цикл) можно пометить меткой, а потом где-то внутри - сказать "last эта_метка" - независимо от уровня вложенности.

masterspammer.livejournal.com (masterspammer.livejournal.com)
21 мая 2009, 12:45, ответ предназначен baka.name:

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

bolk (bolknote.ru)
21 мая 2009, 13:15, ответ предназначен masterspammer.livejournal.com:

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

hshhhhh.name (hshhhhh.name)
25 мая 2009, 12:19, ответ предназначен bolk (bolknote.ru):

Ну а что такого? В Си есть, в Perl есть, почему бы в PHP ему не быть? Я даже знаю случаи, когда бы я использовал goto.
http://bolknote.ru/2008/04/03/~1655#25

he-he

bolk (bolknote.ru)
25 мая 2009, 13:54, ответ предназначен hshhhhh.name:

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

shmatrix.livejournal.com (shmatrix.livejournal.com)
28 мая 2009, 14:46

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

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

bolk (bolknote.ru)
28 мая 2009, 18:23, ответ предназначен shmatrix.livejournal.com:

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

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)