(no subject)

Wednesday, April 14th, 2010 12:45
kastaneda: (Default)
[personal profile] kastaneda
Всё-таки PHP — загадочный язык.

<?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. Эй, [livejournal.com profile] bo_dun, ты это куда пропал?!

Date: Wednesday, April 14th, 2010 10:01 am (UTC)
From: [identity profile] pzrk.livejournal.com
3 и 4 в случае нормальных компилируемых языков обрабатываются препроцессором.
2 - вполне нормально при как минимум двухпроходной компиляции.

Для интерпретируемых языков - аналогично, но подробности я не помню.

такой же как posix shell

Date: Wednesday, April 14th, 2010 10:38 am (UTC)
From: [identity profile] gns-ua.livejournal.com
Волга впадает в каспийское море. Смерть неизбежна.

$ 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: команда не найдена
Edited Date: Wednesday, April 14th, 2010 10:39 am (UTC)

Date: Wednesday, April 14th, 2010 10:50 am (UTC)
From: [identity profile] gns-ua.livejournal.com
хм, верно. наверное потому что sh принципиально потоковый, а php делает предварительный проход.

Date: Wednesday, April 14th, 2010 12:17 pm (UTC)
From: [identity profile] kaldazar.livejournal.com
т.е. разница между 2 и 4 в том что php в первую очередь проверяет определения функций, а во вторую - условия типа if?

Date: Wednesday, April 14th, 2010 12:39 pm (UTC)
From: [identity profile] kaldazar.livejournal.com
вот вам и Paamayim Nekudotayim....

September 2025

M T W T F S S
12345 67
891011121314
15161718192021
22232425262728
2930