November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Friday, February 19th, 2010 12:09 pm

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

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

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

Friday, February 19th, 2010 11:16 am (UTC)
да чувак новенький похоже.
php непрост, да :)
Friday, February 19th, 2010 11:20 am (UTC)
Человека ожидал увидеть нормальный язык. А не сошлось.
Friday, February 19th, 2010 11:20 am (UTC)
ну да, новенький. но вместо того, чтобы почитать документацию (http://php.net/manual/en/language.variables.scope.php), в которой английским по белому написано, что отдельная область видимости есть только у функций, а не у любых блоков, он сразу посчитал это багом
Friday, February 19th, 2010 11:23 am (UTC)
а немножко подумать - не судьба была, видать. не может каждый блок вводить новую область видимости для _всех_ переменных. этого ни в одном языке нет
Friday, February 19th, 2010 11:28 am (UTC)
ты такой серьезный, серьезный. ну кто читает мануалы про области видимости :)
а говорить global в функциях? это тоже с непривычки удивляет.
Friday, February 19th, 2010 11:30 am (UTC)
Ему дали почитать про области видимости:

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

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

(c) (http://community.livejournal.com/ru_php/1474050.html?thread=21839362#t21839362)
Friday, February 19th, 2010 11:33 am (UTC)
нормальные люди, не читавшие мануалов, и наткнувшиеся на нелогичное с их точки зрения поведение, либо таки прочитают мануалы, либо спросят "а почему так?", но не будут с апломбом заявлять "да это баг!"
Friday, February 19th, 2010 11:36 am (UTC)
савсэм ничего нэ сказано, да..

читать, оказывается, тоже можно по-разному.. кто бы мог подумать
Friday, February 19th, 2010 11:46 am (UTC)
например в перле:

{
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=

такого поведения автор и ожидал, как я понимаю.
Friday, February 19th, 2010 11:47 am (UTC)
Опасная штука, этот ваш пхп.
Он ведь в него даже не углубился, только один раз слегка коснулся.
Friday, February 19th, 2010 11:48 am (UTC)
угу, это если явно объявлять в каждом блоке my $a.
а если не объявлять, то он будет себя вести точно так же, как php - будет одна общая переменная.
Friday, February 19th, 2010 11:48 am (UTC)
вот этим он и опасен: низкий порог вхождения..
Friday, February 19th, 2010 11:49 am (UTC)
Почему не может? Вот вопрос с тем, надо ли давать переопределять уже определенные переменные - неоднозначный. Хотя уж точно не надо делать это неявно.

Грубо говоря:
{
int i = 1;
{
i = 2; // явно просто присваивание переменной из родительской области видимости
int i = 3; // а вот здесь чего делаем? я бы ошибку выбрасывал, а то потом в коде каша будет.
}
}
Friday, February 19th, 2010 11:50 am (UTC)
это я к тому, что новая область видимости срабатывает не для _всех_ переменных, а только для тех, которые были явно объявлены внутри блока
Friday, February 19th, 2010 11:53 am (UTC)
ну нельзя в php явно объявить переменную, да :(
Friday, February 19th, 2010 11:55 am (UTC)
и потому авторы языка поступили логично: сделали отдельную область видимости только для одного типа блоков: для функций.
Friday, February 19th, 2010 11:56 am (UTC)
для c++ такая конструкция валидна. внутри блока до объявления видна внешняя переменная, после объявления до конца блока - внутренняя.

другой вопрос, что за такой стиль программирования надо убивать на месте, независимо от языка
Friday, February 19th, 2010 11:56 am (UTC)
Ну вот поэтому я склоняюсь к мысли, что компилятор должен взять в руки линейку и бить ей за такое по рукам.
Friday, February 19th, 2010 12:00 pm (UTC)
g++ -Wall даже не поперхнулся на этом примере.
я бы на его месте выдал предупреждение, что так делать не нужно, хотя, конечно, если очень хочется, то можно
Friday, February 19th, 2010 12:01 pm (UTC)
логично, согласен.
Friday, February 19th, 2010 07:08 pm (UTC)
Там мозг был разжыжен сугубо до, судя по всему. Иметь твердую уверенность, что операторные скобки ограничивают область видимости переменной всегда и везде -- это, наверное, надо было на чем-то паскалеобразном что ли учиться...
Friday, February 19th, 2010 07:09 pm (UTC)
+1.
Friday, February 19th, 2010 07:11 pm (UTC)
ограничения видимости блоком всегда и для всех переменных нет ни в одном известном мне языке. в том числе, в паскале. и я не могу придумать, зачем это могло бы понадобиться
Friday, February 19th, 2010 07:45 pm (UTC)
Ну да. Но где-то же товарищ это видел... И видел долго, судя по убежденности, ведь даже исходники его не убедили 8)
Friday, February 19th, 2010 08:00 pm (UTC)
Нет, ну ведь реально же bug. Language design bug.
Saturday, February 20th, 2010 12:13 am (UTC)
в жабе ограничивают
Saturday, February 20th, 2010 12:17 am (UTC)
ага, а в ц можно прыгнуть внутрь операторных скобок, что весьма помогает в компиляции и оптимищации этого говна.
Saturday, February 20th, 2010 09:25 am (UTC)
да такие люди везде, не только в программировании

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

боюсь, что это теперь такая норма, и это мы - ненормальные
Saturday, February 20th, 2010 10:19 am (UTC)
ну если только в самом факте появления этого языка :)
Saturday, February 20th, 2010 10:21 am (UTC)
_всегда и везде_ ограничивают? неправда. ограничивают для перемнных, объявленных внутри этого блока. но это и во всех остальных языках так же
Saturday, February 20th, 2010 10:22 am (UTC)
тут речь не про удобство компилятора, а про логическое поведение языка