Артём Талипов ([info]artem_talipov) wrote in [info]ru_php,

роль фигурных скобочек, для выделения области видимости. (обсуждение для интересующихся тонкостями)

Здравствуйте!

ситуация


Не могу понять, написал простейший скрипт, для проверки и просто в шоке!
Область видимости накладывается, а деструктор не срабатывает вообще!
В мане только про "::" есть.



{
// создать переменную $a и проинициализировать её числом 1
$a = 1;
echo$a; // конечно же 1

{
// создать переменную $a и проинициализировать её числом 2
$a = 2;
echo$a; // конечно же 2
}
echo$a; // неожиданно 2
}

// проверить несуществующую переменную $a
if( isset( $a ))
var_dump( $a );
else
print "ok";


Мой чудик сказал "int 2"!

Естественно я ожидал такого же поведения, как и у других языков, но фигурные скобочки игнорируются. И это меня удивило.

вопрос


И вот это считается нормальным?

Не помню на счёт старых версий, но имхо надо писать bagreport.

заключение


Или... Похоже что это недокументированная фича языка. Наверное разработчики поленились. И ошибка превратилась в такое вот...
Ну да не мне их судить.

дополнение


Господа, судари, товарищи и пр честной люд, все кто не догадался, что я уже давно впёр в тему, хочу вам сообщить удивительную новость. Я впёр!

Если у вас есть желание поругатся или прокоментировать, то хотябы не повторяйтесь. Я никого ни на что не собирался провоцировать. Ни ковырять сорцы, ни сравнивать языки или мои умственные способности.


  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    Your reply will be screened

    Your IP address will be recorded 

  • 106 comments

[info]nekufa

February 19 2010, 06:35:43 UTC 2 years ago

По-моему, блок {} и не ограничивает область видимости.
Вероятно, Вы что-то путаете.

[info]artem_talipov

February 19 2010, 06:56:22 UTC 2 years ago

Это как раз таки основная роль фигурных скобочек!
Брать область и делать новый слой.
Ну и заодно, группировать инструкции, как одну.

Например скрипт

{
$a = 1;
{
$a = 2;
var_dump( $a );
}
var_dump( $a );
}
if( !isset( $a )) var_dump( $a );


Должен был вывести
int 2
int 1

Тоесть я же явным образом создаю две разных переменных!

[info]sir_serge

February 19 2010, 07:00:30 UTC 2 years ago

насколько я помню, в этом вашем php область видимости распространяется в пределах ()функции () объекта

[info]sir_serge

2 years ago

[info]graymur

2 years ago

[info]graymur

2 years ago

[info]graymur

2 years ago

[info]graymur

2 years ago

[info]sir_serge

2 years ago

[info]mr_owner

February 19 2010, 06:55:58 UTC 2 years ago

Пятница?

[info]artem_talipov

February 19 2010, 07:00:35 UTC 2 years ago

Да кто его знает.
В понедельник могу попробовать...
Или можно даже под никсами...
Опять наверное виндовая версия глючит.

[info]sir_serge

February 19 2010, 06:57:19 UTC 2 years ago

а где здесь деструктор-то?

[info]artem_talipov

February 19 2010, 06:58:52 UTC 2 years ago

Встроенный деструктор переменной, который должен её разрушить.

[info]sir_serge

February 19 2010, 07:02:25 UTC 2 years ago

Это же не объект. Посему нету у нее никакого деструктора.

[info]sir_serge

2 years ago

[info]nickinuse

2 years ago

[info]wild_vampir

February 19 2010, 07:24:13 UTC 2 years ago

т.е. вы считаете что конструкция вида
$a = 1
if ($a>0)
{
$a = 2;
$x = 10;
}
echo $a;
должна вывести 1?

[info]artem_talipov

February 19 2010, 07:33:18 UTC 2 years ago

Конечно же!

Так же как и

$i = 666;
for( $i = 0; $i < 100; $i++ )
{
...
}

echo $i;

Должна вывести 666.

Это же очевидно. Классический случай.

[info]artem_talipov

February 19 2010, 07:35:03 UTC 2 years ago

Ой! Нет конечно же!
Тут переменная заранее объявлена.
Так что будет именно она использоватся.

[info]sir_serge

2 years ago

[info]zerkms

2 years ago

[info]zerkms

2 years ago

[info]zerkms

2 years ago

[info]zerkms

2 years ago

[info]zerkms

2 years ago

[info]zerkms

2 years ago

[info]sir_serge

2 years ago

[info]sir_serge

2 years ago

[info]sir_serge

2 years ago

[info]zerkms

2 years ago

[info]zerkms

2 years ago

[info]exbe

2 years ago

[info]dil

