ситуация
Не могу понять, написал простейший скрипт, для проверки и просто в шоке!
Область видимости накладывается, а деструктор не срабатывает вообще!
В мане только про "::" есть.
{
// создать переменную $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.
заключение
Или... Похоже что это недокументированная фича языка. Наверное разработчики поленились. И ошибка превратилась в такое вот...
Ну да не мне их судить.
дополнение
Господа, судари, товарищи и пр честной люд, все кто не догадался, что я уже давно впёр в тему, хочу вам сообщить удивительную новость. Я впёр!
Если у вас есть желание поругатся или прокоментировать, то хотябы не повторяйтесь. Я никого ни на что не собирался провоцировать. Ни ковырять сорцы, ни сравнивать языки или мои умственные способности.
February 19 2010, 06:35:43 UTC 2 years ago
Вероятно, Вы что-то путаете.
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
Тоесть я же явным образом создаю две разных переменных!
February 19 2010, 07:00:30 UTC 2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
February 19 2010, 06:55:58 UTC 2 years ago
February 19 2010, 07:00:35 UTC 2 years ago
В понедельник могу попробовать...
Или можно даже под никсами...
Опять наверное виндовая версия глючит.
February 19 2010, 06:57:19 UTC 2 years ago
February 19 2010, 06:58:52 UTC 2 years ago
February 19 2010, 07:02:25 UTC 2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
February 19 2010, 07:24:13 UTC 2 years ago
$a = 1
if ($a>0)
{
$a = 2;
$x = 10;
}
echo $a;
должна вывести 1?
February 19 2010, 07:33:18 UTC 2 years ago
Так же как и
$i = 666;
for( $i = 0; $i < 100; $i++ )
{
...
}
echo $i;
Должна вывести 666.
Это же очевидно. Классический случай.
February 19 2010, 07:35:03 UTC 2 years ago
Тут переменная заранее объявлена.
Так что будет именно она использоватся.
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
February 19 2010, 07:40:23 UTC 2 years ago
я фигею, дорогая редакция
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
February 19 2010, 07:41:50 UTC 2 years ago
for(int i = 0; i < 100; $i++ )
{
...
}
- во всех нормальных компиляторах это завершится fatal error "принудительное переопределение типа уже определённой переменной"
2 years ago
February 19 2010, 07:44:47 UTC 2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
February 19 2010, 10:45:33 UTC 2 years ago
http://ru2.php.net/manual/en/language.v
February 19 2010, 10:51:28 UTC 2 years ago
А ты - ламер.
Deleted comment
February 19 2010, 13:49:05 UTC 2 years ago
или просто парсер так позволяет писать.
February 19 2010, 16:06:41 UTC 2 years ago
$a=2;
echo ${'a'};
и чтобы разобраться со стрелочками в инстанциях, а ля
class ...
var $something='x'
var $x=2;
echo $this->{$this->something} == 2
February 19 2010, 16:06:46 UTC 2 years ago
February 19 2010, 16:13:10 UTC 2 years ago
February 19 2010, 18:24:20 UTC 2 years ago
Просто 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 создаёт объект и возвращает указатель на него.
Занятная схемка. Она мне очень понравилась.
February 19 2010, 19:38:40 UTC 2 years ago
А почему ви спгавниваете эти языки?
Вы удивлены наличием разницы между слабо типизированным и сильно типизированным ЯП?Лично мое ощущение: кто-то сказал вам, что php = C.
А это, вот ужас, не так.
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
February 19 2010, 18:06:54 UTC 2 years ago
February 20 2010, 09:55:21 UTC 2 years ago