(no subject)
Wednesday, April 14th, 2010 12:45Всё-таки PHP — загадочный язык.
Поведение test3() и test4() я понимаю. Знаете, что меня всегда удивляло? Не могу понять, почему test2() всё-таки выполняется. Мистика!
Сначала я думал, что объявления классов и функций происходит в два этапа — сначала «безусловное» при разборе кода, а потом «условное» в runtime. Сейчас я подозреваю, что всё проще: определение ф-ции становится видимым при входе в тот блок, где они объявлены.
P.S. Эй,
bo_dun, ты это куда пропал?!
<?php
function test1() { echo '<p>Hello, world! (1)</p>'; }
test1();
test2();
function test2() { echo '<p>Hello, world! (2)</p>'; }
if( TRUE ) { function test3() { echo '<p>Hello, world! (3)</p>'; } }
test3();
test4();
if( TRUE ) { function test4() { echo '<p>Hello, world! (4)</p>'; } }
// Hello, world! (1)
// Hello, world! (2)
// Hello, world! (3)
// Fatal error: Call to undefined function test4() Поведение test3() и test4() я понимаю. Знаете, что меня всегда удивляло? Не могу понять, почему test2() всё-таки выполняется. Мистика!
Сначала я думал, что объявления классов и функций происходит в два этапа — сначала «безусловное» при разборе кода, а потом «условное» в runtime. Сейчас я подозреваю, что всё проще: определение ф-ции становится видимым при входе в тот блок, где они объявлены.
P.S. Эй,

no subject
Date: Wednesday, April 14th, 2010 10:01 am (UTC)2 - вполне нормально при как минимум двухпроходной компиляции.
Для интерпретируемых языков - аналогично, но подробности я не помню.
такой же как posix shell
Date: Wednesday, April 14th, 2010 10:38 am (UTC)$ cat test.sh
#!/bin/sh
function test2() {
echo "hello 2"
}
test2
if /bin/true; then function test3() {
echo "hello 3"
} fi
test3
test4
if /bin/true; then function test4() {
echo "hello 4"
} fi
if /bin/false; then function test5() {
echo "hello 5"
} fi
test5
[altlinux@localhost ~]$ ./test.sh
hello 2
hello 3
./test.sh: line 14: test4: команда не найдена
./test.sh: line 22: test5: команда не найдена
нифига подобного
Date: Wednesday, April 14th, 2010 10:46 am (UTC)% cat test.sh ~ #!/bin/sh test1() { echo "hello 1" } test1 test2 test2() { echo "hello 2" } if /bin/true then test3() { echo "hello 3" } fi test3 % ./test.sh hello 1 ./test.sh: 8: test2: not found hello 3no subject
Date: Wednesday, April 14th, 2010 10:47 am (UTC)no subject
Date: Wednesday, April 14th, 2010 10:50 am (UTC)no subject
Date: Wednesday, April 14th, 2010 12:17 pm (UTC)no subject
Date: Wednesday, April 14th, 2010 12:21 pm (UTC)no subject
Date: Wednesday, April 14th, 2010 12:39 pm (UTC)no subject
Date: Wednesday, April 14th, 2010 01:17 pm (UTC)