dil: (Default)
dil ([personal profile] dil) wrote2010-02-19 12:09 pm

как PHP разжижает моск

наглядный пример: жуткий глюк с областями видимости

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

[identity profile] dkfl.livejournal.com 2010-02-19 11:16 am (UTC)(link)
да чувак новенький похоже.
php непрост, да :)

[identity profile] dil.livejournal.com 2010-02-19 11:20 am (UTC)(link)
ну да, новенький. но вместо того, чтобы почитать документацию (http://php.net/manual/en/language.variables.scope.php), в которой английским по белому написано, что отдельная область видимости есть только у функций, а не у любых блоков, он сразу посчитал это багом

[identity profile] dkfl.livejournal.com 2010-02-19 11:28 am (UTC)(link)
ты такой серьезный, серьезный. ну кто читает мануалы про области видимости :)
а говорить global в функциях? это тоже с непривычки удивляет.

[identity profile] l2tp.livejournal.com 2010-02-19 11:30 am (UTC)(link)
Ему дали почитать про области видимости:

Кстати, по вашей ссылке, ничего не сказано, про то, что области видимости накладываются или совмещаются.

Там про функции, про глобальные и статические переменные.

(c) (http://community.livejournal.com/ru_php/1474050.html?thread=21839362#t21839362)

[identity profile] dil.livejournal.com 2010-02-19 11:36 am (UTC)(link)
савсэм ничего нэ сказано, да..

читать, оказывается, тоже можно по-разному.. кто бы мог подумать

[identity profile] dil.livejournal.com 2010-02-19 11:33 am (UTC)(link)
нормальные люди, не читавшие мануалов, и наткнувшиеся на нелогичное с их точки зрения поведение, либо таки прочитают мануалы, либо спросят "а почему так?", но не будут с апломбом заявлять "да это баг!"

облосте видемосте

[identity profile] cottidianus.livejournal.com 2010-02-20 02:33 am (UTC)(link)
ппкс
llivejo: (Default)

[personal profile] llivejo 2010-02-20 09:25 am (UTC)(link)
да такие люди везде, не только в программировании

(факт) "не смог подключиться к серверу" -> (утверждение) "ваш сервер снова лежит!"

боюсь, что это теперь такая норма, и это мы - ненормальные

[identity profile] dbg.livejournal.com 2010-02-19 08:00 pm (UTC)(link)
Нет, ну ведь реально же bug. Language design bug.

[identity profile] dil.livejournal.com 2010-02-20 10:19 am (UTC)(link)
ну если только в самом факте появления этого языка :)

[identity profile] 1master.livejournal.com 2010-02-19 11:20 am (UTC)(link)
Человека ожидал увидеть нормальный язык. А не сошлось.

[identity profile] dil.livejournal.com 2010-02-19 11:23 am (UTC)(link)
а немножко подумать - не судьба была, видать. не может каждый блок вводить новую область видимости для _всех_ переменных. этого ни в одном языке нет

[identity profile] starcat13.livejournal.com 2010-02-19 11:46 am (UTC)(link)
например в перле:

{
my $a=1;
print("1. a=$a\n");
{
my $a=2;
print("2. a=$a\n");
}
print("3. a=$a\n");
}
print("4. a=$a\n");

вывод:
1. a=1
2. a=2
3. a=1
4. a=

такого поведения автор и ожидал, как я понимаю.

[identity profile] dil.livejournal.com 2010-02-19 11:48 am (UTC)(link)
угу, это если явно объявлять в каждом блоке my $a.
а если не объявлять, то он будет себя вести точно так же, как php - будет одна общая переменная.

[identity profile] starcat13.livejournal.com 2010-02-19 11:53 am (UTC)(link)
ну нельзя в php явно объявить переменную, да :(

[identity profile] dil.livejournal.com 2010-02-19 11:55 am (UTC)(link)
и потому авторы языка поступили логично: сделали отдельную область видимости только для одного типа блоков: для функций.

[identity profile] starcat13.livejournal.com 2010-02-19 12:01 pm (UTC)(link)
логично, согласен.

[identity profile] dil.livejournal.com 2010-02-19 11:50 am (UTC)(link)
это я к тому, что новая область видимости срабатывает не для _всех_ переменных, а только для тех, которые были явно объявлены внутри блока

[identity profile] 1master.livejournal.com 2010-02-19 11:49 am (UTC)(link)
Почему не может? Вот вопрос с тем, надо ли давать переопределять уже определенные переменные - неоднозначный. Хотя уж точно не надо делать это неявно.

Грубо говоря:
{
int i = 1;
{
i = 2; // явно просто присваивание переменной из родительской области видимости
int i = 3; // а вот здесь чего делаем? я бы ошибку выбрасывал, а то потом в коде каша будет.
}
}
(deleted comment)

[identity profile] 1master.livejournal.com 2010-02-19 11:56 am (UTC)(link)
Ну вот поэтому я склоняюсь к мысли, что компилятор должен взять в руки линейку и бить ей за такое по рукам.

[identity profile] dil.livejournal.com 2010-02-19 12:00 pm (UTC)(link)
g++ -Wall даже не поперхнулся на этом примере.
я бы на его месте выдал предупреждение, что так делать не нужно, хотя, конечно, если очень хочется, то можно

[identity profile] dil.livejournal.com 2010-02-19 11:56 am (UTC)(link)
для c++ такая конструкция валидна. внутри блока до объявления видна внешняя переменная, после объявления до конца блока - внутренняя.

другой вопрос, что за такой стиль программирования надо убивать на месте, независимо от языка

[identity profile] pcmag-ru.livejournal.com 2010-02-19 07:09 pm (UTC)(link)
+1.

[identity profile] lazyboa.livejournal.com 2010-02-19 11:47 am (UTC)(link)
Опасная штука, этот ваш пхп.
Он ведь в него даже не углубился, только один раз слегка коснулся.

[identity profile] dil.livejournal.com 2010-02-19 11:48 am (UTC)(link)
вот этим он и опасен: низкий порог вхождения..

[identity profile] pcmag-ru.livejournal.com 2010-02-19 07:08 pm (UTC)(link)
Там мозг был разжыжен сугубо до, судя по всему. Иметь твердую уверенность, что операторные скобки ограничивают область видимости переменной всегда и везде -- это, наверное, надо было на чем-то паскалеобразном что ли учиться...

[identity profile] dil.livejournal.com 2010-02-19 07:11 pm (UTC)(link)
ограничения видимости блоком всегда и для всех переменных нет ни в одном известном мне языке. в том числе, в паскале. и я не могу придумать, зачем это могло бы понадобиться

[identity profile] pcmag-ru.livejournal.com 2010-02-19 07:45 pm (UTC)(link)
Ну да. Но где-то же товарищ это видел... И видел долго, судя по убежденности, ведь даже исходники его не убедили 8)

[identity profile] http://users.livejournal.com/_windwalker_/ 2010-02-20 12:13 am (UTC)(link)
в жабе ограничивают

[identity profile] dil.livejournal.com 2010-02-20 10:21 am (UTC)(link)
_всегда и везде_ ограничивают? неправда. ограничивают для перемнных, объявленных внутри этого блока. но это и во всех остальных языках так же

[identity profile] http://users.livejournal.com/_windwalker_/ 2010-02-20 12:17 am (UTC)(link)
ага, а в ц можно прыгнуть внутрь операторных скобок, что весьма помогает в компиляции и оптимищации этого говна.

[identity profile] dil.livejournal.com 2010-02-20 10:22 am (UTC)(link)
тут речь не про удобство компилятора, а про логическое поведение языка