February 19 2010, 07:40:23 UTC 2 years ago

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

[info]sir_serge

2 years ago

[info]kean

2 years ago

[info]dil

2 years ago

[info]dil

2 years ago

[info]sir_serge

February 19 2010, 07:41:50 UTC 2 years ago

int i = 666;
for(int i = 0; i < 100; $i++ )
{
...
}

- во всех нормальных компиляторах это завершится fatal error "принудительное переопределение типа уже определённой переменной"

[info]dil

2 years ago

[info]wild_vampir

February 19 2010, 07:44:47 UTC 2 years ago

Перечислите мне языки программирования которые следуют вашей логике?...

[info]sir_serge

2 years ago

[info]sir_serge

2 years ago

[info]a_k_d

2 years ago

[info]sir_serge

2 years ago

[info]sir_serge

2 years ago

[info]leotsarev

2 years ago

[info]a_k_d

2 years ago

[info]a_k_d

2 years ago

[info]nuclight

2 years ago

[info]zupernintendo

February 19 2010, 10:45:33 UTC 2 years ago

Какие еще области видимости в php, вы бредите.

http://ru2.php.net/manual/en/language.variables.scope.php

[info]slonik_v_domene

February 19 2010, 10:51:28 UTC 2 years ago

О-ло-ло, а вот и пятница.

А ты - ламер.

Deleted comment

[info]zupernintendo

February 19 2010, 13:49:05 UTC 2 years ago

возможно зарезервировано на будущее.
или просто парсер так позволяет писать.

[info]nickinuse

February 19 2010, 16:06:41 UTC 2 years ago

некая часть variable variables, типа
$a=2;
echo ${'a'};
и чтобы разобраться со стрелочками в инстанциях, а ля
class ...
var $something='x'
var $x=2;
echo $this->{$this->something} == 2

[info]slonik_v_domene

February 19 2010, 16:06:46 UTC 2 years ago

Для того, чтобы отметить scope. Очень полезно, правда.

[info]nickinuse

February 19 2010, 16:13:10 UTC 2 years ago

о, я понял. вы наверное думаете что "{}" в пхп автоматом создаёт хеш, типа как яваскприпт/руби/тд со всякими {x:2,z:3}? хрена с два. вместо хешов приходится постоянно писать array('x'=>2,'z'=>3) или extend-ить stdClass, почему оно так, читайте в группах дискуссий разработчиков

[info]artem_talipov

February 19 2010, 18:24:20 UTC 2 years ago

Ну, я пролистав когда-то php мануал, а потом долгое время поработав на C++, ожидал от php такого же поведения с областью видимости, как и C++. О хэшах и прочем и не задумывался даже. Я конечно представлял, как оно устроено, в плюсах, с этим много ковырялся. Ну да хэши, это не так важно.

Просто php очень сильно отличаеться от C++.



Вот например момент
$obj->method();
здесь оператор "->" это обращение к члену, по указателю на объект.
Когда, оператор ".", это обращение к члену объекта.
Да и оператор "new", очень толсто намекает, на то, что создаётся именно указатель.

$obj = new someclass();

А если бы создавался просто объект, то надо было бы писать, к примеру так:
$obj = someclass();

Ну да ладно, вообщем-то я понимаю, указатель на объект, удобнее чем, просто объект.

Например конструкция вида:
throw new exception( "page not found", 404 );
Кажеться просто дикой и неправильной... Но в php по другому объект не создать. Да и где-то там должен быть сборщик мусора, так что можно не бояться утечки памяти.

И вообще, это всё кажется диковатым. указатель ведёт себя как объект, а объект как указатель, причём не понятно даже, кем они по сути являются.

Не помню точно, в каком-то языке видел конструкции
class someclass1 { ... };
и
class_ref someclass2 { ... };

Соответственно
$obj1 = new someclass1();
new создаёт и возвращает объект, а
$obj2 = new someclass2();
new создаёт объект и возвращает указатель на него.


Занятная схемка. Она мне очень понравилась.

[info]exbe

February 19 2010, 19:38:40 UTC 2 years ago

А почему ви спгавниваете эти языки?

Вы удивлены наличием разницы между слабо типизированным и сильно типизированным ЯП?
Лично мое ощущение: кто-то сказал вам, что php = C.
А это, вот ужас, не так.

[info]mr_owner

2 years ago

[info]mr_owner

2 years ago

[info]graymur

2 years ago

[info]exbe

2 years ago

[info]exbe

2 years ago

[info]nolar

February 19 2010, 18:06:54 UTC 2 years ago

Вы жжоте :)

[info]sontar

February 20 2010, 09:55:21 UTC 2 years ago

лучший пятничный вброс за последнее время
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…